BioWolf2000 3 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба в GCC есть дефайн PSTR описан так #define PSTR(s) ({static char __c[] PROGMEM = (s); &__c[0];}) легко использовать к примеру так- putLCD_P(PSTR("TEST")); Как такое сделать в IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба __flash смотри в хелпе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба __flash смотри в хелпе Если я правильно помню IAR, то __flash не поможет. __flash это эквивалент PROGMEM, а там вся фишка в GCC-шных расширениях синтаксиса (обратил внимание на то, что там стоят фигурные скобки внутри круглых, заведена переменная, ... и вообще как там всё написано?). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба К сожалению в IAR так не сделать, потому что define не может возвращать значение, это расширение GCC. В IAR это макрос должен был бы выглядеть так #define PSTR(s) ({static __flash const char __c[]= (s); &__c[0];}) но работать он не будет :( Здесь часто поднимались подобные вопросы, но решения я еще не видел. Приходится руками описывать переменную static __flash const char[] .... Или можно определить макрос вызова функции где первый параметр строка во флеше #define p_call(f,s,...) {static __flash const char __c[]= (s); f(__c,__VA_ARGS__); } Вот только если у функции один параметр строка - то этот макрос будет работать с ошибками, нужен такой вариант #define p_call1(f,s) {static __flash const char __c[]= (s); f(__c); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба К сожалению в IAR так не сделать, потому что define не может возвращать значение, это расширение GCC. Хм... А я всегда пользуюсь нижеприведенным и мне помогает :) 1. Подключить хедер "pgmspase.h" 2. В опциях проекта: Project->Options->C/C++ Compiler->Extra options, в окне Command Line записать --string_literals_in_flash. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SS85 0 11 июня, 2007 Опубликовано 11 июня, 2007 · Жалоба а разве нельзя сделать так: putLCD_P((u8 *) "TEST")? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 12 июня, 2007 Опубликовано 12 июня, 2007 · Жалоба а разве нельзя сделать так: putLCD_P((u8 *) "TEST")? так нельзя - указатели на флеш (память программы) и на данные не совместимы (доступ разными инструкциями) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться