Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Sam4N
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Vata1990
Добрый день. Возник следующий вопрос, как в Atmel Studio 6 расположить массив в флэш памяти по определенному адресу. С расположением массива просто в флэш памяти я разобрался, а вот по определенному адресу никак не получается.
demiurg_spb
1. Создать свою секцию посредством редактирования скрипта линкера или аргументом.
2. С помощью атрибута секции поместить ваши данные в эту секцию.

HINT: студия использует компилятор gnu-gcc, gnu-linker ... (набор gnu-binutils).
Читайте на них доки - там есть 99.999 ответов на все вопросы...
kan35
const int array[100]@0x0100000 = {0, 1, 2, 3};
KEIL и IAR это должны схавать без проблем, проверяли такую конструкцию?
demiurg_spb
Цитата(kan35 @ Apr 26 2014, 08:54) *
Это не KEIL и IAR, а gcc. Тут такое не проходит.
Vata1990
Цитата(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 ответов на все вопросы...


А вы не могли бы привести простенький пример. Со вторым пунктом я разобрался, а вот с первым никак не получается
demiurg_spb
Цитата(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, а релизы достаточно редки).
Если кто знает более прямое решение - с удовольствием перейму опыт.
Vata1990
А не могли бы еще помочь во с чем:
Есть внешняя микросхема памяти, мне нужно расписать для нее адресса.
В ассемблере я это делал следующим образом

.DSEG
; Энеpгонезависимая память в микpосхеме FM31256 с адpеса 0x0000 по 0x7FFF
.INCLUDE "map-fm31.asm"

и затем в файле "map-fm31.asm":

.LIST
; Энеpгонезависимая память в микpосхеме FM3164 с адpеса 0x0000 по 0x1FFF
.ORG 0x0000
PLACE: .BYTE 16 ; Место установки счетчика

KALENDARTMP: .BYTE 32*2 ; 32 нестандаpтных дня по 2 байта

SEAZONTMP: .BYTE 12*2 ; 12 сезонов по 2 байта на сезон
....



А как это сделать на си в atmel studio 6 не подскажете? Нигде не могу найти, с помощью define определять каждый адрес очень долго и муторно, к тому же при изменении придется все заново пересчитывать(((.
demiurg_spb
Цитата(Vata1990 @ May 21 2014, 12:01) *
... с помощью define определять каждый адрес очень долго и муторно, к тому же при изменении придется все заново пересчитывать(((.
Это решается при помощи объявления структуры с соответствующими полями, а сама структура единожды привязывается к определённому адресу.
Vata1990
Цитата(demiurg_spb @ May 21 2014, 12:10) *
Это решается при помощи объявления структуры с соответствующими полями, а сама структура единожды привязывается к определённому адресу.


А вы не могли бы привести пример пример, как привязать структуру к определенному адресу? Это делается с помощью атрибутов? А то я нигде не могу этого найти. Заранее огромное спасибо.
demiurg_spb
Цитата(Vata1990 @ May 21 2014, 12:54) *
А вы не могли бы привести пример пример, как привязать структуру к определенному адресу? Это делается с помощью атрибутов? А то я нигде не могу этого найти. Заранее огромное спасибо.
Да с помощью атрибутов. Пример я уже приводил.
Есть ещё один вариант, если не требуется инициализировать её значениями по умолчанию и если вы зарезервируете эту область памяти от случайного наползания других данных.
Код
typedef struct
{
   int x1;
   int x2;
   ...
} var_t;

#define var ((var_t*)ADDRESS)

var->x1 = 123;
var->x2 = 456;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.