Делимся опытом Наступив на грабли - сообщи другим! Обмен опытом разработки и ремонта электронных устройств. |
22.11.2011, 18:23
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Как в IAR C разместить "text" в флеш памяти?
Имеется процедура вывода строки на LCD, хотелось бы обращаться к ней как - ну скажем - out2lcd("строка"). В этом случае компилятор располагает "строка" в ОЗУ, что (IMHO) нехорошо - ведь в любом случае эта же строка есть и в ПЗУ. Хотелось бы брать ее именно оттуда - таких строк много, ОЗУ жалко, а время доступа в этом случае несущественно.
Можно, конечно, строки все объявлять как
Цитата:
|
char __flash info02[]="(c)nml@tut.by\0";
|
и обращаться как к строке __flash. Но это нечитабельно и неудобно - вместо строки есть имя переменной.
Вроде есть такая штука как --initializers_in_flash - но судя по отладчику это ни на что не влияет.
Подскажите - где я туплю? Или желаемое невозможно?
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.11.2011, 18:45
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
В опциях компилятора есть вкладка "Code", там есть пунктик про размещение констант и строк в инициализированной РАМ. Если галочку снять, для них потом надо выделить сегмент (указать). Но вот что дальше - не пробовал, и сейчас к сожалению не могу. Может оно...
__________________
Sex, Druggs, Rock&Roll
|
|
|
Сказали "Спасибо" alberio
|
|
|
22.11.2011, 18:53
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Сообщение от alberio
|
В опциях компилятора есть вкладка "Code", там есть пунктик про размещение констант и строк в инициализированной РАМ.
|
Я там вижу - вот на рисунке. И вроде как вместе с "-y" ключом - должно делать нужное мне, если я правильно прочел документацию.
Код:
|
Use this option to place aggregate initializers in flash memory. These initializers are
otherwise placed in the external segments _C or in the flash segments _F if the compiler
option -y was also specified.
An aggregate initializer—an array or a struct—is constant data that is copied to the stack
dynamically at runtime, in this case every time a function is entered.
The drawback of placing data in flash memory is that it takes more time to copy it; the
advantage is that it does not occupy memory in the data space. |
Но, увы, в любых комбинациях - вижу что все строки лежат в конце флеша, и при запуске опять же ВСЕ РАЗОМ копируются в ОЗУ. Вот и не пойму - где я дурак.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.11.2011, 18:57
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
у вас на скриншоте галочка, про которую я говорил, затемнена, и снять ее низзя - а странно...
__________________
Sex, Druggs, Rock&Roll
|
|
|
Сказали "Спасибо" alberio
|
|
|
22.11.2011, 19:08
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Сообщение от alberio
|
у вас на скриншоте галочка, про которую я говорил, затемнена, и снять ее низзя - а странно...
|
Блин, а вот на нее я внимания ине обратил - серая - значит и не надо... Спасибо... Копаем тут
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.11.2011, 19:24
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Сообщение от nml
|
Код:
|
char __flash info02[]="(c)nml@tut.by\0"; |
|
А может...
Код:
|
__flash const char info02[]="(c)nml@tut.by\0"; |
???
|
|
|
|
22.11.2011, 19:31
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Сообщение от st_1
|
А может...
|
Не. Я хочу не объявлять где-то эту строку, а написать ее прямо в параметрах вызова процедуры.
Тут дело - как правильно указал alberio - в том, что нужную мне галочку я не могу убрать. И похоже что никак - в доках скриншот экрана тоже с затемненной. Засада, однако.
PS Лопатим инет и находим на сахаре:
Цитата:
|
Это если Processor configuration стоит --cpu=m8, а если выберу -v1, 64K data, 8K code, опция становится доступной. Интересно какая ему разница? Ну да ладно, не это важно.
Я так понял, если поставить эту галку, то стартап скопирует все константы и литералы в ОЗУ. Что еще уменьшит его свободный размер. А про "лишний" байт я чего-то не понял. В tini адреса переменных 1 байт, в small 2 байта, но это не влияет на длину переменных.
|
Вот те на...
__________________
[ жизнь приятна и красива, если выпить литр пива ]
Последний раз редактировалось nml; 22.11.2011 в 19:38.
|
|
|
|
22.11.2011, 21:48
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Сообщение от nml
|
Вот те на...
|
Как в том анекдоте - вот те раз! -вот те два...
Посмотрел в симуляторе - на первый взгляд - строк в ОЗУ нету. Глянул код - берутся из ОЗУ! Но адрес не привычный 0x60 (программа-минимальная, чисто для проверки) - а 0x1160!
Не думаю, что у АВРок флеш ремаппится на область ОЗУ - нигде не читал о таком. Следовательно, это просто какой-то глюк. Продолжаю поиск, хотя и без особой уже надежды.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
23.11.2011, 00:44
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Как в IAR C разместить "text" в флеш памяти?
Ну вот, сам вопрос задал, сам и ответил. Дальнейшее штудирование инета принесло - в компилере есть недокументированный ключ командной строки,
Код:
|
--string_literals_in_flash |
Его надо вставить в Options -› C/C++ compiler -› Extra options
***** мать, как все просто. Как я понимаю, это и есть та "затемненная" галочка... Одно радует- это не я такой дурак, это глюк (или фича?) IARа.
На первый взгляд код строится правильный, завтра проверю на реальном железе.
PS Да, все работает. О, сколько нам отрытий чудных отроется, коль поискать....
__________________
[ жизнь приятна и красива, если выпить литр пива ]
Последний раз редактировалось nml; 23.11.2011 в 11:25.
|
|
|
|
22.08.2017, 18:35
|
|
Частый гость
Регистрация: 09.04.2007
Сообщений: 35
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как в IAR C разместить "text" в флеш памяти?
--string_literals_in_flash кто знает как применить что-то вроде этого только к определенному куску кода?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:06.
|
|