Наверное все таки без чужой помощи я не разберусь с указателями и хранением данных в памяти программ avr...
меню строиться по Уникальным Номерам numitem пунктов и ссылкам на них nextitem, previtem, upitem, downitem
nextitem и previtem - это ссылки на следующий/предыдущий пункты в пределах одного уровня меню
все down up next prev itemы ссылаются на numitem соответстующего пункта (чтобы не задумываться о количестве элементов меню и о их номере в массиве)
параметр *pvar это по задумке указатель на переменную соответствующую параметру пункта меню (например имя модели, количество каналов управления и так далее) параметр соответственно в RAM
Код: Выделить всё
flash const MENU_STRUCT menu[43]={
//numitem, itemstr , nextitem, previtem, upitem, downitem, *pvar , partype
{ 0, "MAIN MENU >" , 0 , 0 , 0 , 10 , 0 , 0 },
{ 10, "MODEL >" , 20 , 0 , 0 , 11 , 0 , 0 },
{ 20, "SYSTEM >" , 0 , 10 , 0 , 21 , 0 , 0 },
// подменю MODEL
{ 11, "NEW >" , 12 , 0 , 10 , 0 , 0 , 0 },
{ 12, "SELECT >" , 13 , 11 , 10 , 0 , 0 , 0 },
{ 13, "EDIT >" , 14 , 12 , 10 , 31 , &rmodel.MODEL_NAME , 10 },
{ 14, "COPY >" , 15 , 13 , 10 , 0 , 0 , 0 },
{ 15, "RESET >" , 16 , 14 , 10 , 0 , 0 , 0 },
{ 16, "DELETE >" , 0 , 15 , 10 , 0 , 0 , 0 },
// подменю SYSTEM
{ 21, "ALARM >" , 22 , 0 , 20 , 0 , 0 , 0 },
{ 22, "TIMERS >" , 23 , 21 , 20 , 0 , 0 , 0 },
{ 23, "DISPLAY >" , 24 , 22 , 20 , 0 , 0 , 0 },
{ 24, "CALIBRATION >" , 25 , 23 , 20 , 0 , 0 , 0 },
{ 25, "TX-RX TEST >" , 26 , 24 , 20 , 0 , 0 , 0 },
{ 26, "VERSION >" , 0 , 25 , 20 , 0 , 0 , 0 },
// подменю MODEL - EDIT
{ 31, "TYPE =" , 32 , 0 , 13 , 0 , &rmodel.MODEL_TYPE , 0 },
{ 32, "NAME =" , 33 , 31 , 13 , 0 , &rmodel.MODEL_NAME , 10 },
{ 33, "TIMERS >" , 34 , 32 , 13 , 41 , &rmodel.MODEL_LIVETIMER , 9 },
{ 34, "CHANNELS >" , 36 , 33 , 13 , 51 , &rmodel.MODEL_CH_COUNT , 1 },
{ 36, "FLY MODES >" , 0 , 34 , 13 , 71 , &rmodel.FMODE_COUNT , 1 },
// подменю MODEL - EDIT - TIMERS
{ 41, "FLY TIMER =" , 42 , 0 , 33 , 0 , &rmodel.MODEL_FLYTIMER , 9 },
{ 42, "LIVETIMER =" , 43 , 41 , 33 , 0 , &rmodel.MODEL_LIVETIMER , 9 },
{ 43, "RESET FLY TIMER " , 0 , 42 , 33 , 0 , 0 , 0 },
// подменю MODEL - EDIT - CHANNELS
{ 51, "CH COUNT =" , 52 , 0 , 34 , 0 , &rmodel.MODEL_CH_COUNT , 1 },
{ 52, "END POINTS >" , 0 , 51 , 34 , 81 , 0 , 0 },
// подменю MODEL - EDIT - FLY MODES
{ 71, "FLY MODE COUNT =" , 72 , 0 , 36 , 0 , &rmodel.FMODE_COUNT , 1 },
{ 72, "FLY MODE EDIT >" , 0 , 71 , 36 , 0 , 0 , 0 },
// подменю MODEL - EDIT - CHANNELS - END POINTS
{ 81, "CH1 LEFT =" , 82 , 0 , 52 , 0 , &(rmodel.CH_EPL[0]) , 4 },
{ 82, "CH1 RIGHT =" , 83 , 81 , 52 , 0 , &rmodel.CH_EPR[0] , 4 },
{ 83, "CH2 LEFT =" , 84 , 82 , 52 , 0 , &rmodel.CH_EPL[1] , 4 },
{ 84, "CH2 RIGHT =" , 85 , 83 , 52 , 0 , &rmodel.CH_EPR[1] , 4 },
{ 85, "CH3 LEFT =" , 86 , 84 , 52 , 0 , &rmodel.CH_EPL[2] , 4 },
{ 86, "CH3 RIGHT =" , 87 , 85 , 52 , 0 , &rmodel.CH_EPR[2] , 4 },
{ 87, "CH4 LEFT =" , 88 , 86 , 52 , 0 , &rmodel.CH_EPL[3] , 4 },
{ 88, "CH4 RIGHT =" , 89 , 87 , 52 , 0 , &rmodel.CH_EPR[3] , 4 },
{ 89, "CH5 LEFT =" , 90 , 88 , 52 , 0 , &rmodel.CH_EPL[4] , 4 },
{ 90, "CH5 RIGHT =" , 91 , 89 , 52 , 0 , &rmodel.CH_EPR[4] , 4 },
{ 91, "CH6 LEFT =" , 92 , 90 , 52 , 0 , &rmodel.CH_EPL[5] , 4 },
{ 92, "CH6 RIGHT =" , 93 , 91 , 52 , 0 , &rmodel.CH_EPR[5] , 4 },
{ 93, "CH7 LEFT =" , 94 , 92 , 52 , 0 , &rmodel.CH_EPL[6] , 4 },
{ 94, "CH7 RIGHT =" , 95 , 93 , 52 , 0 , &rmodel.CH_EPR[6] , 4 },
{ 95, "CH8 LEFT =" , 96 , 94 , 52 , 0 , &rmodel.CH_EPL[7] , 4 },
{ 96, "CH8 RIGHT =" , 0 , 95 , 52 , 0 , &rmodel.CH_EPR[7] , 4 },
// 100
};
почему то меню которое я объявил flash const - то есть константа которую нужно хранить в памяти программ - помещается в RAM !!
Странно ! переменная rmodel объявлена в RAM адреса у нее не меняются (структура постоянна в размерах)...