Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/62: Рейтинг темы: голосов - 62, средняя оценка - 4.63
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
1

Вопрос по "организации древовоидного меню"

14.06.2010, 19:49. Просмотров 11359. Ответов 23
Метки нет (Все метки)

Была 16 мая статья по организации древовидного меню.
Решил попробовать. Споткнулся с самого начала.

Код
// Указать на какой частоте работает МК в Гц
#define F_CPU 8000000UL  // Частота 8 MHz

#include <avr/io.h>      // библиотека I/O
#include <util/delay.h>  // библиотеки пауз

struct PROGMEM{
void       *Next;
void       *Previous;
void       *Parent;
void       *Child;
uint8_t     Select;
const char  Text[];
} menuItem;

#define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \
extern menuItem Next;     \
extern menuItem Previous; \
extern menuItem Parent;   \
extern menuItem Child;  \
menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, { Text }}

// для начала — пустой элемент. Который NULL на рисунке
#define NULL_ENTRY Null_Menu
menuItem   Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}};

enum {
MENU_CANCEL=1,
MENU_RESIT,
MENU_MODE1,
MENU_MODE2,
MENU_MODE3,
MENU_SENS1,
MENU_SENS2,
MENU_WARM,
MENU_PROCESS,
};

//                 NEXT,      PREVIOUS     PORENT,     CHILD
MAKE_MENU(m_s1i1,  m_s1i2,    NULL_ENTRY,  NULL_ENTRY, m_s2i1,       0, "ZAPUSK");
MAKE_MENU(m_s1i2,  m_s1i3,    m_s1i1,      NULL_ENTRY, m_s3i1,       0, "NASTROYKA");
MAKE_MENU(m_s1i3,  NULL_ENTRY,m_s1i2,      NULL_ENTRY, NULL_ENTRY,   MENU_RESIT, "Сброс");

// подменю Запуск
MAKE_MENU(m_s2i1,  m_s2i2,    NULL_ENTRY,  m_s1i1,     NULL_ENTRY,   MENU_MODE1, "Режим 1");
MAKE_MENU(m_s2i2,  m_s2i3,    m_s2i1,      m_s1i1,     NULL_ENTRY,   MENU_MODE2, "Режим 2");
MAKE_MENU(m_s2i3,  NULL_ENTRY,m_s2i2,      m_s1i1,     NULL_ENTRY,   MENU_MODE3, "Режим 3");

// подменю Настройка
MAKE_MENU(m_s3i1,  m_s3i2,    NULL_ENTRY,  m_s1i2,     m_s4i1,       0, "Давление");
MAKE_MENU(m_s3i2,  NULL_ENTRY,m_s3i1,      m_s1i2,     m_s5i1,       0, "Время");

// подменю Давление
MAKE_MENU(m_s4i1,  m_s4i2,    NULL_ENTRY,  m_s3i1,     NULL_ENTRY,   MENU_SENS1, "Датчик 1");
MAKE_MENU(m_s4i2,  NULL_ENTRY,m_s4i1,      m_s3i1,     NULL_ENTRY,   MENU_SENS2, "Датчик 2");

// подменю Время
MAKE_MENU(m_s5i1,  m_s5i2,    NULL_ENTRY,  m_s3i2,     NULL_ENTRY,   MENU_WARM, "Разогрев");
MAKE_MENU(m_s5i2,  NULL_ENTRY,m_s5i1,      m_s3i2,     NULL_ENTRY,   MENU_PROCESS, "Процесс");

volatile int main(void)

{

return 0;
}
То есть только объявлены и инициализированы структуры, относящиеся
к пунктам тестового меню.

В итоге, результат компиляции:

AVR Memory Usage
----------------
Device: atmega16

Prokram: 362 bytes (2.2% Full)
(.text + .data + .boottooder)

Data: 216 bytes (21.1% Full)
(.data + .bss + .noinit)

Вопрос в следующем, откуда "Data: 216 bytes (21.1% Full)" ?

В AVR STUDIO было выяснено, что одинаковые структуры создаются и в DATA, и в PROGROM memory!!
Это почему? Ведь вся прелесть подхода теряется (а избыточность остается).

Самое смешное, что CodeVision поступает точно также (обычно я им пользуюсь, но,
когда встал в тупик, достал из загашника WINAVR, давно хотел перейти на него).

Странно это все... В Си не силен, не пинайте сильно, если где-то туплю.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2010, 19:49
Ответы с готовыми решениями:

Вопрос по организации
Вопрос по организации. Есть нужда в организации движения заявки на ОС 1. Заявку может...

