|
Внутренее еепром в авр, компилятор 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 27)
|
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

|
Цитата Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому? Ну мало ли что взбредет в голову авторам компилятора  . Может быть они решат для экономии ресурса еепром размещать переменные с циклическим сдвигом после каждой перекомпиляции  Цитата Это относиться к делу? Да, но об этом вам сказали с самого начала. А вот об определение конкретного адреса переменных - в этой цитате ни слова.
|
|
|
|
|
Jan 9 2008, 10:17
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
Цитата(AndyBig @ Jan 9 2008, 12:47)  Попробуйте указать адрес массивов как и в IAR: eeprom char IP[16] @0x00; eeprom char Port[5] @0x10; Не прошло, только для SRAM Цитата(AndyBig @ Jan 9 2008, 12:47)  По идее cvavr допускает указание адресов переменных таким образом... Правда в руководстве к нему сказано только про SRAM-переменные, но может и на епром пройдет... придеться делать как GDI говорил. Еще один аопрос, где можно почитать про протокол, как шить eeprom. Хочу написать ПО для отдельной прошивы EEPROM в человеческом и товарном виде.
|
|
|
|
|
Jan 9 2008, 10:28
|

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

|
Цитата Не прошло, только для SRAM А в IAR проходит, только что попробовал... Цитата где можно почитать про протокол, как шить eeprom Шить откуда? Из своей прошивки? Снаружи? Если снаружи, то читайте даташит на мегу, раздел Memory Programming.
|
|
|
|
|
Jan 10 2008, 08:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата попробуйте почитать документацию Цитата(011119xx @ Jan 10 2008, 10:36)  К примеру так не проходит: Гы... гы... ы....  Где вы в документации на avr-libc такое нашли??
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 11 2008, 11:01
|

Участник

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847

|
Примите и мои пять копеек: В даташите есть примеры для записи/чтения епром. берем целиком кусок из даташита и готова функция чтения/записи. Потом используй ее, как использовал для пиков: MyVar=EEPROM_read(адрес); EEPROM_write(адрес,MyVar); В даташите на мегу16/32 это стр.22, для мега8 это стр21, дальше сам найдешь.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|