Разни

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

Автор: Laura McKinney
Дата На Създаване: 4 Април 2021
Дата На Актуализиране: 16 Може 2024
Anonim
Библиотеки для STM32 вопросы абстракции и оптимизации кода. Коллекция STM32Snippets.
Видео: Библиотеки для STM32 вопросы абстракции и оптимизации кода. Коллекция STM32Snippets.

Съдържание

Авторът завърши последния си инженерен проект с микроконтролерите dsPic, придобивайки обширна представа за тези устройства.

Кодът на езика на микроконтролера може да изисква оптимизация в някои разширени приложения. Тази оптимизация на кода се практикува за намаляване на две важни неща:

  1. Размер на кода: Микроконтролерите могат да съхраняват ограничени данни и инструкции поради ограничения размер на RAM паметта си. Следователно кодът трябва да бъде оптимизиран, за да могат наличните инструкции и паметта да се използват по най-ефективния начин.
  2. Кодове за изпълнение на кода: Микроконтролерите са последователни устройства, които изпълняват по една инструкция наведнъж. Всяка инструкция за сглобяване консумира определен брой тактови цикли, за да се изпълни сама. Следователно кодът трябва да бъде оптимизиран, за да гарантира, че той изпълнява необходимата задача за най-малко тактови цикли или инструкции за сглобяване. Колкото по-малко цикли на часовник използва един код, толкова по-бързо той работи. Това означава, че приложенията могат да работят по-бързо, тъй като времето за обработка е сведено до минимум.

Тази статия представя съвети и трикове, които могат да бъдат използвани за намаляване на размера и времето за изпълнение на кода на микроконтролера.


IDE за разработка на MplabX на Microchip ще бъде използвана, за да демонстрира примери, където е подходящо.

Как да се измери експериментално времето за изпълнение на кода

За да получите представа колко време всъщност отнема на вашия код за изпълнение в реално време, трябва да го измервате експериментално. Логическият анализатор може удобно да се използва за измерване на времето за изпълнение на кода и заинтересованите могат да се информират за процеса за това от мен по имейл. Освен това:

  • Някои компилатори имат способността да отчитат цикъла на часовника, който кодът ще консумира.
  • Някои програми за отстраняване на грешки, например ICD 3 от микрочип, могат директно да измерват времето за изпълнение чрез хронометър.

1. Познайте мощността и размера на паметта на вашия микроконтролер

Не винаги тактовата честота (Mhz) дава истинската картина на скоростта на обработка на микроконтролера, по-реалистична мярка е MIPS (мега инструкции в секунда) или броят на инструкциите, които MCU може да изпълни за секунда.

MCU обикновено варират от 60–70 MIPS в категория от висок клас до 20 MIPS 8-битови AVR. Микроконтролерът с висок MIPS вероятно ще бъде по-скъп от устройството от нисък клас, така че тук имате компромис между разходите и скоростта на обработка.


Микроконтролерите имат отделна памет за съхранение на данни и програмен код. Размерът и на двамата може да се намери от листа с данни. Може да ви е необходим MCU с по-голям размер на паметта, ако кодът ви е значително голям.

2. Избор на променливи за оптимизация в размера на кода

Микроконтролерите имат ограничена памет за данни, обикновено варираща от 1 до 4 Kbytes. В този случай е разумно да изберете най-подходящия тип променлива според очаквания диапазон на датата, която се съхранява. Таблицата по-долу обобщава тези променливи:

Обобщение на променливите, използвани в C-езика.

Тип променливаРазмер в байтовеОбхват

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 и резултатът може да бъде деклариран като float или double, изискваната точност.

Изборът на тип данни може да бъде от решаващо значение при деклариране на масиви, съдържащи голям брой елементи.

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 операции като FFT, DFT, конволюция и FIR филтриране.

Използването на DSP двигателя на микроконтролер изисква:

  • В проекта са включени отделни DSP библиотеки.
  • Имената на функциите се различават от стандартната математическа библиотека на C-език. Документацията на тези библиотеки и функции може да бъде получена от съответния уебсайт на производителите.
  • DSP двигателят използва различен тип променлива „частичен“. Научете как да използвате променливи от дробен тип, преди да продължите с функциите на dsp библиотека.

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