Вопрос По Организации Поиска
Здравствуйте! Для организации &quot;внутренней&quot; системы поиска документов решил создать форму с...

Вопрос по организации кода
Добрый день. Сейчас я занимаюсь написанием программы, и встретился вот с чем: В задаче нужно...

Вопрос по базе данных для организации соревнований по футболу
Вопрос в следующем: Требуется составить расписание встреч. Всего 20 команд и каждая играет по 2...

ошибка при организации меню
Здравстрвуйте ! при вызове функции vector выдаёт ошибку...c чем это связано ? ...

23
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
14.06.2010, 21:04 2
А там хитрый прикол с обьявлением данных в памяти. Их надо вынести за пределы main

Тут подробности
http://iosyitistromyss.ru/avr-uchebnyj- ... ateli.html
0
morvym_yorki
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 600
14.06.2010, 23:46 3
Цитата Сообщение от DY HOTT
А там хитрый прикол с обьявлением данных в памяти. Их надо вынести за пределы main
да они вроде и так за пределами
Код
volatile int main(void)

{

return 0;
}
вот он, пустой совсем
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
15.06.2010, 00:16 4
думаю, не задан макрос PROGMEM. а компилер думает, что это имя структуры.
0
15.06.2010, 00:16
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
15.06.2010, 00:28 5
а где #include <avr/pgmsposi.h>?
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
15.06.2010, 13:49 6
Посыпаю голову пеплом. Я ведь сам думал, что PROGMEM - это тэг структуры. Хотя сам смысл слова PROGMEM кагбэ символизирует. Разумеется, #include <avr/pgmsposi.h> решил проблему. Вывод: надо читать не только K&R, но и учебный курс. С другой стороны, я начинал с ассемблера, для меня просто дико, что при работе с указателями на память программ надо так извращаться. (как в статье, ссылку на которую дал уважаемый DY HOTT). Я, возможно, опять где-то туплю, но в Code Vision массив с квалификатором flash спокойно читается с помощью указателя, причем расположен он в раcсово правильной памяти программ и не копируется в ROM. Другое дело, как заставить CV правильно располагать структуры описателей меню?

Я знаю, что CV не очень любят. Но у меня такое чувство, что когда я возвращаюсь к WinAvr, у меня отшибает мозг. Например, открыл pgmsposi.h, и сразу закрыл pgmsposi.h, так как там разобраться нереально. Поймите, я не ругаю компилятор, просто, когда "плаваешь" в самом Си, а тут еще такие нюансы, в CV как то попроще будет. Так что, если кто силен в CV, научите, как его вразумить, чтобы он располагал структуры меню правильно. Задавать подобный вопрос на другом форуме (кот, электроникс и т.п.) смысла не имеет, так как сразу скажут типа фу CV, а с другой стороны, я не сумею правильно сформулировать вопрос (потому что неиллюзорно "плаваю"). Так что дискуссию можно продолжить (если это интересно кому-нибудь). Всем откликнувшимся - спасибо.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
15.06.2010, 15:47 7
Как-то так... Не знаю работает-ли, но компилится.
Код
typedef flash struct{
void *Next;
void *Previous;
void *Parent;
void *Child;
char Select;
char Text[10];
} menuItem;

enum{
MENU_CANCEL=1,
MENU_RESIT,
MENU_MODE1,
MENU_MODE2,
MENU_MODE3,
MENU_SENS1,
MENU_SENS2,
MENU_WARM,
MENU_PROCESS
};

#define NULL_ENTRY Null_Menu
flash menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}};

#define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \
extern flash menuItem Next;     \
extern flash menuItem Previous; \
extern flash menuItem Parent;   \
extern flash menuItem Child;  \
flash menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (char)Select, { Text }}

//                 NEXT,      PREVIOUS     PORENT,     CHILD
MAKE_MENU(m_s1i1,  m_s1i2,    NULL_ENTRY,  NULL_ENTRY, m_s2i1,       0, "ZAPUSK");
MAKE_MENU(m_s1i2,  m_s1i3,    m_s1i1,      NULL_ENTRY, m_s3i1,       0, "NASTROYKA");
MAKE_MENU(m_s1i3,  NULL_ENTRY,m_s1i2,      NULL_ENTRY, NULL_ENTRY,   MENU_RESIT, "Сброс");

