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

 
 
> инициализация строковых констант в PROGMEM, WinAVR
ARV
сообщение Jul 22 2010, 05:04
Сообщение #1


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



известен способ:
Код
typedef void (*cmd_handler)(char*);
typedef struct {
    char *cmd;
    cmd_handler handler;
} handler_t;

PROGMEM char cmd1[] = "item 1";
PROGMEM char cmd1[] = "item 2";

PROGMEM handler_t handler[] = {
    {cmd1, cmd_run},
    {cmd2, cmd_stop}
}
который выглядит громоздко и как-то некрасиво по сравнению с вариантом, когда массив размещается в ОЗУ:
Код
PROGMEM handler_t handler[] = {
    {"item 1", cmd_run},
    {"item 2", cmd_stop}
}

неужели нет такого же или почти такого же элегантного способа описания изначального значения массива во flash? ну что-то типа
Код
PROGMEM handler_t handler[] = {
    {some_macros("item 1"), cmd_run},
    {some_macros("item 2"), cmd_stop}
}
чтобы не надо было отдельно определять строки в виде константных массивов? может, я в трех соснах заблудился?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Непомнящий Евген...
сообщение Jul 22 2010, 07:18
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Ну как минимум можно извернуться так:

Код
файл menu.inc.h

#ifdef ARRAY
#define CMD(str, cmd) {menu_str_ ## __LINE__, cmd},
#else
#define CMD(str, cmd) PROGMEM char menu_str_ ## __LINE__ = str;
#endif

CMD("item 1", cmd_run)
CMD("item 2", cmd_stop)
...

#undef CMD

Далее файл menu.c

#include "menu.inc.h"

PROGMEM handler_t handler[] = {
#define ARRAY
#include "menu.inc.h"
#undef ARRAY
};


Если меню большое, то так красивее, чем в вашем способе №1. Если маленькое, то проще не заморачиваться.

Может конечно есть какой-то более простой GCC-AVR путь, но я не в теме smile.gif Для IAR есть флажок - размещать строковые константы во флеш
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 22 2010, 08:12
Сообщение #3


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



мда... smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 22 2010, 08:21
Сообщение #4


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Код

handler_t handler[] = {
    {PSTR("item 1"), cmd_run},
    {PSTR("item 2"), cmd_stop}
}




--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 23 2010, 18:19
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



to dimka76:так делать нельзя FAQ

Цитата(ARV @ Jul 22 2010, 09:04) *
известен способ...который выглядит громоздко...неужели нет
ИМХО другого способа нет.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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