У меня есть более 20 лет встроенных систем, в основном 8 и 16 микро. Краткий ответ на ваш вопрос такой же, как и для любой другой разработки программного обеспечения - не оптимизируйте, пока не узнаете, что вам нужно, и затем не оптимизируйте, пока не узнаете, что нужно оптимизировать. Сначала напишите свой код, чтобы он был надежным, читаемым и обслуживаемым. Преждевременная оптимизация является такой же, если не большей, проблемой во встроенных системах
Когда вы программируете «без потерь ресурсов», считаете ли вы свое время ресурсом? Если нет, кто платит вам за ваше время, и если никто, у вас есть что-нибудь лучше сделать с этим. Однажды выбор, который должен сделать любой разработчик встраиваемых систем, - это стоимость оборудования против стоимости времени разработки. Если вы будете поставлять 100 единиц, использовать более крупный микро, по 100 000 единиц, экономия 1,00 долл. США за единицу равна экономии 1 года на разработку программного обеспечения (без учета времени выхода на рынок, альтернативных издержек и т. Д.), При стоимости 1 миллион единиц. получить окупаемость инвестиций за то, что помешан на использовании ресурсов, но будьте осторожны, потому что многие встраиваемые проекты никогда не делали отметку в 1 миллион, потому что они предназначены для продажи 1 миллиона (Высокие начальные инвестиции с низкими производственными затратами), и обанкротились до того, как они туда попали.
Тем не менее, вещи, которые вы должны учитывать и знать о (небольших) встроенных системах, потому что они остановят его работу неожиданным образом, а не просто заставят его работать медленно.
a) Стек - обычно у вас небольшой размер стека и часто ограниченный размер кадра стека. Вы должны знать о том, каково ваше использование стека во все времена. Имейте в виду, проблемы со стеком вызывают некоторые самые коварные дефекты.
б) Куча - опять же, кучи небольшого размера, поэтому будьте осторожны с необоснованным выделением памяти. Фрагментация становится проблемой. С этими двумя вы должны знать, что вы делаете, когда у вас заканчивается - это не происходит в большой системе из-за подкачки ОС. т.е. когда malloc возвращает NULL, вы проверяете это и что делаете. Каждый просвирник нуждается в проверке и обработчике, раздувании кода? Как руководство - не используйте его, если есть альтернатива. По этим причинам большинство небольших систем не используют динамическую память.
c) Аппаратные прерывания - Вы должны знать, как обрабатывать их безопасно и своевременно. Вы также должны знать, как сделать безопасный повторный ввод кода. Например, стандартные библиотеки C обычно не являются повторно входящими, поэтому их не следует использовать внутри обработчиков прерываний.
г) Сборка - почти всегда преждевременная оптимизация. Максимум небольшое количество (встроенное) необходимо для достижения того, чего С не может сделать. В качестве упражнения напишите небольшой метод ручной сборки (с нуля). Сделайте то же самое в C. Измерьте производительность. Бьюсь об заклад, C будет быстрее, я знаю, что он будет более читабельным, обслуживаемым и расширяемым. Теперь для второй части упражнения - напишите полезную программу на ассемблере и C.
Как еще одно упражнение, посмотрите, какая часть ядра Linux является ассемблером, а затем прочитайте параграф ниже о ядре linux.
Стоит знать, как это сделать, может быть, даже стоит быть знатоком языков для одного или двух общих микро.
e) «register unsigned int variable_name», «register» является и всегда было подсказкой компилятору, а не инструкцией, еще в начале 70-х (40 лет назад) это имело смысл. В 2012 году это пустая трата клавиш, так как компиляторы настолько умны, а инструкции по микросхемам так сложны.
Возвращаясь к вашему комментарию о Linux - проблема, с которой вы здесь столкнулись, заключается в том, что мы говорим не просто о миллионах устройств, мы говорим о сотнях миллионов с временем жизни навсегда. Инженерное время и стоимость, чтобы сделать его настолько оптимальным, насколько это возможно, стоит того. Хотя это хороший пример наилучшей инженерной практики, для большинства разработчиков встроенных систем было бы коммерческим самоубийством быть настолько педантичным, насколько этого требует ядро linux.