Різний

Оптимізація коду в мікроконтролерах

Автор: Laura McKinney
Дата Створення: 4 Квітень 2021
Дата Оновлення: 16 Травень 2024
Anonim
18 способов сократить JavaScript код
Відеоролик: 18 способов сократить JavaScript код

Зміст

Автор завершив свій останній рік інженерного проекту з мікроконтролерами dsPic, отримавши широке розуміння цих пристроїв.

Код мови С мікроконтролера може вимагати оптимізації в певних розширених додатках. Ця оптимізація коду практикується для зменшення двох важливих речей:

  1. Розмір коду: Мікроконтролери можуть зберігати обмежені дані та інструкції через обмежений обсяг оперативної пам'яті. Тому код потрібно оптимізувати, щоб доступні інструкції та пам’ять даних могли бути використані найбільш ефективно.
  2. Час виконання коду: Мікроконтролери - це послідовні пристрої, які виконують по одній інструкції за раз. Кожна інструкція збірки споживає певну кількість тактових циклів, щоб виконати себе. Тому код повинен бути оптимізований для того, щоб він виконував необхідне завдання за мінімальну кількість тактових циклів або інструкцій зі складання. Чим менше тактових частот використовує код, тим швидше він працює. Це означає, що програми можуть працювати швидше, оскільки час обробки зведено до мінімуму.

У цій статті представлені поради та підказки, які можуть бути використані для зменшення розміру та часу виконання коду мікроконтролера.


IDE для розробки MplabX Microchip буде використано для демонстрації прикладів, де це доречно.

Як експериментально виміряти час виконання коду

Щоб отримати уявлення про те, скільки часу насправді потрібно для виконання вашого коду в режимі реального часу, вам потрібно виміряти його експериментально. Логічний аналізатор можна зручно використовувати для вимірювання часу виконання коду, і бажаючі можуть запитати про процес для цього у мене на електронну пошту. Крім цього:

  • Деякі компілятори мають можливість підраховувати тактові цикли, які споживає код.
  • Деякі налагоджувачі, наприклад ICD 3 від мікрочіпа, можуть безпосередньо вимірювати час виконання за допомогою секундоміра.

1. Знати обробну потужність та обсяг пам'яті мікроконтролера

Не завжди тактова частота (МГц) дає справжнє уявлення про швидкість обробки мікроконтролера, більш реалістичним показником є ​​MIPS (мега інструкцій в секунду) або кількість вказівок, які МКУ може виконати за секунду.

Мікроконтролери зазвичай варіюються від 60–70 MIPS в категорії високого класу до 20 MIPS 8-розрядних AVR. Високий мікроконтролер MIPS, швидше за все, буде дорожчим, ніж пристрій низького класу, тому тут у вас є компроміс між вартістю та швидкістю обробки.


Мікроконтролери мають окрему пам’ять для зберігання даних та програмного коду. Розмір обох з них можна дізнатися з таблиці. Якщо ваш код істотно великий, вам може знадобитися MCU з більшим обсягом пам'яті.

2. Вибір змінних для оптимізації розміру коду

Мікроконтролери мають обмежену пам’ять даних, як правило, від 1 до 4 Кбайт. У цьому випадку розумно вибрати найбільш відповідний тип змінної відповідно до очікуваного діапазону дати, що зберігається. У таблиці нижче узагальнено ці змінні:

Короткий зміст змінних, що використовуються в мові С.

Тип змінноїРозмір у байтахДіапазон

bool

1

Тільки 0 або 1

char

1


-128 до 127

інт

2

-32,768 до 32,767

без підпису int

2

Від 0 до 65 535

довго

4

Від -2,147,483,648 до 2,147,483,647

плавати

4

Точність до 6 знаків після коми

подвійний

8

Точність до 15 знаків після коми

довгий подвійний

10

Точність до 19 знаків після коми

