|
Внутренее еепром в авр, компилятор CVAVR |
|
|
|
Jan 9 2008, 05:53
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
Назрел вопрос... Помогите советом плиз!! Задача такова... Есть прошивка, это к примеру... Это моя прошива, но под PIC В ней все хорошо, но... Все настройки, такие как IP сервера надо задружать из внутренего еепрома. Вот тут и встает задача, как это сделать?? Для примера я програматором записал 5 байт в еепром, начиная с 0х00 заканчивая 0х04. Допустим, что там значения '1','2','3','4','5'. Есть нейкий массив, инициализарованый в SRAM как int mas[5]; Задача загрузить эти данные из еепром в этот массив. В моем компиляторе я делал бы так Код for(i=0;i<5;i++) mas[i]=read_eepom(i); Всем откликнувшимся на проблему заранее грамаднейшее спасибо!!
Сообщение отредактировал Lexi - Jan 9 2008, 05:54
|
|
|
|
|
Jan 9 2008, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
В CVAVR как и в многих других компиляторах есть ключевое слово eeprom, если его написать перед типом переменной при объявлении, например так: Код eeprom char i; то переменная будет располагаться в ЕЕПРОМ и в дальнейшем компилятор сам будет подставлять команды чтения ЕЕПРОМ и сам будет разбираться с относительным смещением этой переменной в карте памяти, а для программиста эта переменная будет как обычная... т.е. ей можно присваивать значение Код i = 10; , но не стоит забывать что она все таки размещается в относительно медленной памяти ЕЕПРОМ и доступ к переменной займет гораздо большее время. Точно так же можно объявить и массив в ЕЕПРОМ, тогда нужный вам кусок кода будет выглядеть примерно так Код int mas[5]; eeprom int eemas[5]; .... for(char i=0;i<5;i++) mas[i]=eemas[i];
--------------------
|
|
|
|
|
Jan 9 2008, 08:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата А если у меня таких массивов 5 или 10? Объявляете соответственно 5 или 10 массивов в ЕЕПРОМ, да хоть 100, лишь бы они там поместились... Цитата Как я узнаю в какую ячйку eeprom обратится мой компилятор при вышеизложеном коде? А зачем вам это знать? Обращаетесь к массивам по имени, т.е. работаете с ними как с обычными переменными в ОЗУ.
--------------------
|
|
|
|
|
Jan 9 2008, 08:17
|

Иногдящий
   
Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931

|
В IAR, например, есть директивы, которыми можно прямо указать адрес переменной в памяти. Например: Код int i @0x0100 Посмотрите описание к CVAVR, возможно и там есть подобная возможность... Цитата А зачем вам это знать? Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо  .
|
|
|
|
|
Jan 9 2008, 08:34
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
Цитата(AndyBig @ Jan 9 2008, 11:17)  Посмотрите описание к CVAVR, возможно и там есть подобная возможность... Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо  . Да имено так и происходит.... Пользователь будет туда вводить некоторые данные, с которым будет прошива работать
|
|
|
|
|
Jan 9 2008, 08:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо Если переменные при объявлении еще и проинициализировать, то CVAVR создаст файл для прошивки ЕЕПРОМ с этими значениями. Вообще то компилятор размещает переменные в ЕЕПРОМ в том порядке в каком их объявляет программист, так что не составляет большого труда определить где находится конкретная переменная. В свое время я переменные ЕЕПРОМ объявлял в одном файле eeprom.c а в соответствующем файле eeprom.h объявлял их же с идентификатором extern и инклюдил этот файл во все остальные файлы проекта, т.о. я точно знал что все переменные у меня идут в определенном порядке.
--------------------
|
|
|
|
|
Jan 9 2008, 09:27
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
Вот это из хелпа Цитата  Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the keyword eeprom. Example: /* The value 1 is stored in the EEPROM during chip programming */ eeprom int alfa=1; eeprom char beta; eeprom long array1[5]; /* The string is stored in the EEPROM during chip programming */ eeprom char string[]=”Hello”; void main(void) { int i; /* Pointer to EEPROM */ int eeprom *ptr_to_eeprom; /* Write directly the value 0x55 to the EEPROM */ alfa=0x55; /* or indirectly by using a pointer */ ptr_to_eeprom=&alfa; *ptr_to_eeprom=0x55; /* Read directly the value from the EEPROM */ i=alfa; /* or indirectly by using a pointer */ i=*ptr_to_eeprom; } Это относиться к делу?
|
|
|
|
|
Jan 9 2008, 09:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата то есть, если я правильно понял, то если инициализирую char eeprom IP[16]; char eeprom Port[5]; Тут вы только объявили переменные, а не проинициализировали, инициализировать надо так: char eeprom Port[5] = {1,2,3,4,5}; Цитата то под IP займутся ячейки от 0 по 15 , а для Port 16-21 именно так. Цитата Смогу ли я потом прочесть данные после предворительной записи в еепром, вернее оперировать ими как массив IP и Port? Конечно сможете, компилятор просто будет брать данные из ЕЕПРОМ, а уж что и когда вы туда положили - это ваше дело... только если вы будете делать инициализацию так как я описал выше, то данные что вы запишете в ЕЕПРОМ будут затерты инициализацией, так что ее стоит делать только раз, чтобы создать файл прошивки для ЕЕПРОМ, а потом удалить и перекомпилировать проект, сохранив предварительно файл прошивки еепрома в другое место. Т.е. делаете примерно так: 1. делаете и отлаживаете проект с инициализацией ЕЕПРОМ char eeprom Port[5] = {1,2,3,4,5}; получаете файл прошивки ЕЕПРОМ и сохраняете его в другое место 2. убираете инициализацию char eeprom Port[5]; и перекомпилируете проект 3. прошиваете контроллер программой от п.2 а ЕЕПРОМ прошиваете файлом от п.1
--------------------
|
|
|
|
|
Jan 9 2008, 09:36
|

Иногдящий
   
Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931

|
Цитата Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому? Ну мало ли что взбредет в голову авторам компилятора  . Может быть они решат для экономии ресурса еепром размещать переменные с циклическим сдвигом после каждой перекомпиляции  Цитата Это относиться к делу? Да, но об этом вам сказали с самого начала. А вот об определение конкретного адреса переменных - в этой цитате ни слова.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|