Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инициализация строковых констант в PROGMEM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
ARV
известен способ:
Код
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}
}
чтобы не надо было отдельно определять строки в виде константных массивов? может, я в трех соснах заблудился?
Непомнящий Евгений
Ну как минимум можно извернуться так:

Код
файл 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 есть флажок - размещать строковые константы во флеш
ARV
мда... smile.gif
dimka76
Код

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


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

Цитата(ARV @ Jul 22 2010, 09:04) *
известен способ...который выглядит громоздко...неужели нет
ИМХО другого способа нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.