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

 
 
 
Reply to this topicStart new topic
> Массив указателей на Flash, как это записать для IAR 4.11
andrvisht
сообщение Jan 16 2006, 07:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Нужно хранить строки логических параметров для вывода их как значение на ЖКД.
наиболее подходящим способом мне показалось создание массива указателей на строки.
например так:
Код
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-й - как правильно передать его функции, если вообще возможно ?

Сообщение отредактировал &-rey - Jan 16 2006, 07:31
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 16 2006, 08:13
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(&-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)


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 16 2006, 08:29
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(&-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] и будет искомой строкой


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jan 16 2006, 09:17
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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
Такой вариант я пробовал, но он мне показался неэкономичным. Ведь длина строк всего массива будет считаться по максимальной. Кроме того задавать разрядность не хочеться.

Сообщение отредактировал &-rey - Jan 16 2006, 09:19
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 16 2006, 09:24
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(&-rey @ Jan 16 2006, 12:17) *
Такой вариант я пробовал, но он мне показался неэкономичным.
Смотря что экономить ;) Если такты процессора - то мой способ экономичней B)


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 16 2006, 10:28
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(&-rey @ Jan 16 2006, 11:17) *
При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ?


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

DW a1
DW a2
...

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

и т.д.

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jan 16 2006, 10:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



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

Да, так и есть. Работает smile.gif.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:37
Рейтинг@Mail.ru


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