// подменю Запуск
MAKE_MENU(m_s2i1,  m_s2i2,    NULL_ENTRY,  m_s1i1,     NULL_ENTRY,   MENU_MODE1, "Режим 1");
MAKE_MENU(m_s2i2,  m_s2i3,    m_s2i1,      m_s1i1,     NULL_ENTRY,   MENU_MODE2, "Режим 2");
MAKE_MENU(m_s2i3,  NULL_ENTRY,m_s2i2,      m_s1i1,     NULL_ENTRY,   MENU_MODE3, "Режим 3");

// подменю Настройка
MAKE_MENU(m_s3i1,  m_s3i2,    NULL_ENTRY,  m_s1i2,     m_s4i1,       0, "Давление");
MAKE_MENU(m_s3i2,  NULL_ENTRY,m_s3i1,      m_s1i2,     m_s5i1,       0, "Время");

// подменю Давление
MAKE_MENU(m_s4i1,  m_s4i2,    NULL_ENTRY,  m_s3i1,     NULL_ENTRY,   MENU_SENS1, "Датчик 1");
MAKE_MENU(m_s4i2,  NULL_ENTRY,m_s4i1,      m_s3i1,     NULL_ENTRY,   MENU_SENS2, "Датчик 2");

// подменю Время
MAKE_MENU(m_s5i1,  m_s5i2,    NULL_ENTRY,  m_s3i2,     NULL_ENTRY,   MENU_WARM, "Разогрев");
MAKE_MENU(m_s5i2,  NULL_ENTRY,m_s5i1,      m_s3i2,     NULL_ENTRY,   MENU_PROCESS, "Процесс");
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
15.06.2010, 17:13 8
Уважаемый xroymom. Скомпилировалось! И ROM usage - 0 bytes! Я вроде так тоже пробовал, но что-то не получалось. Огромное Вам спасибо!

Насчет, работает, или нет - отпишусь позже. Тут на основной работе запарка, а самообразование - хобби.

Но меня не покидает мысль, что Code Vision - компилятор-игрушка. Или это у меня навязчивая идея (хотя, если почитать отзывы, то CV не жалуют). В общем, на таком лояльном форуме, убедите меня, пожалуйста, перейти с него. С аргументами. Я не начинаю холивар, я не тролль. Но если мне в CV комфортно, почему же его так ругают? Может я извращенец?
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
15.06.2010, 17:23 9
Цитата Сообщение от VBO
В общем, на таком лояльном форуме, убедите меня, пожалуйста, перейти с него. С аргументами.
Зачем? Если он тебя устраивает - используй его. Если нет - ищи что-то другое.
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
15.06.2010, 17:33 10
Я понял. Но что-то мне подсказывает, что это не последний мой вопрос по меню, и по С в частности. Если не будет трудно, проконсультируйте в дальнейшем. Спасибо.
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
15.06.2010, 18:58 11
Э, ребята, Code Vision лепит структуры конечно во flash, но все их поля равны НУЛЮ! Ну как это так? Точно недокомпилятор.

Получается, я теперь каждую переменную должен за компилятором пасти? А где же он ее расположил? (КОНСТАНТУ!) А инициалазировалась ли она? (Или равна тупо 0?) Правда CV выдал тучу варнингов, а как пишет DI, варнинг в отношении указателей == критикал еррор.

И еще, он (CV) не умеет посчитать

Код
typedef flash struct{
void *Next;
void *Previous;
void *Parent;
void *Child;
char Select;
char Text[10];
} menuItem;
сколько символов передают массиву Text. Видите [10] ? Это xroymom туда его поставил. Я тоже на это вышел. Иначе, если указать char Text [], то CV пишет ошибку "too many initiotyzers"! А GCC хавает, и успешно хавает. В общем, все это сильно доставляет.

И становится вопрос, что изучать - С, или особенности разных компиляторов.

Простите, накипело. Надо, наверно, бросить это все к чертовой матери.
0
Китрин
0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 27
15.06.2010, 19:10 12
Сам буду переходить на WinAVR, c CV давно пора спрыгивать. Он иногда компилит как хочет.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
15.06.2010, 19:15 13
Цитата Сообщение от VBO
Э, ребята, Code Vision лепит структуры конечно во flash, но все их поля равны НУЛЮ! Ну как это так? Точно недокомпилятор.
Вот инклуд, который оно генерит по тому коду, который я выкладывал. Вроде все на своих местах. Изменить расширение на .yms