6. Работа с прекъсвания

Използвайте прекъсвания за изпълнение на специфични функции като:

  • Четене на ADC стойности.
  • Изпращане и получаване от UART.
  • Актуализиране на регистрите на работния цикъл на ШИМ.
  • CAN или I2C комуникация.

Прекъсванията ще обслужват тези функции бързо в сравнение с изпълнението им в основното тяло чрез извикване на функция или вграден код.

Прекъсванията също ще се задействат само когато е необходимо, докато ако е кодиран в основното тяло, кодът ще се изпълни във всяка итерация на цикъла while (1).

7. Използвайте най-добрите налични компилатори

Компилаторите могат автоматично да приложат някои от обсъдените по-горе оптимизации, докато превеждат кода от C-език на асемблерен език, ако са правилно конфигурирани. Потърсете опции за оптимизиране във вашия компилатор и ако е възможно надстройте до професионални версии на компилаторите, защото те са по-мощни оптимизатори на код.

8. Интелигентно използвайте условни изявления

  • Когато използвате поредица от изрази if-else, първо запазете най-вероятното състояние. По този начин MCU няма да трябва да сканира всички условия, след като намери истинското състояние.
  • Операторът за превключване обикновено е по-бърз, ако е друго.
  • Използвайте вложени оператори if-else вместо серия от изрази. Блокът if-else, съдържащ много изрази, може да бъде разделен на по-малки под-клонове, за да се оптимизира за най-лошото (последното) състояние.

9. Използвайте вградени функции

Функции, които трябва да се използват само веднъж в кода, могат да бъдат декларирани като статични. Това ще накара компилаторът да оптимизира тази функция до вградена функция и следователно няма код за сглобяване да бъде преведен за извикването на функцията.

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

10. Използвайте намалени цикли

Декрементираният цикъл ще генерира по-малко код за сглобяване в сравнение с увеличения цикъл.

Това е така, защото в цикъл на нарастване е необходима инструкция за сравнение, за да се сравни индексът на цикъла с максималната стойност във всеки цикъл, за да се провери дали индексът на цикъла достига максималната стойност. Напротив, в цикъл на декрементиране това сравнение вече не е необходимо, защото декрементираният резултат от индекса на цикъла ще зададе нулевия флаг в SREG, ако достигне нула.

Като се има предвид, че цикълът трябва да се повтори сто пъти, намаляването на една инструкция от цикъла ще избегне изпълнението му сто пъти, така че въздействието вероятно ще бъде по-значително, когато цикълът трябва да повтори много пъти.

Обобщавайки

Тези съвети може да са полезни, но истинското им приложение и сила зависи от уменията на програмиста и командата, която той има върху кода си. Не забравяйте, че размерът на програмата не винаги определя времето за изпълнение, някои инструкции могат да консумират повече цикли на часовника, отколкото другите, така че отново уменията на програмата трябва да изиграят своята роля.

Тази статия е точна и вярна доколкото е известно на автора. Съдържанието е само за информационни или развлекателни цели и не заменя лични съвети или професионални съвети по бизнес, финансови, правни или технически въпроси.

Нашият Съвет

Интересно

3-те най-добри случая за MacBook Pro 15 "с Retina дисплей
Компютри

3-те най-добри случая за MacBook Pro 15 "с Retina дисплей

Страстта на Пол към компютърните технологии започва преди повече от тридесет години. Дълги години той преподава цифрови медийни изследвания във Великобритания.Със семейството ми сме големи фенове на A...
Технология за 3D печат CLIP: Обекти, създадени в течна смола
Разни

Технология за 3D печат CLIP: Обекти, създадени в течна смола

Линда Крамптън дълги години преподаваше наука и информационни технологии на ученици в гимназията. Тя обича да учи за нови технологии.Нов и впечатляващ метод за 3D печат беше представен на конференцият...