Свежие обсуждения
Микроконтроллеры

Си начинающим с нуля - IAR Atmel

1 3 7

ykomp: Новичкам, да и не только, будет полезно изучить книгу "Ю. А. Шпак. Программирование на языке C для AVR и PIC микроконтроллеров", тем более, что вышло 2-е издание этой книги http://regionbook.ru/goods.php?id=13444.
А чего это указано, что издание 2011 года? Непонятно, или ждать 2011, или он уже наступил?! 8-(

 

Здравствуйте!
Скажите, как в IAR AVR объявлять переменные в EEPROM, чтоб они шли в определенном порядке?
Ато я объявил такие переменные, которые надо зашивать в процессе программирования микроконтроллера (калибровочный байт RC-генератора, таблица кнопок, которую можно менять под разные пульты без перекомпиляции проги) а при прошивке обнаружил, что в файле *.eep хрен знает что. Я конечно отыскал куда чего зашить (не без мата), но это не дело!
Как сделать так, чтоб переменные шли подряд как объявлены в программе, а не куда из компилятор запихнет?

 

Там есть принудительное задание адреса переменной, как и в ассемблере. Команду не помню, книжку лень листать.

 

Леха: Как сделать так, чтоб переменные шли подряд как объявлены в программе, а не куда из компилятор запихнет?

Объединить их в структуру (struct), если конечно IAR AVR позволяет размещать структуры в EEPROM.
Наверное, позволяет.

Для struct гарантировано, что элементы будут расположены в памяти подряд в порядке объявления.
Строго говоря (по стандарту языка), нет гарантий, что элементы будут расположены "вплотную". Может быть так называемое выравнивание адресов - но для 8-битных контроллеров выравнивание не имеет смысла и на вряд ли где-то реализовано. То есть всё должно быть ОК без всяких плясок с бубном.

А чтобы не привязываться к конкретному адресу при перепрошивке, в начале структуры можно расположить произвольный и относительно уникальный идентификатор, т.е. типа так:

__eeprom struct {
char magic[7];
int my_variable1;
int my_variable2;
int my_variable3;
...
int my_variableN;
} my_eeprom_data = {
"EEDATA", // Строковый идентификатор для облегчения поиска структуры в EEPROM
default_value_for_my_variable1,
default_value_for_my_variable2,
default_value_for_my_variable3,
...
default_value_for_my_variableN
};

 

Со структурой влом делать - надо опять прогу всю править(((
принудительное задание адреса переменной не гуглится(( Гуглится что это нельзя.
Может в настройках где можно отключить самовольную расстановку переменных? Хотя это будет криво.
Надо чтоб в тексте программы это указывалось

 

Команда write_eeprom запишет переменную точно по указанному программером адресу. Что ещё надо? Все переменные будут в нужном порядке и там, где хочется.

 

Что-то вообще ничего не понял... Что за команда write_eeprom? Или это альтернативная функция вместо штатных
__eeprom char a=b; ?
И что, я должен буду всю прогу так переписывать? А по-другому никак нельзя? Чтоб объявил я переменные и в ЕЕПРОМ они пошли в таком же порядке. Большего мне и не надо - просто знать в какой ячейке какая переменная без перекомпиляции и обращения к исходникам.

 

Ну ладно, может в Си IAR AVR и нет такой команды write_eeprom.
Все компилляторы имеют свои отличия, чтобы отличными от других считаться и деньги брать за это. У меня всё.

 

По-любому, функция для записи в EEPROM либо уже есть библиотеке в составе компилятора, либо её можно самому написать.

Отказ от "синтаксического сахара" в виде атрибута __eeprom и переход на "ручное" чтение/запись EEPROM через функции - концептуально самый адекватный способ решения задачи.

 

Короче, сам разобрался
Есть оказывается прагма на эту тему. В итоге записал:

#pragma location=0x0000
const __eeprom unsigned char eep_OSCCAL=0xA2;

Переменная разместилась как и хотел в нулевой ячейке ЕЕПРОМ.
Что интересно, когда я объявлял переменную как const __eeprom unsigned char, она почему-то отправлялась во флеш и я дооолго ее искал чтоб записать калибровочный коэффициент в ЕЕПРОМ Если же спецификатор const убрать - она все-таки оказывалась в ЕЕПРОМ.

boo2: Отказ от "синтаксического сахара" в виде атрибута __eeprom и переход на "ручное" чтение/запись EEPROM через функции - концептуально самый адекватный способ решения задачи.

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

А скажите, если у меня в основном цикле безконца читается переменная их ЕЕПРОМ типа
if(eep_wakeup_state==1)
от этого ничего плохого быть не может?