Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 20.01.2017, 09:51  
gorlanovmax
Прохожий
 
Регистрация: 17.07.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
gorlanovmax на пути к лучшему
По умолчанию Проблема прототипа процедуры

Коллеги добрый день,

начинаю изучать МК

Корректирую имеющиеся исходники.

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

По кнопке "вниз" добавляю переход в процедуру второго меню.
При этом по кнопке "вверх" из второго меню, я должен попасть обратно в первую страницу меню.
Т.к. процедура второго меню описана выше первого, добавляю перед обоими прототип процедуры первого меню.

При этом при компиляции имею ошибку:
Linker warning: function 'key_menu' not used in data stack usage calculation due to possible recursive calls

со ссылкой на описание процедуры первого меню

Код:
void key_menu(void);

void key_menu2(void) //Вход во второе меню
{
    lcd_clear();lcd_menu2();pp_menu=2;str_print(pp_men  u);
    do{
        #asm("wdr")           
        if (UP_KEY)
        {
            #asm("wdr")
            if(pp_menu›=3){pp_menu--;str_print(pp_menu);}
            else key_menu();                              //переход обратно в первое меню
            while (UP_KEY){#asm("wdr")};delay_ms(30);
        };
        if (DOWN_KEY)
        {
            #asm("wdr")
            if(pp_menu‹=6){pp_menu++;str_print(pp_menu);}
            while (DOWN_KEY){#asm("wdr")};delay_ms(30);
        };
        if (OK_KEY)
        {
            #asm("wdr")
            if(pp_menu==2)works_menu_8();
            if(pp_menu==3)works_menu_8();
            if(pp_menu==4)works_menu_8();
            while (OK_KEY){#asm("wdr")};delay_ms(30);
        };
        }while (MENU_KEY==0);
        lcd_clear();lcd_fon();GABARIT;
};

void key_menu(void) //Вход в главное меню
{
    lcd_clear();lcd_menu();pp_menu=2;str_print(pp_menu  );
    do{
        #asm("wdr")           
        if (UP_KEY)
        {
            #asm("wdr")
            if(pp_menu›=3){pp_menu--;str_print(pp_menu);}        
            while (UP_KEY){#asm("wdr")};delay_ms(30);
        };
        if (DOWN_KEY)
        {
            #asm("wdr")
            if(pp_menu‹=6){pp_menu++;str_print(pp_menu);}
            else key_menu2();                              //переход на вторую страницу меню
            while (DOWN_KEY){#asm("wdr")};delay_ms(30);
        };
        if (OK_KEY)
        {
            #asm("wdr")
            if(pp_menu==2)works_menu_2();
            if(pp_menu==3)works_menu_3();
            if(pp_menu==4)works_menu_4();
            if(pp_menu==5)works_menu_5();
            if(pp_menu==6)works_menu_6();
            if(pp_menu==7)works_menu_7();
            while (OK_KEY){#asm("wdr")};delay_ms(30);
        };
        }while (MENU_KEY==0);
        lcd_clear();lcd_fon();GABARIT;
};
Реклама:
gorlanovmax вне форума  
Непрочитано 20.01.2017, 11:10  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 34 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Прототип тут ни при чем. Это не ошибка, а предупреждение, это первое. А второе, у Вас по коду возможен рекурсивный вызов т.е. из key_menu вызывается key_menu2, а из key_menu2 возможен вызов key_menu, этот круг может замкнуться, со всеми вытекающими ( переполнение стека и зависание ). Об этом Вас компилятор и предупреждает. Весь код анализировать лениво, но вряд-ли эта рекурсия была изначально задумана. Надо Вам пересмотреть подход, а лучше поизучать примеры меню, в сети их полно.

Последний раз редактировалось shindax; 20.01.2017 в 11:15.
shindax вне форума  
Непрочитано 20.01.2017, 11:27  
gorlanovmax
Прохожий
 
Регистрация: 17.07.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
gorlanovmax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Сообщение от shindax Посмотреть сообщение
Это не ошибка, а предупреждение, это первое.
Действительно, спасибо

Рекурсия была задумана изначально, для перехода по страницам меню
gorlanovmax вне форума  
Непрочитано 20.01.2017, 12:12  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Сообщение от gorlanovmax Посмотреть сообщение
Рекурсия была задумана изначально, для перехода по страницам меню
Из нижнего меню должен быть ВОЗВРАТ в верхнее, а не очередной переход. Тогда и не будет рекурсивной неопределенности.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 20.01.2017, 12:16  
gorlanovmax
Прохожий
 
Регистрация: 17.07.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
gorlanovmax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Сообщение от akegor Посмотреть сообщение
Из нижнего меню должен быть ВОЗВРАТ в верхнее, а не очередной переход. Тогда и не будет рекурсивной неопределенности.
Подскажите, как правильно это сделать?
Не могу найти примеров
gorlanovmax вне форума  
Непрочитано 20.01.2017, 12:28  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 34 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

В функции key_menu2, вместо
Код:
else key_menu();
напишите
Код:
else return ;
Но повторюсь, код надо анализировать, чтобы дать вразумительный совет.
shindax вне форума  
Эти 2 пользователя(ей) сказали Спасибо shindax за это сообщение:
akegor (20.01.2017), gorlanovmax (25.01.2017)
Непрочитано 20.01.2017, 19:33  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

А без двух подпрограмм в одной все сделать?
pp_menu - вроде как указатель на текущий пункт меню?
Вот и отрабатывать вывод меню на его основе.
А кнопки вверх-вниз отрабатывать в кольце - до начала/конца меню, отображать оставшиеся, в начале/конце переходить на конец/начало. Конец - общее количество - размер экрана или 1.
Листать можно хоть на пункт, хоть на экран.
Как то так.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
gorlanovmax (21.01.2017)
Непрочитано 20.01.2017, 21:18  
gorlanovmax
Прохожий
 
Регистрация: 17.07.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
gorlanovmax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Сообщение от mike-y-k Посмотреть сообщение
А без двух подпрограмм в одной все сделать?
pp_menu - вроде как указатель на текущий пункт меню?
Вот и отрабатывать вывод меню на его основе.
А кнопки вверх-вниз отрабатывать в кольце - до начала/конца меню, отображать оставшиеся, в начале/конце переходить на конец/начало. Конец - общее количество - размер экрана или 1.
Листать можно хоть на пункт, хоть на экран.
Как то так.
Спасибо за наводку, до этого я не допер.
gorlanovmax вне форума  
Непрочитано 20.01.2017, 23:44  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Проблема прототипа процедуры

Ещё подсказка:

Делается просто набор "экранов". У каждого свой ID.
Ну и вызывается функция отрисовки нужного "экрана".
При нажатии клавиш выбирается действие, исходя из ID текущего "экрана".

Этот простой алгоритм позволит создавать меню любой сложности. И никаких рекурсий.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
gorlanovmax (21.01.2017)
Непрочитано 25.01.2017, 07:15  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 34 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Проблема прототипа процедуры

Это называется "Метод конечных автоматов", когда переход из состояния в состояние, осуществляется на основе действия и текущего состояния. Т.е. заводится некая переменная state, которая принимает какие-то заранее описанные значения, т.е. нужно исключить переход системы в несуществующее состояние, логику нужно продумывать. Например state=st_cur_screen. При нажатии на кнопку next, переход к следующему экрану : state = st_cur_screen, при нажатии на кнопку prev, переход к предыдущему экрану : state = st_prev_screen. Обычно заводится большой case, в котором в зависимости от текущего состояния и произошедшего действия, происходит переход к новому состоянию и вызов какой-то функции. В сети есть примеры, например вот:
https://habrahabr.ru/post/241941/
или вот :
http://chipenable.ru/index.php/progr...e-machine.html

Есть ещё метод, когда в зависимости от нового состояния меняется глобальный указатель на заранее описанную функцию с нужным контекстом. Всё зависит от сложности меню и ресурсов МК.
shindax вне форума  
Сказали "Спасибо" shindax
gorlanovmax (25.01.2017)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с FT232BM (FT232BL) anbsoft Микроконтроллеры, АЦП, память и т.д 27 07.08.2010 09:33
Проблема с DC/DC locostudy Источники питания и свет 2 03.11.2008 12:10
p30f6010A проблема с переключением состояния портов Ilya Микроконтроллеры, АЦП, память и т.д 8 22.09.2008 09:14
FT232BM проблема с прошивкой EEPROM zms2003 Микроконтроллеры, АЦП, память и т.д 3 27.06.2008 07:18
Проблема с ЛСД Zemlyanov Делимся опытом 4 12.01.2007 20:53


Часовой пояс GMT +4, время: 11:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot