Оптимізація
Програмування низького рівня для вбудованих систем сильно відрізняється від програмування для пристроїв загального призначення, таких як комп'ютери та мобільні телефони. Ефективність (з точки зору швидкості та простору) набагато важливіша, оскільки ресурси - це надбавка. Це означає, що найперше, що потрібно зробити, якщо у вас не вистачає місця, - це подивитися, які частини коду ви можете оптимізувати.
Щодо скорочення використання програмного простору (Flash), розмір коду може бути досить важким для оптимізації, якщо ви недосвідчені або якщо ви більше звикли програмувати настільні комп’ютери, які, як правило, не потребують цієї навички. На жаль, не існує підходу «магічної кулі», який би працював у будь-яких ситуаціях, хоча це допомагає, якщо ви серйозно розглядаєте те, що насправді має мати ваш ескіз . Якщо функція не потрібна, вийміть її.
Іноді також корисно визначити, де кілька частин вашого коду однакові (або дуже схожі). Можливо, ви зможете конденсувати їх у багаторазових функціях, які можна викликати з декількох місць. Однак майте на увазі, що іноді спроба зробити код занадто багаторазовим, насправді це робить його більш багатослівним. Це хитрий баланс, щоб досягти практики, яка, як правило, практикується. Витратити деякий час на перегляд того, як зміни коду впливають на вихід компілятора, може допомогти.
Оптимізація даних виконання (SRAM), як правило, трохи простіше, коли ви звикли до цього. Дуже поширеною проблемою для початківців програмістів є використання занадто багато глобальних даних. Все, що оголошено в глобальному масштабі, буде існувати протягом усього життя ескізу, і це не завжди потрібно. Якщо змінна використовується лише в одній функції і їй не потрібно зберігатись між дзвінками, то зробіть її локальною змінною. Якщо значення потрібно розділити між функціями, подумайте, чи можете ви передати його як параметр, а не робити його глобальним. Таким чином, ви будете використовувати SRAM лише для тих змінних, коли вам це потрібно.
Ще одним вбивцею для використання SRAM є обробка тексту (наприклад, використання String
класу). Взагалі кажучи, вам слід уникати операцій String, якщо це можливо. Вони - це масивні качани пам’яті. Наприклад, якщо ви виводите багато тексту в серійний цикл, використовуйте кілька дзвінків, Serial.print()
а не використовуйте рядкове з'єднання. Спробуйте також зменшити кількість рядкових літералів у вашому коді, якщо можливо.
Уникайте рекурсії, якщо це можливо. Кожен раз, коли виконується рекурсивний дзвінок, стек стає глибше. Рефакторинг ваших рекурсивних функцій замість цього буде ітеративним.
Використовувати EEPROM
EEPROM застосовується для тривалого зберігання речей, які змінюються лише зрідка. Якщо вам потрібно скористатися великими списками або пошуковими таблицями фіксованих даних, то заздалегідь подумайте про їх збереження в EEPROM і лише витягніть те, що вам потрібно, коли це необхідно.
Очевидно, що EEPROM досить обмежений за розміром і швидкістю, і має обмежену кількість циклів запису. Це не чудове рішення щодо обмежень даних, але це може бути достатньо, щоб полегшити навантаження на Flash або SRAM. Також цілком можливо інтерфейс з подібними зовнішніми сховищами, такими як SD-карта.
Розширення
Якщо ви вичерпали всі інші варіанти, то розширення може бути можливим. На жаль, розширення Flash-пам'яті для збільшення програмного простору неможливо. Тим НЕ менше, є можливість розширити SRAM. Це означає, що ви, можливо, зможете переробити ескіз для зменшення розміру коду за рахунок збільшення розміру даних.
Отримати більше SRAM насправді досить просто. Один з варіантів - використовувати один або кілька мікросхем 23K256 . Доступ до них здійснюється через SPI, і для їх використання є бібліотека SpiRAM . Тільки стережіться, що вони працюють на 3,3 В, а не на 5 В!
Якщо ви використовуєте Mega, ви також можете отримати екрани розширення SRAM від Lagrangian Point або Rugged Circuits .