реклама на сайте
подробности

 
 
> Sam4N, Расположение массива во флэш памяти по заданному адрессу
Vata1990
сообщение Apr 24 2014, 11:27
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 24-04-14
Пользователь №: 81 505



Добрый день. Возник следующий вопрос, как в Atmel Studio 6 расположить массив в флэш памяти по определенному адресу. С расположением массива просто в флэш памяти я разобрался, а вот по определенному адресу никак не получается.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Apr 26 2014, 04:54
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



const int array[100]@0x0100000 = {0, 1, 2, 3};
KEIL и IAR это должны схавать без проблем, проверяли такую конструкцию?

Сообщение отредактировал kan35 - Apr 26 2014, 04:55
Go to the top of the page
 
+Quote Post
Vata1990
сообщение Apr 28 2014, 04:30
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 24-04-14
Пользователь №: 81 505



Цитата(kan35 @ Apr 26 2014, 08:54) *
const int array[100]@0x0100000 = {0, 1, 2, 3};
KEIL и IAR это должны схавать без проблем, проверяли такую конструкцию?


К сожалению такой код в студии не компилируется(((

Цитата(demiurg_spb @ Apr 24 2014, 16:53) *
1. Создать свою секцию посредством редактирования скрипта линкера или аргументом.
2. С помощью атрибута секции поместить ваши данные в эту секцию.

HINT: студия использует компилятор gnu-gcc, gnu-linker ... (набор gnu-binutils).
Читайте на них доки - там есть 99.999 ответов на все вопросы...


А вы не могли бы привести простенький пример. Со вторым пунктом я разобрался, а вот с первым никак не получается
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 28 2014, 13:18
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Vata1990 @ Apr 28 2014, 08:30) *
А вы не могли бы привести простенький пример. Со вторым пунктом я разобрался, а вот с первым никак не получается

Вот кусок скрипта линкера, в котором я добавляю секцию .section_eeprom_flash размером 2К в конец flash-памяти:
Код
MEMORY
{
    FLASH (rx)         : ORIGIN = 0x08000000, LENGTH = 254K
    EEPROM (rx)        : ORIGIN = 0x0803f800, LENGTH = 2K
    OPTIONS_BYTES (rx) : ORIGIN = 0x1FFFF800, LENGTH = 16
    RAM (xrw)          : ORIGIN = 0x20000000, LENGTH = 64K
}
...
SECTIONS
{
    .section_eeprom_flash :
    {
        . = ALIGN(256);
        _section_eeprom_flash = .;
        KEEP(*(.section_eeprom_flash .section_eeprom_flash.*))
        . = ALIGN(256);
    } >EEPROM = 0xffff
    ...
}
А вот так использую в исходниках:
Код
#define EEPROM_SECTION __attribute__ ((used, section(".section_eeprom_flash")))
typedef struct
{
    ...
} eeprom_t;

const eeprom_t EEPROM_SECTION eeprom_flash =
{
    ...
};
У этого метода есть недостаток - заливать прошивку приходится дольше, т.к. у меня не получилось сформировать elf "с дырами", кроме как таким способом:
Код
#if NDEBUG
#    define EEPROM_SECTION __attribute__ ((used, section(".section_eeprom_flash")))
#else
#    define EEPROM_SECTION __attribute__ ((used, aligned (FLASH_PAGE_SIZE)))
#endif
Убираю дыру, притягивая секцию еепром к секции текст при отладочной сборке (мой основной режим компиляции - DEBUG, а релизы достаточно редки).
Если кто знает более прямое решение - с удовольствием перейму опыт.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016