bingo 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Здравствуйте Есть большой набор не изменяемых массивов байт (целевые команды). Размещать из в RAM- не рационально. Подскажите пожалуйста как объявить в IAR ARM С инициализированный массив , так чтобы он был расположен во FLASH, а не в RAM. Естественно, массив только для чтения. Ранее для IAR AVR я делал так: __flash char* num1 = "58749455350"; Для IAR ARM v6.21 это не проходит. Но и такие объявления не получаются: uint8_t Cmd [] = {3,2,1} @ "FLASH"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyL 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Так должно получиться static const uint8_t Cmd [] = {3,2,1}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Так должно получиться static const uint8_t Cmd [] = {3,2,1}; Неее! Модификатор static не для этого! static переменная все равно будет расположена в RAM, но только инициализироваться до main() и др. Пробовал модификаторы @ и pragma, но пока не получается :-( Неужели никто не знает как разместить массив в ROM (FLASH)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Неее! Модификатор static не для этого! Ключевое слово здесь не static, а const. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Ключевое слово здесь не static, а const. const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data. Я думаю, что необходимо обратиться к доке на компилятор, и внимательно посмотреть, что там и к чему... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба const, если мне не изменяет память, также может быть в ОЗУ размещен. Пример - x86. При этом компилятор запрещает изменение этой константы на этапе компиляции, и разместит ее в секции .data. Может. Даже на многих DSP процессорах(например, TMS320C5509A) это так :) Потому что там нет FLASH памяти, с которой напрямую может работать ядро(маппируется в его адресное пространство + аппаратный кэш выборки команд для того, чтобы память успевала за тактовой ядра). Поэтому что остаётся делать линкеру с таким условием? Размещать в ОЗУ. А в тех контроллерах где есть такая возможность(есть встроенная FLASH), данное ключевое слово попросит линкер разместить переменную именно в ней. Вопрос был про STM32(да даже если про LPC21xx-24xx). Там есть FLASH на борту. Так что всё верно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Ключевое слово здесь не static, а const. +1 Этого должно хватать для того чтобы данные разместились во флеше, при условии что они глобальные (вне функции обявлены). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 18 мая, 2012 Опубликовано 18 мая, 2012 (изменено) · Жалоба +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) очень полезна. Изменено 18 мая, 2012 пользователем bingo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Вот цитата из документации ("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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 18 мая, 2012 Опубликовано 18 мая, 2012 (изменено) · Жалоба Может где-то не там смотрите... Причина может быть в настройках проекта или ещё в чём-нибудь . Создал массив по адресу(__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}; Изменено 18 мая, 2012 пользователем bingo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба ... А есть еще потребность, чтобы было просто во FLASH (неважно где). Для этого используется нотация .... @ "FLASH"; Она как раз и не работает с инициализированным при объявлении массивом Это у Вас не работает! ;) У меня почему-то работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Верно, но это (@ 0x1005) вариант использования когда нужно разместить по конкретному location А есть еще потребность, чтобы было просто во FLASH (неважно где) Верно. Есть такая потребность: __root const unsigned char Test[3]={ 1,2,3 }; В проекте я отключил оптимизацию (none). А ведь пригодится... Оптимизация none/high. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 18 мая, 2012 Опубликовано 18 мая, 2012 (изменено) · Жалоба Это у Вас не работает! ;) У меня почему-то работает. Я же перед Вашим постом написал, что все уже 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 }; А ведь пригодится... Оптимизация none/high. Конечно же позже я ее включю :rolleyes: Дайте только все отладить. Изменено 18 мая, 2012 пользователем bingo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Я же перед Вашим постом написал, что все уже OK Просто, вместо правильного синтаксиса: uint8_t HCI_Reset[] @ "FLASH" = {3,2,1}; Вы не поняли. У меня никакого "FLASH" нет, это видно на картинке, и все работает правильно. Что наводит на мысли, где же Вы свою переменную объявляете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Что наводит на мысли, где же Вы свою переменную объявляете. Прошу прощения за буквоедство, но раз он переменную пытается чем-то уже инициализировать, то это определение ) Кстати, про @ "FLASH" я не знал. Это случайно не какая-нибудь новомодная "фишка" от IAR'а? Они там постоянно что-то меняют ( Что ещё раз подтверждает тезис о том, что нужно всегда читать документацию ( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться