Я делал меню так:
#define ITEM_TYPE_ACTION 1
#define ITEM_TYPE_START_PROCESS 2
#define ITEM_TYPE_MENU 3
#define ITEM_TYPE_LIST_END 0
typedef struct {
const uint8_t item_string_name[ITEM_NAME_MAX_LENGTH];
const uint8_t item_type;
const void *item_ptr;
} menu_item_t;
item_ptr может указывать либо на функцию-обработчик (ITEM_TYPE_ACTION), которая выполняет однократное действие (скажем, просмотр того же списка записей), ее движок меню вызовет в своем же процессе (дело происходит под FreeRTOS), либо указатель на функцию, которую надо запустить как процесс (ITEM_TYPE_START_PROCESS), либо указатель на подменю (ITEM_TYPE_MENU), и тогда движок подгружает ветку меню по этому указателю, ну и есть служебный тип - конец ветки меню (ITEM_TYPE_LIST_END).