Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация EEPROM в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
megaboy
Вопрос, собственно, как выключить инициализацию eeprom нулями по умолчанию. Файл *.eep содержит нули
для объявленных переменных eeprom, а нужны значения 0xFF.
Попробывал в скрипте линкера добавить 0xFF в качестве заполнения секции, но это ничего не дало:
Код
  .eeprom  :
  {
    *(.eeprom*)
     __eeprom_end = .;
  }  > eeprom =0xFF

Собственно ранее в файле программы делал так:
Код
struct EEDATA eeprom eep =
{
  .sn = {0xFF, 0xFF, 0xFF, 0xFF},
  .cfg.apn = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  .cfg.name = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  .cfg.pass = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
           0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
           0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
           0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
};

Но не кашерно, так нужно постоянно отслеживать изменения в размерах элементов данных.
Может кто уже решил эту проблему?
xelax
Код
.eeprom :
  {
    FILL(0xff)
    BYTE(0xff)
    . = . + LENGTH(eeprom)-1;
  } > eeprom


Вот как-то так, подправте под себя если что. В скобочках указываете, чем хотите заполнить.
megaboy
Попробовал так, если добавить только первые две строки, то в первый байт хекса записывает 0xFF,
но остальные все равно нулевые:
Код
  .eeprom  :
  {
      FILL(0xFF)
      BYTE(0xFF)
    *(.eeprom*)
     __eeprom_end = .;
  }  > eeprom

А если так:
Код
  .eeprom  :
  {
      FILL(0xFF)
      BYTE(0xFF)
    . = . + LENGTH(eeprom)-1;
    *(.eeprom*)
     __eeprom_end = .;
  }  > eeprom

то линкер выдает ошибку:
c:/winavr-20080512/bin/../lib/gcc/avr/4.3.0/../../../../avr/bin/ld.exe: region eeprom is full (WL_hw10.elf section .eeprom)
c:/winavr-20080512/bin/../lib/gcc/avr/4.3.0/../../../../avr/bin/ld.exe: region eeprom is full (WL_hw10.elf section .eeprom)
make: *** [WL_hw10.elf] Error 1
swisst
может быть как-то так...
Цитата
3.6.8.7 Output Section Fill

You can set the fill pattern for an entire section by using =fillexp. fillexp is an expression (see Expressions). Any otherwise unspecified regions of memory within the output section (for example, gaps left due to the required alignment of input sections) will be filled with the value, repeated as necessary. If the fill expression is a simple hex number, ie. a string of hex digit starting with 0x and without a trailing k or M, then an arbitrarily long sequence of hex digits can be used to specify the fill pattern; Leading zeros become part of the pattern too. For all other cases, including extra parentheses or a unary +, the fill pattern is the four least significant bytes of the value of the expression. In all cases, the number is big-endian.

You can also change the fill value with a FILL command in the output section commands; (see Output Section Data).

Here is a simple example:

SECTIONS { .text : { *(.text) } =0x90909090 }
xelax
То что я вам дал работает следующим образом.
Располагает в секции eeprom байт FF с помощью FILL(0xFF), а затем с помощью
Код
BYTE(0xFF)
. = . + LENGTH(eeprom)-1;

добивает секцию FFами, от . до . + LENGTH(eeprom)-1
Это кусок рабочего скрипта/


Ну а дальше надо почитать доку, чтобы прикрутить нечто подобное к своему скрипту.

Естественно секция должна быть задана, у меня для атмеги1281
Код
MEMORY
{
  text   (rx)   : ORIGIN = 0x00000000, LENGTH = 128K
  data   (rw!x) : ORIGIN = 0x00800200, LENGTH = 8K - 500  /* leave 500 bytes for stack */
  eeprom (rw!x) : ORIGIN = 0x00810000, LENGTH = 4K
}
Сергей Борщ
Цитата(megaboy @ Sep 17 2010, 08:50) *
Файл *.eep содержит нули
для объявленных переменных eeprom, а нужны значения 0xFF.
Для всех переменых? Не зашивайте файл .eep Для некоторых - или инциализируйте явно, или положите их в отдельную секцию и эту секцию вырезайте из файла утилитой SRecord. По стандарту глобальные переменные неявно инициализируются нулями.
megaboy
Цитата(Сергей Борщ @ Sep 17 2010, 17:44) *
Для всех переменых? Не зашивайте файл .eep Для некоторых - или инциализируйте явно, или положите их в отдельную секцию и эту секцию вырезайте из файла утилитой SRecord. По стандарту глобальные переменные неявно инициализируются нулями.


Самый простой вариант для меня - не зашивать его. Но как выключить загрузку eep файла при загрузке сессии JTAG ICE mkII из AVR Studio, если файл в проекте присутствует и его нельзя исключить из проекта? Иначе компилироваться не будет smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.