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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Разместить массив во Flash STM32, IAR ARM v6.21
bingo
сообщение May 17 2012, 02:16
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



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

Ранее для IAR AVR я делал так:
__flash char* num1 = "58749455350";

Для IAR ARM v6.21 это не проходит.
Но и такие объявления не получаются:
uint8_t Cmd [] = {3,2,1} @ "FLASH";

Go to the top of the page
 
+Quote Post
SergeyL
сообщение May 17 2012, 02:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 28-06-04
Пользователь №: 199



Так должно получиться
static const uint8_t Cmd [] = {3,2,1};
Go to the top of the page
 
+Quote Post
bingo
сообщение May 17 2012, 11:30
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Цитата(SergeyL @ May 17 2012, 05:46) *
Так должно получиться
static const uint8_t Cmd [] = {3,2,1};


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

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

Неужели никто не знает как разместить массив в ROM (FLASH)?
Go to the top of the page
 
+Quote Post
PheeL
сообщение May 17 2012, 11:55
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633



Цитата(bingo @ May 17 2012, 15:30) *
Неее!
Модификатор static не для этого!

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


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 17 2012, 15:05
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (PheeL @ May 17 2012, 19:55) *
Ключевое слово здесь не static, а const.

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

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
PheeL
сообщение May 17 2012, 16:51
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633



Цитата(haker_fox @ May 17 2012, 19:05) *
const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data.

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


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 17 2012, 17:51
Сообщение #7


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

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



Цитата(PheeL @ May 17 2012, 14:55) *
Ключевое слово здесь не static, а const.

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
bingo
сообщение May 18 2012, 01:01
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Цитата(demiurg_spb @ May 17 2012, 20:51) *
+1
Этого должно хватать для того чтобы данные разместились во флеше, при условии что они глобальные (вне функции обявлены).


К сожелению и это не правильно. crying.gif
Вот цитата из документации ("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 - May 18 2012, 01:03
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 18 2012, 01:41
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(bingo @ May 18 2012, 04:01) *
Вот цитата из документации ("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
};



Прикрепленное изображение


Массив по адресу 0x1005 - что есть FLASH.
Go to the top of the page
 
+Quote Post
bingo
сообщение May 18 2012, 01:56
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Цитата(_Артём_ @ May 18 2012, 04:41) *
Может где-то не там смотрите... Причина может быть в настройках проекта или ещё в чём-нибудь .
Создал массив по адресу(__root - запрет сооптимизировать):
Код
__root const unsigned char Test[3]@0x1005={
    1,2,3
};



Прикрепленное изображение


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


Верно, но это (@ 0x1005) вариант использования когда нужно разместить по конкретному location
А есть еще потребность, чтобы было просто во FLASH (неважно где). Для этого используется нотация
.... @ "FLASH";
Она как раз и не работает с инициализированным при объявлении массивом

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

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

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

Сообщение отредактировал bingo - May 18 2012, 01:57
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 18 2012, 02:24
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(bingo @ May 18 2012, 04:56) *
...
А есть еще потребность, чтобы было просто во FLASH (неважно где). Для этого используется нотация
.... @ "FLASH";
Она как раз и не работает с инициализированным при объявлении массивом

Это у Вас не работает! wink.gif
У меня почему-то работает.

Прикрепленное изображение


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 18 2012, 02:28
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(bingo @ May 18 2012, 04:56) *
Верно, но это (@ 0x1005) вариант использования когда нужно разместить по конкретному location
А есть еще потребность, чтобы было просто во FLASH (неважно где)


Верно. Есть такая потребность:
Код
__root const unsigned char Test[3]={
    1,2,3
    
};



Прикрепленное изображение



Цитата(bingo @ May 18 2012, 04:56) *
В проекте я отключил оптимизацию (none).

А ведь пригодится...
Оптимизация none/high.

Go to the top of the page
 
+Quote Post
bingo
сообщение May 18 2012, 04:57
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Цитата(Dog Pawlowa @ May 18 2012, 05:24) *
Это у Вас не работает! wink.gif
У меня почему-то работает.

Прикрепленное изображение


Я же перед Вашим постом написал, что все уже OK
Просто, вместо правильного синтаксиса:
uint8_t HCI_Reset[] @ "FLASH" = {3,2,1};

Я бодался с неочевидной ошибкой (из документации совешенно не видно, пример я привел выше):
uint8_t HCI_Reset[] = {3,2,1} @ "FLASH" ;

rolleyes.gif

Цитата(_Артём_ @ May 18 2012, 05:28) *
Верно. Есть такая потребность:
Код
__root const unsigned char Test[3]={
    1,2,3
    
};



Прикрепленное изображение




А ведь пригодится...
Оптимизация none/high.


Конечно же позже я ее включю rolleyes.gif
Дайте только все отладить.

Сообщение отредактировал bingo - May 18 2012, 04:57
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 18 2012, 06:43
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(bingo @ May 18 2012, 07:57) *
Я же перед Вашим постом написал, что все уже OK
Просто, вместо правильного синтаксиса:
uint8_t HCI_Reset[] @ "FLASH" = {3,2,1};

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
PheeL
сообщение May 18 2012, 06:58
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633



Цитата(Dog Pawlowa @ May 18 2012, 10:43) *
Что наводит на мысли, где же Вы свою переменную объявляете.

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


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 10th June 2024 - 10:11
Рейтинг@Mail.ru


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