Кто любит RISC в жизни, заходим, не стесняемся.
Ср янв 19, 2022 12:54:08
[А чем писать код?
Не знаю, как кто, но я пишу руками. =]
И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.
Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок.
Жалоба на неоднозначную трактовку сравнений.
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .
Хойку.
Извините, не сдержался.
Ср янв 19, 2022 13:15:57
ivan dimir, просто они тебе ни чего другого не могут предложить.
+2 страницы библиотека обработки кнопок
+6 страниц микроменю, это примерный подсчет
и в итоге >16 страниц "индусокода", в котором только автор может разобраться.
Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.
Ср янв 19, 2022 13:33:18
ivan dimir, просто они тебе ни чего другого не могут предложить.
+2 страницы библиотека обработки кнопок
+6 страниц микроменю, это примерный подсчет
и в итоге >16 страниц "индусокода", в котором только автор может разобраться.
Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.
Что такое конечный автомат? И как его создать.Обьясните нерусскому электрику.Принцып.Или алгоритм создания этого конечного автомата.Какой ?
Ср янв 19, 2022 13:44:55
Это не ко мне вопрос.
Я не постиг этот >16 страничный высоко интеллектуальный код.
Ср янв 19, 2022 13:47:56
ivan dimir, а слабо в гугле набить "finite state machine"?
Все очень просто: алгоритм разбивается на этапы, которые можно однозначно охарактеризовать конечным количеством состояний. Все, дальше ты в switch'е проверяешь текущее состояние и выполняешь в зависимости от него какие-то действия.
Например, работа с USB основана на конечном автомате, твои кнопки удобней будет конечным автоматом реализовать и т.д., и т.п.
Я ж тебе давал ссылку на
обработку кнопок в конечном автомате:
- Код:
switch(e){
case EVT_NONE: // just pressed
case EVT_RELEASE:
if((k->counter += d) > PRESSTHRESHOLD)
k->event = EVT_PRESS;
break;
case EVT_PRESS: // hold
if((k->counter += d)> HOLDTHRESHOLD)
k->event = EVT_HOLD;
break;
default:
break;
}
(правда, этот пример неудачный. Нельзя так делать. Надо сначала выставить состояние и лишь потом ждать нужное время; а здесь выходит, что событие нажатия система получит лишь через PRESSTHRESHOLD мс, а это около 30 и выше!)
Бывают автоматы иерархические: когда в каждом состоянии есть какие-то подсостояния.
Ср янв 19, 2022 17:03:09
AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Ни знаю в чем проблема, и не ужели для каких-то кнопок применять конечный автомат?
Ср янв 19, 2022 20:12:04
AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Ни знаю в чем проблема, и не ужели для каких-то кнопок применять конечный автомат?
Код увеличится.И нет простоты кода.Для меня это сильно заумно.Слишком много событий.И операции.
Ср янв 19, 2022 21:05:34
В конечных автоматах точно будет сильно заумно, слишком много событий и операции.
Самое главное, событий, а операций там столько же будет.
Один вопрос: за чем две совершенно одинаковых переменные?
- Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид
Ср янв 19, 2022 21:57:10
Ну так сравни объем одного и того же кода без КА и с ними!
Я уж молчу о простоте сопровождения кода. С КА воткнуть новое состояние намного проще, чем без оного!
Ср янв 19, 2022 22:35:38
В конечных автоматах точно будет сильно заумно, слишком много событий и операции.
Самое главное, событий, а операций там столько же будет.
Один вопрос: за чем две совершенно одинаковых переменные?
- Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид
Может можно.Но по памяти в avr .Не совсем работает.С глюком.Но вижу что эклипсе др среда.Ей пофиг атомарные операции.Нужно попробывать ваш вариант.Спасибо.Я кстати подумал об этом.И у меня один маленький вопрос.В каких случаях нужно применять указатели ?
Добавлено after 9 minutes 12 seconds:Хотя по мне две переменные. Бараны на лево.Козлы на право.Вот принцып.Код увеличился.Ну и структуры тоже код увеличили.Когда слишком много переменных .То структуры в помощь.
Чт янв 20, 2022 05:44:06
Конечные автоматы очень удобны, быстры при разборе сложных условий, а ещё их очень просто и удобно рисовать. Заметьте, сначала рисуем автомат, а потом его кодируем. Учитесь рисовать и работать с КА, ибо это очень эффективный способ создания ПО! Заумь начинается, когда у вас при анализе получается 100500 if-then-else, а в самой глубине goto.
Чт янв 20, 2022 07:37:07
AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Не знаю в чем проблема, и неужели для каких-то кнопок применять конечный автомат?
Макрос интересный, согласен. Хотя писать такие не люблю - компилятор любит их разворачивать в inline-функции, а мне привычнее немного иначе оформить код - обработка ввода, фильтры, вызов события.
Когда-то писал функции обработки меню для графического экрана, с курсором (не указателем мыши, а виртуальным, прыгающим по кнопкам) и в какой-то момент понял, что дошёл до копии классического же меню. А потом понадобилось сделать "активную" кнопку, которая ловит хуки событий. Вот там всё стало странным, но решилось небольшой модификацией примитивов обработчиков. Ладно, это другая тема уже.
Чт янв 20, 2022 07:44:46
Eddy_Em писал(а):Ну так сравни объем одного и того же кода без КА и с ними!
я тебе даю свой рабочий проект, а ты из него делаешь КА, вот тогда и поговорим о размере кода.
Eddy_Em писал(а):С КА воткнуть новое состояние намного проще, чем без оного!
- Код:
while (1) {
ScanButtons();
новое_состояние();
tonyk писал(а):Заметьте, сначала рисуем автомат, а потом его кодируем.
под каждую задачу вы будете рисовать свой автомат, а потом его кодировать.
Универсального ни чего нет, как с теми же микроменю.
tonyk писал(а):Учитесь рисовать и работать с КА, ибо это очень эффективный способ создания ПО!
- Код:
КА++
switch (KA){
case 0 : опрос_кнопок(); break;
case 1 : действие(); break;
case 2 : вывод_лсд(); break;
default : КА=-1
}
- Код:
while(1){
опрос_кнопок();
действие();
вывод_лсд();
}
Пока что не вижу ни какой эффективности
tonyk писал(а):когда у вас при анализе получается 100500 if-then-else, а в самой глубине goto.
пример в студию, с КА и без КА.
Чт янв 20, 2022 08:07:13
В конечных автоматах точно будет сильно заумно, слишком много событий и операции.
Самое главное, событий, а операций там столько же будет.
Один вопрос: за чем две совершенно одинаковых переменные?
- Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид
Меня заинтересовал ваш код у вас флаги в качестве кнопок?И меня заинтерисовала функция ScanButtons()? Что это ? И с чем его едят.Код ваш похож на мой единственное что переход на ноль при ++ и переход с нуля на 1023 при --.И замедление показаний.Ну а так ваш код лучше.Правда я использовал число 4095 дискретность ацп.1023 у avr.Да и ещё при переключении меню сначала нажимаем кнопку я выставляю флаг потом при ожатии флаг сбрасываю и срабатывает меню.
Добавлено after 2 minutes 23 seconds:[А чем писать код?
Не знаю, как кто, но я пишу руками. =]
И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.
Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок.
Жалоба на неоднозначную трактовку сравнений.
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .
Хойку.
Извините, не сдержался.
Да код написан не правильно.Но работает.Исправлю.Спасибо за замечания.
Чт янв 20, 2022 08:28:49
ivan dimir, код не мой, код опубликовал
AlanDrakes в этой теме 2 сообщение, я просто взял и использовал.
ivan dimir писал(а):И меня заинтерисовала функция ScanButtons()?
AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
что и требовалось.
ivan dimir писал(а):что переход на ноль при ++ и переход с нуля на 1023 при --
здесь мне не понятно было, а переспрашивать не стал, в качестве демонстрации.
ivan dimir писал(а):И замедление показаний.
опять не понятно, что значит замедление?
- Код:
#define BTN_TIME 50
число 50 взято с потолка, в зависимости от тактовой частоты чипа это число будет меняться, это число больше определяет сколько надо времени держать нажатой кнопку до ее срабатывания, до установки флага.
Попробуйте поиграться от 5-250.
Чт янв 20, 2022 11:48:50
Dimon456 написал:
- Код:
КА++
switch (KA){
case 0 : опрос_кнопок(); break;
case 1 : действие(); break;
case 2 : вывод_лсд(); break;
default : КА=-1
}
Вот сразу видно человека, который не понимает, что такое конечный автомат. Даже книжки не читал.
Чт янв 20, 2022 14:28:42
tonyk, я поторопился, надо было так
- Код:
KA = 0;
while (1) {
switch (KA) {
case 0: инит_всего(); KA = 1; break;
case 1: опрос_кнопок(); KA = 2; break;
case 2: действие(); KA = 3; break;
case 3: вывод_лсд(); KA = 1; break;
default: в пиииии.....();
}
}
Чт янв 20, 2022 15:04:13
Dimon456, все равно неправильно. У тебя - не конечный автомат, а тупой последовательный код, написанный через жопу!
Чт янв 20, 2022 15:44:56
Eddy_Em, мне что, твои куски коды сюда начать выкладывать?
В любой момент времени мы можем прерваться и прочитать состояние KA и узнать в каком состоянии находится последовательный код.
В своем проекте я
хотел использовать совт_таймер, как бы не из ваших КА
но из-за того что мне стало жалко лишние 300-400 байт флеша, обошелся такой конструкцией
Так что, будешь дербанить мой код?
Чт янв 20, 2022 16:41:48
Dimon456, вот, ты как раз сделал то, о чем я ТСу уже давно пытаюсь вталдычить: SysTick нужно использовать для отсчета условного внутреннего времени. И в конечных автоматах для выставления длинных задержек именно его и использовать, а не как абдуринщики вызывать delay_ms(500)!
Скажем, надо тебе сделать переинициализацию дисплея в процессе работы. А там бывают приличные паузы. Ты процесс разбиваешь на несколько кусков. Как только нужна пауза, у тебя состояние, скажем, WAIT_FOR_SOMETH. В нем тупо проверяешь: если миллисекунды натикали достаточно, то переходишь в следующее состояние, если нет - остаешься в этом.
В общем, не понял ты вообще никак, что такое конечные автоматы и в чем их прелесть. А твой код "софтового таймера" - ад какой-то.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.