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

 
 
 
Reply to this topicStart new topic
> 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
demiurg_spb
сообщение Apr 24 2014, 12:53
Сообщение #2


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

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



1. Создать свою секцию посредством редактирования скрипта линкера или аргументом.
2. С помощью атрибута секции поместить ваши данные в эту секцию.

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 26 2014, 04:54
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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
demiurg_spb
сообщение Apr 27 2014, 14:02
Сообщение #4


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

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



Цитата(kan35 @ Apr 26 2014, 08:54) *
Это не KEIL и IAR, а gcc. Тут такое не проходит.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Vata1990
сообщение Apr 28 2014, 04:30
Сообщение #5





Группа: Новичок
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
Vata1990
сообщение May 21 2014, 03:51
Сообщение #7





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



А не могли бы еще помочь во с чем:
Есть внешняя микросхема памяти, мне нужно расписать для нее адресса.
В ассемблере я это делал следующим образом

.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 определять каждый адрес очень долго и муторно, к тому же при изменении придется все заново пересчитывать(((.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2014, 04:00
Сообщение #8


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

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Vata1990
сообщение May 21 2014, 04:44
Сообщение #9





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



Цитата(demiurg_spb @ May 21 2014, 12:10) *
Это решается при помощи объявления структуры с соответствующими полями, а сама структура единожды привязывается к определённому адресу.


А вы не могли бы привести пример пример, как привязать структуру к определенному адресу? Это делается с помощью атрибутов? А то я нигде не могу этого найти. Заранее огромное спасибо.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2014, 05:04
Сообщение #10


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

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



Цитата(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;


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

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

 


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


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