Продолжу тему. У меня возникла необходимость создать грамотное меню с кучей подменю для своего устройства. Облазив этот форум, понял, что наилучший вариант по возможности в дальнейшем расширять меню, по требовательности к памяти... - это micro-menu.
Программирую на CVAVR для МК Мега16
Общий смысл работы этого меню примерно, точнее сказать смутно

, представляю, поэтому начал потихоньку разбираться что где и как. В интернете по нему информации почти никакой. Нашел сайт создателя с его разработками, но там по теме микроменю ссылка на сайт
http://avrfreaks.net/, но туда пускают только зарегеных пользователей. Зарегится мне не получилось. Вот решил тогда здесь спросить у знающих людей.
Предупреждаю заранее, СИ я начал изучать месяц назад, но меню грамотное нужно обязательно, так что не пинайте если что за то, что я взялся за работу не по зубам. По мне так лучше день потерять, потом за пять минут долететь. (с) Как раз поможет углубленно изучит СИ.
В общем так, комментариев там нету. Поэтому первым делом я начал добавлять комментарии. Вот докуда я дошел:
Код
/ MICRO_MENU.H
#ifndef _MENU_H_
#define _MENU_H_
//Тут указываются указатели на функции
typedef void (* FuncPtr) (void);
/*Новый тип FuncPtr - указатель на функцию,
которая ничего не принимает
и не возвращает
*/
typedef void (* WriteFuncPtr) (const char*);
/*Новый тип WriteFuncPtr - указатель на функцию,
входным параметром которой является указатель на строку в ПЗУ,
которая ничего не вовращает
*/
typedef struct PROGMEM {
void *Next; //Следующее меню
void *Previous; //Предыдущее меню
void *Parent; //Родительское меню
void *Sibling; //Дочернее меню (вложение)
FuncPtr SelectFunc; //Выбор фнкции при выборе меню
FuncPtr EnterFunc; //Выбор функции при входе в меню (Применяется после того, как текст меню отображен)
const char Text[22]; //Текст меню
} Menu_Item;
//Externs
extern WriteFuncPtr *WriteFunc; //Переменная-указатель на функцию
extern Menu_Item Null_Menu; //Переменная типа PROGMEM
extern Menu_Item *CurrMenuItem; //Переменная-указаетль на данные типа PROGMEM
//Defines and Macros
#define NULL_ENTRY Null_Menu
#define NULL_FUNC 0
#define NULL_TEXT 0x00
#define PREVIOUS *((Menu_Item*)pgm_read_word(&CurrMenuItem->Previous))
Вот теперь возник затык на последней строчке.
1. pgm_read_word - то я так понимаю функция из прикрепленного <avr/pgmspace.h> в оригинальном тексте. В примере выше для IAR эта строка отсутствовала, поэтому я тоже ее удалил.
2.Теперь я попытался разобраться для чего эта строка нужна.
В примере использования было так:
Код
SET_MENU(PREVIOUS);
Смотрим что такое SET_MENU
Код
#define SET_MENU(x) \
MenuChange((Menu_Item*)&x);
Делаем подстановку:
Код
SET_MENU(PREVIOUS); == MenuChange((Menu_Item*)&*((Menu_Item*)(&CurrMenuItem->Previous)));
Вот с этой строкой я не могу разобраться, особенно с сочетанием
&*В общем если есть знающие люди и особенно те, кто уже работал с этим меню, отзовитесь.