Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Массив указателей на Flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
andrvisht
Нужно хранить строки логических параметров для вывода их как значение на ЖКД.
наиболее подходящим способом мне показалось создание массива указателей на строки.
например так:
Код
char *EnumMes[] = {"Вкл\0Выкл","Авто\0Ручн","Зан\0Ocв"};

но такое размещение строк производится в ОЗУ а хотелось бы во FLASH, и вот тут проблема:
Код
char __flash *EnumMes[] = {"Вкл\0Выкл","Авто\0Ручн","Зан\0Ocв"};
Error: a value of type "char *" cannot be used to initialize an entity of type "char __flash *"

т.е. указатель на Flash не может указать на данные в SRAM которыми, видимо, являются мои строки.
Включение опции --string_literals_in_flash ситуацию не изменило sad.gif
пришлось применить запись типа:
Код
__flash char mess1[] = "Вкл\0Выкл";  // Точность параметра=10
__flash char mess2[] = "Авто\0Ручн"; // Точность параметра=11
__flash char mess3[] = "Зан\0Ocв";   // Точность параметра=12
char __flash *EnumMes[] = {mess1, mess2, mess3};

Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ?

Далее полученный массив указателей на Flash строки можно тоже запихнуть во flash (хотя наверное доступ к нему из-за этого увеличиться :-) )
Код
... __flash char __flash *EnumMes[] = {mess1, mess2, mess3};

А теперь для передачи его в функцию как аргумента обьявляю указатель на массив указателей, но sad.gif
Код
char __flash *GetEnumMes(char __flash **EnumMess, char dPrm, char fPrm)
Error: argument of type "char __flash *__flash *" is incompatible with parameter of type "char __flash **"

Вопрос 2-й - как правильно передать его функции, если вообще возможно ?
Rst7
Цитата(&-rey @ Jan 16 2006, 09:29) *
Код
__flash char mess1[] = "Вкл\0Выкл";  // Точность параметра=10
__flash char mess2[] = "Авто\0Ручн"; // Точность параметра=11
__flash char mess3[] = "Зан\0Ocв";   // Точность параметра=12
char __flash *EnumMes[] = {mess1, mess2, mess3};

Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ?


Я обычно поступаю так
Код
typedef char __flash * STR;

....

// Сообщения основного меню
__flash STR Message_MainMenu[]=
{
(STR)"Фотон-А",
(STR)"Просмотр архива событий",
(STR)"Перезапуск системы",
(STR)"Конфигурация ПУ",
(STR)"Конфигурация ППКП",
(STR)"Конфигурация извещателей",
(STR)"Конфигурация зон",
(STR)"Конфигурация ТК",
(STR)"Конфигурация БРА",
(STR)"Конфигурация АПС",
(STR)"Изменение адресов",
(STR)"Отладка приборов"
};


Цитата
Код
char __flash *GetEnumMes(char __flash **EnumMess, char dPrm, char fPrm)
Error: argument of type "char __flash *__flash *" is incompatible with parameter of type "char __flash **"

Вопрос 2-й - как правильно передать его функции, если вообще возможно ?


Ну оно же тебе пишет что с чем инкомпатибле, следовательно
Код
char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm)
GxOST
Цитата(&-rey @ Jan 16 2006, 10:29) *
Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ?
Вопрос 2-й - как правильно передать его функции, если вообще возможно ?


Я делаю так:
Код
const char __flash mess[][MESS_MAX_LEN]={"OK", "ERROR"};
#define MESS_OK 0
#define MESS_ERROR 1

и передаю в функцию не указатель, а номер строки n (в данном случае - MESS_OK или MESS_ERROR), а там уж mess[n] и будет искомой строкой
andrvisht
Цитата(Rst7 @ Jan 16 2006, 12:13) *
Я обычно поступаю так
Код
typedef char __flash * STR;
....

При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ?
Цитата
Ну оно же тебе пишет что с чем инкомпатибле, следовательно
[code] char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm)

Да, так сработало, Спасибо.
to GxOST
Такой вариант я пробовал, но он мне показался неэкономичным. Ведь длина строк всего массива будет считаться по максимальной. Кроме того задавать разрядность не хочеться.
GxOST
Цитата(&-rey @ Jan 16 2006, 12:17) *
Такой вариант я пробовал, но он мне показался неэкономичным.
Смотря что экономить ;) Если такты процессора - то мой способ экономичней B)
Rst7
Цитата(&-rey @ Jan 16 2006, 11:17) *
При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ?


--string_literals_in_flash в дополнительных опциях компилятора. В результате этого дела будет создан массив указателей на строки:

DW a1
DW a2
...

a1: db "upor",0
a2: db "upor2",0

и т.д.

Так должно быть.
andrvisht
Цитата(Rst7 @ Jan 16 2006, 14:28) *
--string_literals_in_flash в дополнительных опциях компилятора.
Так должно быть.

Да, так и есть. Работает smile.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.