2017-02-17 26 views
2

Я во многих ситуациях обнаружил, что должен хранить массив или кучу структур в ПЗУ вместо ОЗУ. Затем я просматриваю весь код и вношу изменения, такие как добавление PROGMEM, pgm_read_word(), pgm_read_byte(). Это сложная задача, особенно после написания, как 4000 строк кода.Есть ли простой способ в программировании на C (AVR), чтобы выбрать, следует ли хранить переменную в ОЗУ или ПЗУ и обрабатывать ее через весь код?

Есть ли трюк, который можно сделать, чтобы сделать это проще?

+0

Трюк? Использование компилятора, который правильно поддерживает архитектуру, будет началом. Вы не должны беспокоиться о бизнесе 'pgm_read_read', разумным способом является классификатор для маркировки пространств памяти программ. – doynax

+0

Размещение памяти обычно обрабатывается компоновщиком – user3528438

+2

@ user3528438: компоновщик выделяет переменные _within_ адресное пространство, обычно не выбирает, какой сегмент помещать в них. AVR, в частности, представляет собой архитектуру Гарварда, для которой требуются разные типы инструкций для ROM или RAM, причем первый из них несколько ограничен в сравнении. – doynax

ответ

1

Вы должны изучить функцию GCC named address spaces. Эта функция была включена для AVR в GCC 4.7, поэтому вам нужно убедиться, что вы используете GCC 4.7 или новее. Это позволит вам указать компилятору, в каком пространстве памяти находятся ваши переменные, и в каком пространстве памяти указываются ваши указатели. Затем вы можете получить доступ к переменным с помощью обычного синтаксиса C вместо использования таких функций, как pgm_read_byte.

Примечание: В НКУ 4.9.2, названные адресные пространства поддерживаются только в компилятор GNU C, не C++ компилятор, который использует Arduino IDE.

+0

Он сделал работу спасибо, я сделал следующее: Чтобы определить новый флэш-массив: 'константный __attribute __ ((__ вспышка)) INT my_array [4] = {1,2,3,4}' Я к нему доступ как обычный массив, здесь я напечатал последний элемент в my_array 'Serial.println (String (my_array [3]))' –

+0

Я немного смущен. Зачем кому-то бороться с 'PROGMEM' и' pgm_read_byte() ', если есть более простой и более гибкий способ выполнить работу? –

+0

GCC 4.7.0 был выпущен в 2012 году, и ему потребовалось больше времени, чтобы он стал универсальным. До этого было сделано много работ по разработке AVR. –