Используйте память, доступную только для чтения, чтобы освободить оперативную память RAM. Советы и рекомендации по разработке прошивок

Добавлено 22 сентября 2019 в 17:44

Данная статья даст вам некоторые идеи о том, как максимально эффективно использовать энергонезависимую (часто избыточную) память микроконтроллера (MCU).

Конечно, существуют инженеры, которым регулярно необходима значительная часть памяти программ объемом 16, 32 или даже 64 КБ, предоставляемой 8-разрядными микроконтроллерами. И, конечно, производители не включили бы так много места для кода, если бы разработчики не нуждались в этом.

Что я могу с уверенностью сказать, так это то, что я никогда не чувствовал себя ограниченным количеством памяти программ в микроконтроллере. Я, однако, чувствовал себя ограниченным в объеме памяти данных, и цель данной статьи – объяснить, как вы можете использовать лишнюю память программ для освобождения некоторого количества оперативной памяти.

Что такое память, доступная только для чтения? (она же память программ, она же кодовая память)

Память микроконтроллера может быть разделена на категории по электрическим характеристикам (например, энергозависимая и энергонезависимая) и по архитектурным факторам, таким как различие у 8051 между внутренней памятью данных и «внешней» памятью данных (внешняя RAM память, что несколько запутывает, может быть включена в чип). Например:

Структура памяти MSP430. Диаграмма предоставлена Texas Instruments.
Структура памяти MSP430. Диаграмма предоставлена Texas Instruments.

Кодовая память, память программ или память, доступная только для чтения, (read-only memory, ROM) – это память, где хранятся инструкции программы. Мы также называем ее «флеш-памятью», потому что сейчас кодовая память реализована с использованием технологии энергонезависимого хранения, известной как флеш-память.

Важно понимать, что память микроконтроллера, доступная только для чтения, (read-only memory, ROM) – это память не только для чтения. Прежде всего, если бы она была действительно «только для чтения», она было бы бесполезна, потому что аппаратное обеспечение программиста микроконтроллера не могло бы записывать в нее инструкции программы. Что еще более важно, микроконтроллер позволяют вам выполнять запись в эту память из вашей прошивки. Таким образом, это фактически читаемая, записываемая, энергонезависимая память, которую вы можете использовать для хранения данных.

Примечание: я считаю, что в настоящее время возможность записи в кодовую память из встроенного ПО достаточно стандартна, но если вы столкнулись с современным микроконтроллером, который не поддерживает эту функцию, напишите об этом в комментариях ниже.

Запись! Не используйте ее, если нет необходимости

Прежде чем идти дальше, я хочу прояснить один момент: когда вы работаете с данными, которые должны сохраняться во время работы программы, память программ – это последнее средство для замены ОЗУ.

Доступ к ОЗУ быстрее, и, по моему опыту, процедура, необходимая для записи в память программ во время выполнения прошивки, сложна и влечет за собой риск повреждения содержимого флеш-памяти.

Не используйте кодовую память для хранения переменных и массивов, которые требуют частой модификации – они должны храниться в памяти данных.

Если у вашего микроконтроллера недостаточно оперативной памяти для всех часто изменяемых переменных, используйте другой микроконтроллер или добавьте микросхему внешней памяти.

Сохранение до момента запуска

Лучший способ дополнить ОЗУ с помощью памяти программ – хранение постоянных значений. Это может быть многое: шаблоны отображения, которые вы будете отправлять на LCD модуль, фиксированные байтовые или символьные последовательности, которые будут передаваться через SPI или UART, предварительно рассчитанные значения синусоидального сигнала, которые будут использоваться для генерирования различных звуковых частот через цифро-аналоговое преобразование, и так далее.

Сохранять постоянные значения во флеш-памяти вместо оперативной памяти легко, потому что вы просто включаете значения в свою прошивку (как обычные переменные или массивы) и сообщаете компилятору, что вы хотите, чтобы они сохранялись в памяти программ. С моим компилятором (примечание, для микроконтроллеров EFM8) всё, что мне нужно сделать, это поместить ключевое слово "code" перед именем переменной (см. пример ниже); у вашего компилятора это может отличаться.

unsigned char code UART_Message[4] = {0xAA, 0xAA, 0x1C, 0x2D};

Памяти программ иногда настолько много, что этот прием можно использовать для хранения какого-то простого изображения или короткого оцифрованного аудиоклипа.

Сохранение во время выполнения программы

Сохранение во время выполнения программы – более сложный способ использования памяти программ в качестве замены ОЗУ. Вам нужно ознакомиться с техническим описанием микроконтроллера или, возможно, даже с соответствующим примечанием к применению, чтобы найти необходимую процедуру и узнать о потенциальных проблемах. Например, следующая диаграмма дает информацию о процедурах записи во флеш-память для 16-разрядных микроконтроллеров PIC:

Процедура записи во флеш-память для 16-разрядных PIC-микроконтроллеров
Процедура записи во флеш-память для 16-разрядных PIC-микроконтроллеров

Сохранение в кодовую память во время выполнения программы полезно для сохранения значений калибровки, которые генерируются во время работы устройства. В этом случае основное преимущество заключается в том, что кодовая память является энергонезависимой, поскольку данные подобного типа обычно не занимают много оперативной памяти. Пример ситуации, в которой сохранение в кодовой памяти во время выполнения программы поможет вам справиться с ограничениями ОЗУ, – это если вам нужно записать длинную последовательность значений измерений, которые собираются один раз, а затем остаются неизменными, пока оператор не загрузит результаты измерений на компьютер.

Заключение

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

Если у вас есть какие-либо советы по записи во флеш-память (во время выполнения программы) для предпочитаемого вами семейства микроконтроллеров, не стесняйтесь делиться ими в разделе комментариев.

Теги

MCURAMROMМикроконтроллерПамять программРазработка ПО для встраиваемых системСохранение во время выполненияЭнергонезависимая память

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.