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

Разместить массив во Flash STM32

Здравствуйте

Есть большой набор не изменяемых массивов байт (целевые команды). Размещать из в RAM- не рационально.

Подскажите пожалуйста как объявить в IAR ARM С инициализированный массив , так чтобы он был расположен во FLASH, а не в RAM. Естественно, массив только для чтения.

 

Ранее для IAR AVR я делал так:

__flash char* num1 = "58749455350";

 

Для IAR ARM v6.21 это не проходит.

Но и такие объявления не получаются:

uint8_t Cmd [] = {3,2,1} @ "FLASH";

 

 

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


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

Так должно получиться

static const uint8_t Cmd [] = {3,2,1};

 

Неее!

Модификатор static не для этого!

static переменная все равно будет расположена в RAM, но только инициализироваться до main() и др.

 

Пробовал модификаторы @ и pragma, но пока не получается :-(

 

Неужели никто не знает как разместить массив в ROM (FLASH)?

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


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

Ключевое слово здесь не static, а const.

const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data.

 

Я думаю, что необходимо обратиться к доке на компилятор, и внимательно посмотреть, что там и к чему...

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


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

const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data.

Может. Даже на многих DSP процессорах(например, TMS320C5509A) это так :) Потому что там нет FLASH памяти, с которой напрямую может работать ядро(маппируется в его адресное пространство + аппаратный кэш выборки команд для того, чтобы память успевала за тактовой ядра). Поэтому что остаётся делать линкеру с таким условием? Размещать в ОЗУ. А в тех контроллерах где есть такая возможность(есть встроенная FLASH), данное ключевое слово попросит линкер разместить переменную именно в ней. Вопрос был про STM32(да даже если про LPC21xx-24xx). Там есть FLASH на борту. Так что всё верно.

 

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


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

Ключевое слово здесь не static, а const.

+1

Этого должно хватать для того чтобы данные разместились во флеше, при условии что они глобальные (вне функции обявлены).

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


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

+1

Этого должно хватать для того чтобы данные разместились во флеше, при условии что они глобальные (вне функции обявлены).

 

К сожелению и это не правильно. :crying:

Вот цитата из документации ("EWARM Development Guide" с.288):

 

"If you declare a volatile object const, it will be write-protected but it will still be stored in RAM memory as the C standard specifies.

To store the object in read-only memory instead, but still make it possible to access it as a const volatile object, define the variable like this:

const volatile int x @ "FLASH";

"

 

Да, так работает.

Но мне нужен инициализированный массив (типа Cmd [] = {3,2,1} ).

А это уже не компилируется

 

Кстати, и без volatile - тоже массив будет в RAM!

А точнее, в RAM и еще код для его создания в ROM (т.к.начальный код для создания структуры массива в RAM все равно работает из FLASH). Т.е. не рационально и избыточно.

 

Возможность разместить неизменяемые большие массивы в ROM-FLASH (которого существенно больше чем RAM) очень полезна.

Изменено пользователем bingo

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


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

Вот цитата из документации ("EWARM Development Guide" с.288):

 

"If you declare a volatile object const, it will be write-protected but it will still be stored in RAM memory as the C standard specifies.

To store the object in read-only memory instead, but still make it possible to access it as a const volatile object, define the variable like this:

const volatile int x @ "FLASH";

"

 

Да, так работает.

Но мне нужен инициализированный массив (типа Cmd [] = {3,2,1} ).

А это уже не компилируется

Может где-то не там смотрите... Причина может быть в настройках проекта или ещё в чём-нибудь .

Создал массив по адресу(__root - запрет сооптимизировать):

__root const unsigned char Test[3]@0x1005={
    1,2,3
};

 

post-17322-1337305013_thumb.jpg

 

Массив по адресу 0x1005 - что есть FLASH.

 

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


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

Может где-то не там смотрите... Причина может быть в настройках проекта или ещё в чём-нибудь .

Создал массив по адресу(__root - запрет сооптимизировать):

__root const unsigned char Test[3]@0x1005={
    1,2,3
};

 

post-17322-1337305013_thumb.jpg

 

Массив по адресу 0x1005 - что есть FLASH.

 

Верно, но это (@ 0x1005) вариант использования когда нужно разместить по конкретному location

А есть еще потребность, чтобы было просто во FLASH (неважно где). Для этого используется нотация

.... @ "FLASH";

Она как раз и не работает с инициализированным при объявлении массивом

 

В проекте я отключил оптимизацию (none).

 

==========================================================================

Всем спасибо!

Вот пример правильной записи :-)

 

uint8_t HCI_Reset[] @ "FLASH" = {3,2,1};

Изменено пользователем bingo

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


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

...

А есть еще потребность, чтобы было просто во FLASH (неважно где). Для этого используется нотация

.... @ "FLASH";

Она как раз и не работает с инициализированным при объявлении массивом

Это у Вас не работает! ;)

У меня почему-то работает.

post-18823-1337307788_thumb.jpg

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


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

Верно, но это (@ 0x1005) вариант использования когда нужно разместить по конкретному location

А есть еще потребность, чтобы было просто во FLASH (неважно где)

 

Верно. Есть такая потребность:

__root const unsigned char Test[3]={
    1,2,3
    
};

 

post-17322-1337307847_thumb.jpg

 

 

В проекте я отключил оптимизацию (none).

А ведь пригодится...

Оптимизация none/high.

 

 

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


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

Это у Вас не работает! ;)

У меня почему-то работает.

post-18823-1337307788_thumb.jpg

 

Я же перед Вашим постом написал, что все уже OK

Просто, вместо правильного синтаксиса:

uint8_t HCI_Reset[] @ "FLASH" = {3,2,1};

 

Я бодался с неочевидной ошибкой (из документации совешенно не видно, пример я привел выше):

uint8_t HCI_Reset[] = {3,2,1} @ "FLASH" ;

 

:rolleyes:

 

Верно. Есть такая потребность:

__root const unsigned char Test[3]={
    1,2,3
    
};

 

post-17322-1337307847_thumb.jpg

 

 

 

А ведь пригодится...

Оптимизация none/high.

 

Конечно же позже я ее включю :rolleyes:

Дайте только все отладить.

Изменено пользователем bingo

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


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

Я же перед Вашим постом написал, что все уже OK

Просто, вместо правильного синтаксиса:

uint8_t HCI_Reset[] @ "FLASH" = {3,2,1};

Вы не поняли.

У меня никакого "FLASH" нет, это видно на картинке, и все работает правильно.

Что наводит на мысли, где же Вы свою переменную объявляете.

 

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


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

Что наводит на мысли, где же Вы свою переменную объявляете.

Прошу прощения за буквоедство, но раз он переменную пытается чем-то уже инициализировать, то это определение )

Кстати, про @ "FLASH" я не знал. Это случайно не какая-нибудь новомодная "фишка" от IAR'а? Они там постоянно что-то меняют ( Что ещё раз подтверждает тезис о том, что нужно всегда читать документацию (

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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