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

 
 
> AT91SAM7 + GCC(Yagarto), Как сделать костантный массив во FLASH.
bug_fix
сообщение Aug 17 2008, 16:47
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 25-01-05
Пользователь №: 2 166



Требуется хранить некий массив данных во FLASH. как записывать данные на это место вроде как понятно. Через контроллер памяти. А вот как сказать компилятору, что это костантный массив данных лежащий в памяти программ (FLASH) пока чего то не раскопал. Может кто носом ткнет или ссылочкой побалует ? Поиск по форуму не дал результата.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Aug 20 2008, 05:29
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(bug_fix @ Aug 17 2008, 19:47) *
А вот как сказать компилятору, что это костантный массив данных лежащий в памяти программ (FLASH) пока чего то не раскопал.
Все глобальные переменные, описанные с квалификатором const по умолчанию складываются в секцию rodata. Но поскольку вы собираетесь переписывать ваши данные и не хотите случайно затереть остальные константы, то вам надо поместить ваши данные в отдельную секцию и в скрипте линкера добать эту секцию с выравниванием на границе сектора. Примерно так:
Код
.c:
#define MYFLASH __attribute__((section(".myflash")))

MYFLASH uint8_t const array[256];

.ld:

  .text :
  {
    ..........
  } > ROM

  .data :
  {
     .........
  } > RAM AT > ROM

   ..........

  .myflash :
  {
    . = ALIGN(256);
    *(.myflash)
    . = ALIGN(256);

  } > ROM
Здесь начальные значения констант (.data) размещаются вслед за выходной секцией .text, поэтому описание выходной секции .myflash я поместил после .data, чтобы эта секция располагалась последней. Как вариант - можно описать отдельный регион памяти для этих констант и линковать .myflash в этот регион:
Код
/* memory layout */
MEMORY
{
  ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000 - 512    /* 64K - MYFLASH*/
  MYFLASH (rx) : ORIGIN = 0x000010000 - 512, LENGTH = 512
  RAM (rw) : ORIGIN = 0x00200000, LENGTH = 0x00004000
}

   ..........

  .myflash :
  {
    *(.myflash)
  } >MYFLASH


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 14:11
Рейтинг@Mail.ru


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