У мене 20+ років вбудованих систем, переважно 8 і 16 мікросхем. Коротка відповідь на ваше запитання така ж, як і будь-яка інша розробка програмного забезпечення - не оптимізуйте, поки не знаєте, що потрібно, а потім не оптимізуйте, поки не дізнаєтесь, що потрібно для оптимізації. Напишіть код, щоб він був спочатку надійним, читабельним та доступним. Передчасна оптимізація - це стільки ж, якщо не більше, проблеми вбудованих систем
Коли ви програмуєте "не витрачаючи ніяких ресурсів", чи вважаєте ви свій час ресурсом? Якщо ні, то хто платить вам за ваш час, а якщо ніхто, чи маєте ви щось краще? Після вибору, який повинен зробити будь-який вбудований системний дизайнер, це вартість обладнання та вартість інженерного часу. Якщо ви будете перевозити 100 одиниць, використовуйте більший мікроавтобус на 100 000 одиниць, економія $ 1,00 за одиницю - це те саме, що 1 чоловічий рік розробки програмного забезпечення (ігнорування часу на ринок, можливі витрати тощо), на 1 мільйон одиниць, ви починаєте отримуючи рентабельність інвестицій за нав'язливість щодо використання ресурсів, але будьте обережні, оскільки багато вбудованих проектів ніколи не склали позначку в 1 мільйон, тому що вони мали намір продати 1 мільйон (Високі початкові інвестиції з низькою собівартістю виробництва), і вони занепали, перш ніж потрапити туди.
З цього приводу потрібно враховувати речі, про які слід пам'ятати (малі) вбудовані системи, оскільки вони перестануть працювати несподівано, а не просто повільно.
a) Стек - зазвичай у вас лише невеликий розмір стека і часто обмежений розмір кадру стека. Ви повинні знати про те, якою є можливість використання ваших стеків у будь-який час. Будьте попереджені, проблеми зі штабелем викликають деякі найбільш підступні дефекти.
б) Купа - знову ж таки, невеликі розміри купи, тому будьте обережні щодо необґрунтованого розподілу пам'яті. Фрагментація стає проблемою. З цими двома вам потрібно знати, що ви робите, коли ви закінчуєтесь - це не відбувається на великій системі через ОС, що надається підказками. тобто коли malloc повертає NULL, чи перевіряєте ви його і що ви робите. Кожна мальва потребує перевірки та обробника, роздуття коду ?. Як посібник - не використовуйте його, якщо є альтернатива. Більшість малих систем з цих причин не використовують динамічну пам'ять.
в) Обладнання перериває - Ви повинні знати, як з цим вирішуватись безпечно та своєчасно. Вам також потрібно знати, як зробити безпечний код повторного вступу. Наприклад, C-стандартні ліфти, як правило, не приймаються повторно, тому не повинні використовуватися всередині оброблювачів переривань.
г) складання - майже завжди передчасна оптимізація. Щонайменше, невелика кількість (накреслена) потрібна для досягнення чогось, що C просто не може зробити. Як вправу напишіть невеликий метод у складеній вручну складі (з нуля). Зробіть те саме в C. Виміряйте ефективність. Б'юсь об заклад, що C буде швидше, я знаю, що він буде більш читабельним, легкодоступним та розширюваним. Тепер для частини 2 вправи - напишіть корисну програму в збірці та C.
Як ще одну вправу, подивіться, яка частина ядра Linux є асемблером, а потім читайте, параграф нижче про ядро Linux.
Варто знати, як це зробити, можливо, варто було б також володіти мовами для одного або двох загальних мікросхем.
д) "зареєструвати без підпису int змінну_назви", "зареєструвати" є, і завжди було натяком на компілятора, а не на інструкцію, ще на початку 70-х (40 років тому) це мало сенс. У 2012 році це марно натискання клавіш, оскільки компілятори такі розумні, а інструкції з мікросхем настільки складні.
Поверніться до вашого коментаря linux - проблема, яку ви тут маєте, полягає в тому, що ми говоримо не про один мільйон одиниць, а про 100-мільйонні, з вічним життям. Час та інженерні витрати, щоб зробити його максимально оптимальним, варті того часу. Хоча гарний приклад найкращої інженерної практики, для більшості розробників вбудованих систем було б комерційне самогубство таким же педантичним, як цього вимагає ядро Linux.