Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 12:54:08

[А чем писать код?

Не знаю, как кто, но я пишу руками. =]

И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.

Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок.
Жалоба на неоднозначную трактовку сравнений.

Покажите хоть пример.Кусочек кода моего .Так как нужно писать .

Хойку.
Извините, не сдержался.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 13:15:57

ivan dimir, просто они тебе ни чего другого не могут предложить.
+2 страницы библиотека обработки кнопок
+6 страниц микроменю, это примерный подсчет
и в итоге >16 страниц "индусокода", в котором только автор может разобраться.

Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 13:33:18

ivan dimir, просто они тебе ни чего другого не могут предложить.
+2 страницы библиотека обработки кнопок
+6 страниц микроменю, это примерный подсчет
и в итоге >16 страниц "индусокода", в котором только автор может разобраться.

Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.

Что такое конечный автомат? И как его создать.Обьясните нерусскому электрику.Принцып.Или алгоритм создания этого конечного автомата.Какой ?

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 13:44:55

Это не ко мне вопрос.
Я не постиг этот >16 страничный высоко интеллектуальный код.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 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 и выше!)

Бывают автоматы иерархические: когда в каждом состоянии есть какие-то подсостояния.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 17:03:09

AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Ни знаю в чем проблема, и не ужели для каких-то кнопок применять конечный автомат?

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 20:12:04

AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Ни знаю в чем проблема, и не ужели для каких-то кнопок применять конечный автомат?

Код увеличится.И нет простоты кода.Для меня это сильно заумно.Слишком много событий.И операции.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 21:05:34

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

Один вопрос: за чем две совершенно одинаковых переменные?
Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 21:57:10

Ну так сравни объем одного и того же кода без КА и с ними!
Я уж молчу о простоте сопровождения кода. С КА воткнуть новое состояние намного проще, чем без оного!

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 22:35:38

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

Один вопрос: за чем две совершенно одинаковых переменные?
Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид

Может можно.Но по памяти в avr .Не совсем работает.С глюком.Но вижу что эклипсе др среда.Ей пофиг атомарные операции.Нужно попробывать ваш вариант.Спасибо.Я кстати подумал об этом.И у меня один маленький вопрос.В каких случаях нужно применять указатели ?

Добавлено after 9 minutes 12 seconds:
Хотя по мне две переменные. Бараны на лево.Козлы на право.Вот принцып.Код увеличился.Ну и структуры тоже код увеличили.Когда слишком много переменных .То структуры в помощь.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 05:44:06

Конечные автоматы очень удобны, быстры при разборе сложных условий, а ещё их очень просто и удобно рисовать. Заметьте, сначала рисуем автомат, а потом его кодируем. Учитесь рисовать и работать с КА, ибо это очень эффективный способ создания ПО! Заумь начинается, когда у вас при анализе получается 100500 if-then-else, а в самой глубине goto.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 07:37:07

AlanDrakes писал(а):или хотя бы обрабатывать кнопки в функции
Не знаю в чем проблема, и неужели для каких-то кнопок применять конечный автомат?


Макрос интересный, согласен. Хотя писать такие не люблю - компилятор любит их разворачивать в inline-функции, а мне привычнее немного иначе оформить код - обработка ввода, фильтры, вызов события.
Когда-то писал функции обработки меню для графического экрана, с курсором (не указателем мыши, а виртуальным, прыгающим по кнопкам) и в какой-то момент понял, что дошёл до копии классического же меню. А потом понадобилось сделать "активную" кнопку, которая ловит хуки событий. Вот там всё стало странным, но решилось небольшой модификацией примитивов обработчиков. Ладно, это другая тема уже.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 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.
пример в студию, с КА и без КА.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 08:07:13

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

Один вопрос: за чем две совершенно одинаковых переменные?
Код:
nastroyki.menu_btn
nastroyki.menu_lcd
если их объединить, то код примет вид

Меня заинтересовал ваш код у вас флаги в качестве кнопок?И меня заинтерисовала функция ScanButtons()? Что это ? И с чем его едят.Код ваш похож на мой единственное что переход на ноль при ++ и переход с нуля на 1023 при --.И замедление показаний.Ну а так ваш код лучше.Правда я использовал число 4095 дискретность ацп.1023 у avr.Да и ещё при переключении меню сначала нажимаем кнопку я выставляю флаг потом при ожатии флаг сбрасываю и срабатывает меню.

Добавлено after 2 minutes 23 seconds:
[А чем писать код?

Не знаю, как кто, но я пишу руками. =]

И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.

Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок.
Жалоба на неоднозначную трактовку сравнений.

Покажите хоть пример.Кусочек кода моего .Так как нужно писать .

Хойку.
Извините, не сдержался.

Да код написан не правильно.Но работает.Исправлю.Спасибо за замечания.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 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.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 11:48:50

Dimon456 написал:
Код:
  КА++
   switch (KA){
      case 0 : опрос_кнопок(); break;
      case 1 : действие(); break;
     case 2 : вывод_лсд(); break;
   
      default : КА=-1
   }

Вот сразу видно человека, который не понимает, что такое конечный автомат. Даже книжки не читал.

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 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: в пиииии.....();
     }
   }

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 15:04:13

Dimon456, все равно неправильно. У тебя - не конечный автомат, а тупой последовательный код, написанный через жопу!

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 15:44:56

Eddy_Em, мне что, твои куски коды сюда начать выкладывать?
В любой момент времени мы можем прерваться и прочитать состояние KA и узнать в каком состоянии находится последовательный код.
В своем проекте я хотел использовать совт_таймер, как бы не из ваших КА
но из-за того что мне стало жалко лишние 300-400 байт флеша, обошелся такой конструкцией
Так что, будешь дербанить мой код?

Re: stm32 cubeide два инкремента не совместимы.

Чт янв 20, 2022 16:41:48

Dimon456, вот, ты как раз сделал то, о чем я ТСу уже давно пытаюсь вталдычить: SysTick нужно использовать для отсчета условного внутреннего времени. И в конечных автоматах для выставления длинных задержек именно его и использовать, а не как абдуринщики вызывать delay_ms(500)!
Скажем, надо тебе сделать переинициализацию дисплея в процессе работы. А там бывают приличные паузы. Ты процесс разбиваешь на несколько кусков. Как только нужна пауза, у тебя состояние, скажем, WAIT_FOR_SOMETH. В нем тупо проверяешь: если миллисекунды натикали достаточно, то переходишь в следующее состояние, если нет - остаешься в этом.

В общем, не понял ты вообще никак, что такое конечные автоматы и в чем их прелесть. А твой код "софтового таймера" - ад какой-то.
Ответить