Перейти к содержанию
    

WinAVR - проблема с секциями в ld

А вот это не то что Вам надо?
Да, так у меня тоже все получилось, спасибо, теперь ясно как делать кошерно...

 

только ИМХО нужно чуть поменять в MEMORY:

MEMORY

{

text (rx) : ORIGIN = 0, LENGTH = 0x17F4

data (rw!x) : ORIGIN = 0x800071, LENGTH = 1024-17

eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 512

}

 

для того чтобы при перерасходе секции data линкер нам об этом сообщал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот родилась мысль - может они хотели сделать быстрое копирование, копируя по два байта за каждый проход цикла? Или может так оно и было когда-то, но потом отказались, а это выравнивание - рудимент?
Хм... Как раз на днях макет один начал делать, для серии - зашивает тестовую програму в изделие, дёргает за разные ноги, то-сё, потом зашивает рабочую программу. Это всё без компа работать будет (точнее, прошивки от него получать, на тему серийных номеров общаться оно будет, но там свой контроллер в стенде и он будет шить).

Ну так вот забыл уже, что avreal-то давно уже при неполном слове в .hex для флеша от себя добавляет недостающий байт 0xFF.

А для стенда писал из головы, там не надо сильно много всего, проще было заново. Нарвался на то, что в доп. секции во флеше с серийным номером и калибровочными константами, имеющей нечётное число байт - последний байт не записывается во флеш. Тут-то и вспомнил, что в avreal-е сделано дописывание от себя до полного слова. Ну, для данной задачи было проще в линкерном скрипте для секции .cfg добавить .=ALIGN(2); чем усложнять программу макета ;)

 

А секция .data летит в .hex и при её нечётной длине в хексе какой-то программатор может и обломиться (у AVR по программирования флеша сделано с временным байтовым регистром и если не записать старший байт, то всё слово в буфер страницы не пойдёт, если не писать младший, только старший - то в данном слове продублируется младший из предыдущего слова).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Массив определяю в программе в отдельную секцию:

uint8_t Buffer[5] __attribute__((section("buffer"),used));

 

Хоть проблема уже вроде бы решена :)

 

Читал мануал, наткнулся на такое:

 

Use the section attribute with an initialized definition of a global variable, as shown in the example. GCC issues a warning and otherwise ignores the section attribute in uninitialized variable declarations.

 

Это интересно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это интересно?
Да, это действительно интересно. Только не стыкуется пока с наблюдаемым поведением avr-gcc.

билет на трамвае к А стоит дешевле чем на автобусе к В....

обдумать

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...