|
Разместить массив во Flash STM32, IAR ARM v6.21 |
|
|
|
May 17 2012, 11:30
|
Частый гость
Группа: Свой
Сообщений: 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)?
|
|
|
|
|
May 17 2012, 11:55
|
Участник
Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633
|
Цитата(bingo @ May 17 2012, 15:30) Неее! Модификатор static не для этого! Ключевое слово здесь не static, а const.
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
May 17 2012, 16:51
|
Участник
Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633
|
Цитата(haker_fox @ May 17 2012, 19:05) const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data. Может. Даже на многих DSP процессорах(например, TMS320C5509A) это так Потому что там нет FLASH памяти, с которой напрямую может работать ядро(маппируется в его адресное пространство + аппаратный кэш выборки команд для того, чтобы память успевала за тактовой ядра). Поэтому что остаётся делать линкеру с таким условием? Размещать в ОЗУ. А в тех контроллерах где есть такая возможность(есть встроенная FLASH), данное ключевое слово попросит линкер разместить переменную именно в ней. Вопрос был про STM32(да даже если про LPC21xx-24xx). Там есть FLASH на борту. Так что всё верно.
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
May 18 2012, 01:01
|
Частый гость
Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256
|
Цитата(demiurg_spb @ May 17 2012, 20:51) +1 Этого должно хватать для того чтобы данные разместились во флеше, при условии что они глобальные (вне функции обявлены). К сожелению и это не правильно. Вот цитата из документации ("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
|
|
|
|
|
May 18 2012, 01:41
|
Гуру
Группа: Свой
Сообщений: 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.
|
|
|
|
|
May 18 2012, 01:56
|
Частый гость
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 18 2012, 02:28
|
Гуру
Группа: Свой
Сообщений: 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.
|
|
|
|
|
May 18 2012, 04:57
|
Частый гость
Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256
|
Цитата(Dog Pawlowa @ May 18 2012, 05:24) Это у Вас не работает! У меня почему-то работает.
Я же перед Вашим постом написал, что все уже OK Просто, вместо правильного синтаксиса: uint8_t HCI_Reset[] @ "FLASH" = {3,2,1}; Я бодался с неочевидной ошибкой (из документации совешенно не видно, пример я привел выше): uint8_t HCI_Reset[] = {3,2,1} @ "FLASH" ; Цитата(_Артём_ @ May 18 2012, 05:28) Верно. Есть такая потребность: Код __root const unsigned char Test[3]={ 1,2,3 };
А ведь пригодится... Оптимизация none/high. Конечно же позже я ее включю Дайте только все отладить.
Сообщение отредактировал bingo - May 18 2012, 04:57
|
|
|
|
|
May 18 2012, 06:43
|
Гуру
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823
|
Цитата(bingo @ May 18 2012, 07:57) Я же перед Вашим постом написал, что все уже OK Просто, вместо правильного синтаксиса: uint8_t HCI_Reset[] @ "FLASH" = {3,2,1}; Вы не поняли. У меня никакого "FLASH" нет, это видно на картинке, и все работает правильно. Что наводит на мысли, где же Вы свою переменную объявляете.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 18 2012, 06:58
|
Участник
Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633
|
Цитата(Dog Pawlowa @ May 18 2012, 10:43) Что наводит на мысли, где же Вы свою переменную объявляете. Прошу прощения за буквоедство, но раз он переменную пытается чем-то уже инициализировать, то это определение ) Кстати, про @ "FLASH" я не знал. Это случайно не какая-нибудь новомодная "фишка" от IAR'а? Они там постоянно что-то меняют ( Что ещё раз подтверждает тезис о том, что нужно всегда читать документацию (
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|