[3.37 Кб]
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
15.06.2010, 19:34 14
Цитата Сообщение от VBO
Я понял. Но что-то мне подсказывает, что это не последний мой вопрос по меню, и по С в частности.
а компиляторы - они такие, они все разные. в принципе, CV не такой уж ужасный, хотя IAR бесспорно - лучше. для хобби CV подходит нормально, как и gcc, только у первого больше плюшек для юзера. когда возьметесь за большие серьезные проекты (или перестанет устраивать генерируемый код) - пробуйте что-то более профессиональное. совсем уж глобальных отличий все равно нет, перейти будет не очень сложно.
Цитата Сообщение от VBO
И становится вопрос, что изучать - С, или особенности разных компиляторов.
конечно же си! особенно стандарты почитать и выучить:) тогда будет меньше "особенностей компиляторов";))
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
16.06.2010, 16:11 15
Уважаемый xroymom. А не скажете какая у Вас версия CV?

Получается следующее: правильные данные в полях структур появляются, если к данному моменту известны все входящие в структуру компоненты. Такими есть структуры, относящиеся к пунктам m_s1i3, m_s2i3,m_s4i2,m_s5i2. То есть компилятор не дружит со словом extern! Вот часть ассемблерного листинга:

Код
_Null_Menu:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s1i2:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s2i1:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s1i1:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s1i3:
.DB  LOW(_Null_Menu*2),HIGH(_Null_Menu*2),LOW(_m_s1i2*2),HIGH(_m_s1i2*2),LOW(_Null_Menu*2),HIGH(_Null_Menu*2),LOW(_Null_Menu*2),HIGH(_Null_Menu*2)
.DB  0x2,0xD1,0xE1,0xF0,0xEE,0xF1,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s3i1:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s2i2:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s2i3:
.DB  LOW(_Null_Menu*2),HIGH(_Null_Menu*2),LOW(_m_s2i2*2),HIGH(_m_s2i2*2),LOW(_m_s1i1*2),HIGH(_m_s1i1*2),LOW(_Null_Menu*2),HIGH(_Null_Menu*2)
.DB  0x5,0x52,0x45,0x5A,0x48,0x49,0x4D,0x20
.DB  0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s3i2:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s4i1:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s5i1:
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
_m_s4i2:
.DB  LOW(_Null_Menu*2),HIGH(_Null_Menu*2),LOW(_m_s4i1*2),HIGH(_m_s4i1*2),LOW(_m_s3i1*2),HIGH(_m_s3i1*2),LOW(_Null_Menu*2),HIGH(_Null_Menu*2)
.DB  0x7,0x44,0x61,0x74,0x63,0x68,0x69,0x6B
.DB  0x20,0x32,0x0,0x0,0x0,0x0,0x0,0x0
_m_s5i2:
.DB  LOW(_Null_Menu*2),HIGH(_Null_Menu*2),LOW(_m_s5i1*2),HIGH(_m_s5i1*2),LOW(_m_s3i2*2),HIGH(_m_s3i2*2),LOW(_Null_Menu*2),HIGH(_Null_Menu*2)
.DB  0x9,0x50,0x72,0x6F,0x63,0x65,0x73,0x73
.DB  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
Странный ящик. Версия этого ящика - 2.03.4. Может версия неудачная? Или я в упор чего-то не вижу.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
16.06.2010, 16:14 16
У меня 1.24.8
2.х.х когда-то пробовал, но он глючный был какой-то, по-этому откатил назад.
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
16.06.2010, 16:19 17
Спасибо за ответ, попробуем понизить версию (если найду)
0
Vbo
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
16.06.2010, 17:35 18
Поставил версию 1.25.8, и, как в сказке, получил все, что хотел. Точно такой же инклюд, как приводили выше!

Получается, сам на свои вопросы по поводу выбора компилятора ответил. Ведь день почти убил на поиск причин, а оказывается глючит CV. А если вспомить, какой безобразный он cof генерирует, то сомнений не остается.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
16.06.2010, 17:40 19
зато у него визард зачотный...
0
Kroz
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 18
02.12.2010, 14:10 20
Здравствуйте!
Уважаемый VBO, скажите пожалуйста, у Вас получилось запустить под CV данное меню?
0
02.12.2010, 14:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2010, 14:10

Составить программу для организации горизонтального меню.
Добрый день, господа!! Помогите, пожалуйста, решить задачу. Составить программу для организации...

[ВОПРОС]: Меню и вопрос при регистрации
Помогите пожалуйста. У меня vbulletin 4.0.7 и после установки в верхнем меню есть лишняя навигация....

Напечатать приглашение всем членам на очередное заседание указанной организации. Задается только вид организации, место и время сбора.
Получить практические навыки использования комбинированного типа данных СТРУКТУРА в разработке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru