Перейти к содержанию
    

Массив указателей на Flash

Нужно хранить строки логических параметров для вывода их как значение на ЖКД.

наиболее подходящим способом мне показалось создание массива указателей на строки.

например так:

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 ситуацию не изменило :(

пришлось применить запись типа:

__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};

А теперь для передачи его в функцию как аргумента обьявляю указатель на массив указателей, но :(

 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-й - как правильно передать его функции, если вообще возможно ?

Изменено пользователем &-rey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос 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] и будет искомой строкой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я обычно поступаю так

typedef char __flash * STR;
....

При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ?

Ну оно же тебе пишет что с чем инкомпатибле, следовательно

 char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm)

Да, так сработало, Спасибо.

to GxOST

Такой вариант я пробовал, но он мне показался неэкономичным. Ведь длина строк всего массива будет считаться по максимальной. Кроме того задавать разрядность не хочеться.

Изменено пользователем &-rey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой вариант я пробовал, но он мне показался неэкономичным.
Смотря что экономить ;) Если такты процессора - то мой способ экономичней B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ?

 

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

 

DW a1

DW a2

...

 

a1: db "upor",0

a2: db "upor2",0

 

и т.д.

 

Так должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

--string_literals_in_flash в дополнительных опциях компилятора.

Так должно быть.

Да, так и есть. Работает :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...