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

 
 
> размещение строк во flash
BioWolf2000
сообщение Jun 11 2007, 15:13
Сообщение #1


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

Группа: Свой
Сообщений: 89
Регистрация: 11-01-05
Из: Беларусь, Минск
Пользователь №: 1 897



в GCC есть дефайн PSTR
описан так #define PSTR(s) ({static char __c[] PROGMEM = (s); &__c[0];})
легко использовать к примеру так- putLCD_P(PSTR("TEST"));

Как такое сделать в IAR?


--------------------
ex740104/103 БГУИР
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
slog
сообщение Jun 11 2007, 16:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



__flash смотри в хелпе


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 11 2007, 20:08
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(slog @ Jun 11 2007, 18:47) *
__flash смотри в хелпе

Если я правильно помню IAR, то __flash не поможет.
__flash это эквивалент PROGMEM, а там вся фишка в GCC-шных расширениях синтаксиса (обратил внимание на то, что там стоят фигурные скобки внутри круглых, заведена переменная, ... и вообще как там всё написано?).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 11 2007, 20:40
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



К сожалению в IAR так не сделать, потому что define не может возвращать значение, это расширение GCC.
В IAR это макрос должен был бы выглядеть так
#define PSTR(s) ({static __flash const char __c[]= (s); &__c[0];})
но работать он не будет sad.gif
Здесь часто поднимались подобные вопросы, но решения я еще не видел.
Приходится руками описывать переменную
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); }
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 11 2007, 23:11
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(KRS @ Jun 12 2007, 04:40) *
К сожалению в IAR так не сделать, потому что define не может возвращать значение, это расширение GCC.
Хм... А я всегда пользуюсь нижеприведенным и мне помогает smile.gif

1. Подключить хедер "pgmspase.h"

2. В опциях проекта: Project->Options->C/C++ Compiler->Extra options, в окне Command Line записать --string_literals_in_flash.


--------------------
Go to the top of the page
 
+Quote Post
SS85
сообщение Jun 11 2007, 23:49
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230



а разве нельзя сделать так: putLCD_P((u8 *) "TEST")?
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 12 2007, 08:56
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(SS85 @ Jun 12 2007, 03:49) *
а разве нельзя сделать так: putLCD_P((u8 *) "TEST")?

так нельзя - указатели на флеш (память программы) и на данные не совместимы (доступ разными инструкциями)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:54
Рейтинг@Mail.ru


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