Приклад:

  • Якщо потрібно додати дві змінні X і Y, а результат зберегти в Z, але очікується, що значення Z буде вище, ніж 65 535 після додавання, тоді Z можна оголосити довгим, а X і Y можна оголосити як непідписані int, значення X та Y також не передбачаються негативними. Це заощадить 04 байти в пам'яті даних, які в іншому випадку були б використані, якби всі змінні були оголошені як довгі.
  • Потрібно розділити дві змінні X та Y, значення яких, як очікується, будуть у цілих числах, але результат ділення може дати десятковий знак, тоді X та Y можуть бути оголошені int, а результат може бути оголошений з плаваючою чи подвійною залежно від необхідна точність.

Вибір типу даних може мати вирішальне значення при оголошенні масивів, що містять велику кількість елементів.

3. Вибір змінних для оптимізації під час виконання коду

  • Встановлено, що обчислення з плаваючою точкою займають більше часу, ніж обчислення з фіксованою крапкою. Не використовуйте змінну з плаваючою точкою, де десяткове значення не потрібно. Працюйте з цілими числами без знака, де це можливо.
  • Місцевим змінним надають перевагу перед глобальними змінними. Якщо змінна використовується лише у функції, тоді вона повинна бути оголошена в цій функції, оскільки доступ до глобальних змінних відбувається повільніше, ніж локальні змінні.
  • 8-бітний MCU швидше знайде одну байтову змінну швидше, а 16-бітний MCU знайде 2-байтову змінну, простішу для доступу через довжину генерованої адреси.

4. Оптимізація арифметичних операцій

Арифметичні операції можна оптимізувати наступними способами.

  1. Використовуйте пошукові таблиці заздалегідь обчислених значень замість оцінки синуса або будь-якої іншої тригонометричної функції або будь-якої іншої операції, результат якої може бути відомий заздалегідь у коді.
  2. У випадку, якщо таблиця пошуку синусів вже зберігається в пам'яті, косинус може бути обчислений, просуваючи покажчик масиву, еквівалентний 90 градусам.
  3. Серед чотирьох арифметичних операцій поділ і множення займають найбільше часу на обробку, на практиці це може бути в межах сотень мікросекунд або близько того, якщо значення з плаваючою комою.
  4. Використовуйте інструкції щодо зсуву бітів замість ділення та множення. Інструкція 3 зсуву вправо служить для ділення на 23 де як ліва змінна інструкція 1 буде служити множенням на 21.

5. Використовуйте мікроконтролер з підтримкою DSP для інтенсивних розрахунків

Деякі мікроконтролери мають вбудований в їх архітектуру блок обробки DSP, відмінний від звичайного ALU. Цей механізм DSP призначений для виконання арифметичних обчислень дуже швидко за найменшу кількість тактових циклів (у більшості випадків - один раз) швидше, ніж ALU.

Інструкції, які процесор DSP може виконувати швидше, ніж ALU:

  • Інструкції щодо зміщення і обертання бітів.
  • Множення, ділення та інші арифметичні дії.
  • Оцінка синусів та інших тригонометричних функцій.
  • Усі операції DSP, такі як ШПФ, DFT, згортка та фільтрація FIR.

Використання механізму DSP мікроконтролера вимагає, щоб:

  • У проект включені окремі бібліотеки DSP.
  • Назви функцій відрізняються від стандартних математичних бібліотек на мові C. Документацію цих бібліотек та функцій можна отримати на веб-сайті відповідних виробників.
  • У двигуні DSP використовується інший тип змінної "дробовий". Дізнайтеся, як використовувати дробові змінні типу, перш ніж продовжувати функції бібліотеки dsp.

Зверніть увагу, що стандартні функції математичної бібліотеки не будуть викликати механізм DSP, оскільки вони перекладаються в інструкції з монтажу ALU.

6. Робота з перериваннями

