ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
47852
misyachniy (04.01.2006 12:38, просмотров: 2501)
Строки и указатели в программной памяти (WinAVR) 
Использую вот такую функцию:
extern void PrintString (u08 *p, u08 SX, u08 SY); // указатель на строку и масштаб

Так объявил строку:
u08 __attribute__ ((progmem)) Vovka[]={ "Vovka The Best"};

При вызове таким образом:
PrintString(&Vovka,2,4); 

Получаю 2 ошибки
uart.h:36: warning: passing arg 1 of `PrintString' from incompatible pointer type
uart.h:37: warning: passing arg 1 of `PrintString' discards qualifiers from pointer target type

Для устранения warning объявил указатель:
void *ptrString;

и вызываю функцию так:
     ptrString=&Vovka;
     PrintString(ptrString,2,4); // указатель на строку и масштаб

Компилируется и работает без ошибок.

Но хочется сделать правильно и понять, как объявлять строки и указатели.
Решил использовать макрос PSTR.
Раньше использовал его так:

// Объявление функции 
void dbgString(const char *addr)         
{
 char c;
 while ((c=PRG_RDB(addr++))) UART1_SendByte(c);
}

// Вызов функции с передачей указателя
dbgString(PSTR("\nStart OK")); 

Переобъявил функцию и строку:

extern void PrintString_P(const char *p, u08 SX, u08 SY);
extern const char Vovka[];

Вызов как в примере PrintString_P(PSTR("FOO"),2,4);
Работает корректно.

Такой вызов вызывает ошибку:
PrintString_P(&Vovka,2,4); 
uart.h:32: warning: passing arg 1 of `PrintString_P' from incompatible pointer type

Залез в pgmspace.h посмотрел на макрос
#define PSTR(s) ({static char __c[] PROGMEM = (s); __c;})
покрутил:
const char Vovka[]={"Vovka The Best"};
const char Vovka[] PROGMEM=("Vovka The Best");
static char Vovka[]={"Vovka The Best"};
Не получается :-( 
uart.h:32: warning: passing arg 1 of `PrintString_P' from incompatible pointer type
Где выход из трех сосен? :-)
Спасибо.