Добрый день.
Есть такая проблемка.
Структура меню описывается таким способом:
//Структура описывает пункт меню
typedef struct _selection
{
flash unsigned char *mas; // Указатель на название пункта
void (*function)(void); // Указатель на функцию выполняющуюся по нажатии на enter/escape
signed char ent_menu; // Флаг входа 4 бита - обычно ID меню в которое надо войти
signed char esc_menu; // Флаг выхода 4 бита - обычно ID меню в которое надо вернуться
signed char esc_poz; // Флаг выхода на уровень выше - ID пункта вышестоящего меню
unsigned char *var; // Указатель на изменяемую переменную
}SELECTION;
//Структура описывает меню/подменю
typedef struct _menu {
unsigned char id; //Номер меню/подменю
int num_selections; //Количество пунктов данного меню/подменю
flash SELECTION *m; //Указатель на массив пунктов данного меню/подменю
}MENU;
Например, главное меню (корневое):
flash static SELECTION menu_main[]={
// название, функция, ID внутрь, ID назад, ID пункта назад, переменная
// *mas, *function, ent_menu, esc_menu, esc_poz, *var
{X10, 0, MENU_VOLUME, -1, 0, 0},
.................
{X110, 0, MENU_TEMP_SENSOR, -1, 0, 0}
};
X10-110 - названия пунктов меню, вида :
flash unsigned char X10[]={"VOLUME"};
итд.
такими структурами описаны все менюшки/подменюшки.
главное меню имеет такой вид:
flash static MENU menu[] = {
// имя меню, кол-во пунктов в меню, имя структуры меню
// id, num_selections, SELECTION *m
{MAIN_MENU, 11, menu_main}, // основное меню
{MENU_VOLUME, 4, menu_volume}, // меню VOLUME
.............................
{MENU_TEMP_SENSOR, 4, menu_temp_sensor} // меню TEMP SENSOR
};
есть 2 переменные, текущее меню и текущая позиция.
в каждый момент времени мы знаем, в каком меню (номер) и в какой позиции (пункт меню) мы находимся.
а так же знаем - если ent_menu !=-1 - то значит нажав на ентер - можно перейти на уровень ниже
по кнопке ескейп - переходим на уровень выше - если указано esc_menu и esc_poz, если они равны -1 - значит мы в корневом меню, и по кнопке ескейп - выходим из меню.
все замечательно работает, бегает по менюшке с любым уровнем вложенности - у меня максимум 3.
всего главных пунктов - 11, в каждом пункте есть пара тройка подменю + кучка параметров.
но есть трабл.
если мы заходим в последний пункт - menu_temp_sensor - то при выходе из него,
на экран выводится всякая дребедень, куча символов. тоже самое происходит если мы заходим после определенного пункта (кажется 5 или 6 в предпоследнем меню).
первые 9 с половиной пунктов - работают как часы.
при этом, если выводить на экран значения текущего меню/позиции и меню/позиции куда нужно вернуться - все выводится корректно,
в момент перехода происходит какой-то сбой.
видео ролик показывающий все это дело лежит тут -
http://www.sibaudio.com/gluk.aviпричем после этого глюка, если нажать кнопку выхода из меню - выходит корректно, возвращается к дежурному экрану,
и потом снова можно зайти в меню корректно. но кроме последнего пункта.
если нужны еще какие-то исходники переходов, отрисовки - выложу.
заранее спасибо.
компилятор CodeVisionAvr 2.04
после компиляции инфа такая :
Chip: ATmega640
Clock frequency: 16,000000 MHz
Program type: Application
Memory model: Small
Optimize for: Size
(s)printf features: float, width, precision
(s)scanf features: long, width
Promote 'char' to 'int': Yes
'char' is unsigned: Yes
global 'const' stored in FLASH: Yes
8 bit enums: Yes
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 1789
12557 line(s) compiled
No errors
2 warning(s)
Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)
Data Stack area: 200h to 5FFh
Data Stack size: 1024 byte(s)
Estimated Data Stack usage: 28 byte(s)
RAM Global variables area: 600h to 638h
RAM Global variables size: 57 byte(s)
Hardware Stack area: 639h to 21FFh
Hardware Stack size: 7111 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 3673 words (7346 bytes), 11,2% of FLASH