Використовуйте переривання для виконання певних функцій, таких як:

  • Зчитування значень АЦП.
  • Надсилання та отримання від UART.
  • Оновлення реєстрів робочого циклу ШІМ.
  • Зв'язок CAN або I2C.

Переривання обслуговуватимуть ці функції швидко порівняно з виконанням їх у основному тексті за допомогою виклику функції або вбудованого коду.

Переривання також запускатимуться лише тоді, коли це потрібно, тоді як, якщо кодується в основному тексті, код буде виконуватися на кожній ітерації циклу while (1).

7. Використовуйте найкращі доступні компілятори

Компілятори можуть автоматично реалізувати деякі з розглянутих вище оптимізацій, перекладаючи код із C-мови на мову збірки, якщо правильно налаштовано. Шукайте варіанти оптимізації у своєму компіляторі та, якщо можливо, переходьте до професійних версій компіляторів, оскільки вони є більш потужними оптимізаторами коду.

8. Використовуйте умовні твердження з розумом

  • При використанні серії операторів if-else спочатку дотримуйтесь найбільш вірогідну умову. Таким чином, MCU не доведеться сканувати всі умови після того, як знайде справжній стан.
  • Заявка на випадок перемикача, як правило, швидша, якщо інакше.
  • Використовуйте вкладені оператори if-else замість ряду операторів. Блок if-else, що має багато операторів, може бути розділений на менші підгалузі, щоб оптимізувати для найгіршого (останнього) стану.

9. Використовуйте вбудовані функції

Функції, які використовуються лише один раз у коді, можуть бути оголошені як статичні. Це змусить компілятор оптимізувати цю функцію до вбудованої функції, а отже, жоден код збірки не буде перекладений для виклику функції.

  • Функцію можна оголосити вбудованою, використовуючи разом із нею ключове слово 'static'.

10. Використовуйте зменшені петлі

Декрементований цикл буде генерувати менше коду збірки порівняно з інкрементованим циклом.

Це пов’язано з тим, що в циклі прирощення потрібна інструкція порівняння для порівняння індексу циклу з максимальним значенням у кожному циклі, щоб перевірити, чи досягає індекс циклу максимальне значення. Навпаки, у циклі зменшення це порівняння більше не потрібно, оскільки зменшений результат індексу циклу встановить нульовий прапор у SREG, якщо він досягне нуля.

Враховуючи, що цикл повинен повторюватись сто разів, зменшення однієї команди з циклу дозволить уникнути його виконання в сто разів, тому вплив, швидше за все, буде більш значним, коли цикл повинен повторюватися багато разів.

Підведенню

Ці поради можуть бути корисними, але їх справжнє застосування та ефективність залежать від вміння програміста та команди, яку він має над своїм кодом. Пам'ятайте, розмір програми не завжди визначає час виконання, деякі інструкції можуть споживати більше тактових циклів, ніж інші, тому знову навички програми повинні зіграти свою роль.

Ця стаття є точною та вірною, наскільки відомо автору. Вміст призначений лише для інформаційних чи розважальних цілей і не замінює особистих порад чи професійних порад у ділових, фінансових, юридичних чи технічних питаннях.

Цікаві Посади

Ми Радимо Бачити

Створіть кнопку в Excel для переходу за гіперпосиланням
Комп'Ютери

Створіть кнопку в Excel для переходу за гіперпосиланням

Джошуа - аспірант U F. Він цікавиться бізнес-технологіями, аналітикою, фінансами та пісною шістьма сигмами.Створення кнопки, яка переведе вас на веб-сторінку, може бути дуже корисним інструментом. Якщ...
Огляд Orangemonkie Foldio360 (вертушка для фотографій продуктів)
Комп'Ютери

Огляд Orangemonkie Foldio360 (вертушка для фотографій продуктів)

Маркус Хаген - 24-річний студент журналістики з Колумбійського університету.Фотографування продуктів не повинно бути складним. Сьогодні вам навіть не потрібна спеціальна камера, щоб отримати хороші ре...