Цитата
Для IAR получилось так...
У меня не получается вызвать меню через символические имена:
Код
void menu_Init(void)
{
Level1Item1Sub1_Text();
SET_MENU_WRITE_FUNC(Level1Item1Sub1_Text);
SET_MENU(Level1Item1);
delay_ms(1000);
SET_MENU(PARENT);
delay_ms(1000);
SET_MENU(SIBLING);
delay_ms(1000);
SET_MENU(PREVIOUS);
delay_ms(1000);
SET_MENU(NEXT);
}
Если вызывать через имя меню :
Код
void menu_Init(void)
{
Level1Item1Sub1_Text();
SET_MENU_WRITE_FUNC(Level1Item1Sub1_Text);
SET_MENU(Level1Item1);
delay_ms(1000);
SET_MENU(Level1Item2);
delay_ms(1000);
SET_MENU(Level1Item3);
delay_ms(1000);
SET_MENU(Level1Item1);
delay_ms(1000);
SET_MENU(Level1Item2);
}
... то все нормально, т.е. с интервалом в секунду выводятся пункты меню. В оригинальном исходнике символические имя определены так:
Код
#define PREVIOUS *((Menu_Item*)pgm_read_word(&CurrMenuItem->Previous))
#define NEXT *((Menu_Item*)pgm_read_word(&CurrMenuItem->Next))
#define PARENT *((Menu_Item*)pgm_read_word(&CurrMenuItem->Parent))
#define SIBLING *((Menu_Item*)pgm_read_word(&CurrMenuItem->Sibling))
#define ENTERFUNC *((FuncPtr*)pgm_read_word(&CurrMenuItem->EnterFunc))
#define SELECTFUNC *((FuncPtr*)pgm_read_word(&CurrMenuItem->SelectFunc))
В исправленной версии от Id_Alx опущен знак &. Добавление & приводит к перезапуску программы. Манипуляции с размерами CSTACK(0x100), RSTACK(0x40) не помогает. В чем же дело?