Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165

Тема конечных автоматов

12.11.2024, 17:12. Показов 1699. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Перехожу с Arduino на более углублённое программирование. На Arduino сидел уже давно и написал много параллельно выполняющегося кода на таймерах с millis() и уже приучился всю периферию и работу с ней завертывать в классы, и вызывать роботу с ней через функции, чтобы основной код был более читаем.

Сейчас познакомился с термином "конечные автоматы". И о нем пишут как о чем-то супер фантастическом и эффективном. прочитал несколько статей с примерим кода для микроконтроллеров. И либо я чего-то не улавливаю, либо конченые автоматы это и есть про "делать весь код только на таймерах с milli() и не использовать delay()" и про "Для удобства и лучшей организации блоков кода, оборачивать каждую сущность в класс или в модуль".

Опытные разработчики, можете прокомментировать, насколько я правильно понял материал?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2024, 17:12
Ответы с готовыми решениями:

Сишные шаблоны реализации конечных автоматов
Давайте поднимем такую интересную темку. Конечные автоматы. Точнее, шаблоны реализации конечных автоматов. Накидывайте сюда ваши...

Метод конечных автоматов
Дан список слов X1, X2, …, Xk и строка Y длины n. Определить, входит ли одно из слов Xi в строку Y как подстрока за время C∙n (где C...

Минимизация конечных автоматов
доброго времени суток. имеется два автомата: 1. 2. нужно их минимизировать. подразумевалось, что после минимизации они станут...

26
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
12.11.2024, 17:45
Лучший ответ Сообщение было отмечено Elesh_Makfa как решение

Решение

Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
параллельно выполняющегося кода
На ардуине? Через RTOS что ли? Ну, это "круто" - на такую восьмибитку ртось засунуть…
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
либо конченые автоматы это и есть про "делать весь код только на таймерах с milli() и не использовать delay()"
Почти. Если нужны задержки, то в локальной переменной выставляем время начала и ждем, пока текущее время не превысит нужного интервала от сохраненного. Тогда и переходим в новое состояние. Все просто.
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
оборачивать каждую сущность в класс или в модуль
Ужасный совет. Особенно для восьмибиток. Ни в коем случае нельзя использовать аллокаторы на микроконтроллерах. А это значит - забыть вообще про классы с аллокаторами. Из С++ останутся исключительно шаблоны и классы без new/delete…
1
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 18:14  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
На ардуине? Через RTOS что ли? Ну, это "круто" - на такую восьмибитку ртось засунуть…
Ну не прям параллельного кода) Просто все на milli() без delay(). А если есть что-то долгое, то разбиваю на несколько маленьких секция и каждая выполняется по очереди в следующую итерацию.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Если нужны задержки, то в локальной переменной выставляем время начала и ждем, пока текущее время не превысит нужного интервала от сохраненного.
Да, я хотел следующий вопрос сразу задать про эту деталь. Вот, допустим у меня есть класс для опроса rfid считывателя по iButton (oneWire). Я прямо в нем реализовал сам протокол OneWire, который требует пауз в микросекундах и их я сделал уже на delayMicroseconds().
Получается, нужно эти задержки тоже заменить на локальные таймеры на micros()? Сам код написать не сложно, но я переживаю, не получится ли после этого пропуски по связи? Типа из-за того, что я не ждать 15мкс через delayMicroseconds(), а выполнял что-то другое, что заняло условные 20мкс и вот я вернулся снова к обработке onewire, но прошло на 5мкс больше и какой-то сигнал уже считался не корректно.
Что думает в таком случае? Когда речь идет о проколе связи.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Ужасный совет. Особенно для восьмибиток. Ни в коем случае нельзя использовать аллокаторы на микроконтроллерах. А это значит - забыть вообще про классы с аллокаторами. Из С++ останутся исключительно шаблоны и классы без new/delete…
Плохо знаком с термином "аллокатор". Но да, я и имел ввиду простые классы и их аналог на структурах в си, без использования new/delete.
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
12.11.2024, 18:41
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
их я сделал уже на delayMicroseconds().
Если на аврке нет подходящего таймера, но есть свободный UART, 1-wire делается непринужденно без этих пауз (перенастройкой скорости UART). Правда, DMA там нет, все равно коряво.
Я делал на STM32 1-wire через DMA с таймером, удобно.
1
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 18:49  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Если на аврке нет подходящего таймера, но есть свободный UART, 1-wire делается непринужденно без этих пауз (перенастройкой скорости UART). Правда, DMA там нет, все равно коряво.
У меня такая ситуация, что я обычно подключаю штук 20 устройств по onewire. На одну шину сразу все подключить нельзя, ибо rfid считыватели не имеют своего адреса. Они вообще молчат, пока к ним не поднесешь метку. А как поднесёшь, то они просто сообщают ее id. И если повесить все на один пин, то я не смогу понять к какому считывателю поднесли метку. Поэтому приходится делать 20 пинов и программный onewire.

Поэтому что скажете насчет этого delaymicroseconds(), в данной ситуации? Как от него можно избавиться и не потерять стабильность протокола?
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
12.11.2024, 18:58
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
в данной ситуации
можно прошляпить активность с другого 1-wire.
1
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 19:04  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
можно прошляпить активность с другого 1-wire.

В плане, это утверждение/предупреждение (что без delaymicroseconds() все будет криво и нету смысла от него отказываться) или предложение/рекомендация (что ничего страшного, если где-то будет потеря данных)?
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
12.11.2024, 19:11
Просто предупреждение, что такой вариант не исключен. Но если все работает строго поочередно, то и ничего страшного.
Хотя, для подобной штуки я бы лучше взял каких-нибудь самых дешевых МК (типа CH32V003), да к каждому 1-wire устройству по одному такому добавил. А уж на ведущего пусть идет что-то более осмысленное: от 485 до CAN…
1
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
12.11.2024, 22:17
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
Как от него можно избавиться и не потерять стабильность протокола?
А повесить все на PCINT-ы и реализовать через очередь сообщений не хотите?
0
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 22:22  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
А повесить все на PCINT-ы и реализовать через очередь сообщений не хотите?
Как я понимаю в мк обычно не сильно много прерываний доступно, не знаю как правильно выразится. (не получится на 20 панов поставить прерывания для 20 меток на onewire).

Или вы имеете занять какую-то одну, а дальше через мультиплексор размножить на сколько нужно?
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
12.11.2024, 22:23
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
не получится на 20 панов поставить прерывания для 20 меток на onewire
Там PCINT включает группу портов. А вот разбирать будете в мейне, по факту получения сообщения.
Так что вполне решаемо.
Вам даже не сообщения, а тупой битовой маски будет достаточно
0
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 22:26  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
Там PCINT включает группу портов. А вот разбирать будете в мейне, по факту получения сообщения.
Типа могу выставить одно прерывание на много портов, а уже когда будет вызвана функция по прерыванию, смогу глянуть от какого пина пришло прерывание? Например, просто посмотрев, на каком пине сейчас ожидаемое состояние?
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
12.11.2024, 22:42
Elesh_Makfa,
Именно. Например у нас 3 считывтеля на PD0..PD2 Это соответственно PCINT16..PCINT18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
volatile uint8_t READER_STATES = 0;
 
#define READER_0 1
#define READER_1 2
#define READER_2 4
 
#define MAX_READERS 3
 
uint8_t BUFFERS[3][100];
 
void inline resetBuffer(const int reader) {
    memset(BUFFERS[reader],0,sizeof(BUFFERS[reader]));
}
int readBit(const int reader) {
    // Тут чтение, со всякими таймингами и прочее
    // Возвращаем 0 если все прочитано, ну или что угодно если ждем еще данных
    return 0;
}
 
int main() {
    cli();
    DDRD &= ~(_BV(PIN0) | _BV(PIN1) | _BV(PIN2)); // На вход
    PORTD |= _BV(PIN0) | _BV(PIN1) | _BV(PIN2);  // Поттяжечко
    PCMSK2 = _BV(PCINT16) | _BV(PCINT17) | _BV(PCINT18);
    PCICR = _BV(PCIE2);
    sei();
 
    while(1) {
        wdt_reset();
        for(int i=0;i<MAX_READERS;i++)
        if(READER_STATES & _BV(i)) {
            // Тут читаем один бит в буфер (именно бит, не будет тратить много времени
            if(!readBit(_BV(i))) { DDRD |= _BV(i); READER_STATES &= ~_BV(i); }
        }
    }
}
ISR(PCINT2_vect) {
        for(int i=0;i<MAX_READERS;i++) 
                if(!(PIND & _BV(i)) && !(READER_STATES & _BV(i))) {
            READER_STATES |= _BV(i);
            resetBuffer(i);
           }
        }
}
1
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
12.11.2024, 22:48  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
Именно. Например у нас 3 считывтеля на PD0..PD2 Это соответственно PCINT16..PCINT18
СУпер, выглядит как решение. Попозже обязательно проверю, спасибо!)
0
1184 / 460 / 68
Регистрация: 22.09.2023
Сообщений: 1,395
13.11.2024, 04:18
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Из С++ останутся исключительно шаблоны и классы без new/delete…
А разве кто-то говорил про new/delete? Вы снова что-то себе что-то придумали и бросились бороться с ветряными мельницами.
0
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
13.11.2024, 08:19  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Ни в коем случае нельзя использовать аллокаторы на микроконтроллерах. А это значит - забыть вообще про классы с аллокаторами. Из С++ останутся исключительно шаблоны и классы без new/delete…
Цитата Сообщение от Dushevny Посмотреть сообщение
А разве кто-то говорил про new/delete? Вы снова что-то себе что-то придумали и бросились бороться с ветряными мельницами.
Это же был ответ на сообщение выше. интернет сказал, что тема аллокатор связана с динамической выделением памяти, new(), ведь, как раз это и делает. Не говоря о том, что Комментатор прямо про new/delete в своем сообщении написал)
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
13.11.2024, 08:24
И к стати, кто сказал вам что "Ни в коем случае нельзя использовать аллокаторы на микроконтроллерах"?
Нельзя использовать их часто. Память кончится. А если у вас new вызывается при запуске микропрограммы один раз - то ничего страшного не случается. delete можно не вызывать
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
13.11.2024, 08:59
Цитата Сообщение от Azathtot Посмотреть сообщение
кто сказал
Я сказал ☺
0
82 / 2 / 0
Регистрация: 10.02.2024
Сообщений: 165
13.11.2024, 10:21  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
И к стати, кто сказал вам что "Ни в коем случае нельзя использовать аллокаторы на микроконтроллерах"?
Нельзя использовать их часто. Память кончится. А если у вас new вызывается при запуске микропрограммы один раз - то ничего страшного не случается. delete можно не вызывать
Да, я понимаю, какое-то их количество вызвать можно. Но если у меня каждый класс занимает по 1-3 байта, то ме же лучше, как я и предложил, заранее их создать, но не инициализировать. Тогда я еще на этапе компиляции буду понимать сколько памяти они займут. А уже по необходимости инициализировать их и использовать.

Что о таком варианте скажете?

А еще сейчас мысль в голову пришла: А разве нельзя, зная заранее сколько байт занимает 1 экземпляр, оставить, уловно, 1кб оперативки и в процессе работы инициализировать нужное их количество помня, что есть ограничение в 1кб. Удалять же я эти экземпляры не буду, точно. + конечно какой-то резерв по оперативке оставлять. типа там еще 500 байт. Наверное и на побочные затраты работы программы хватит и на побочные затраты работы с классами.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
13.11.2024, 10:59
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
заранее их создать, но не инициализировать.
Это как????
Цитата Сообщение от Elesh_Makfa Посмотреть сообщение
А еще сейчас мысль в голову пришла:
А возьмите m128 например. 4k памяти. И сразу все проблеммы перестанут быть проблемами. Серьезно. Или вообще XMega/STM32
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2024, 10:59
Помогаю со студенческими работами здесь

Произведение конечных автоматов
Помогите написать программу, что получает на вход 2 конечных автомата, на выходе выдает произведение этих автоматов в виде таблицы с...

Умножение конечных автоматов
Очень срочно! Нужно написать программу, которая получает на входе два конечных автомата, на выходе выдает произведение этих автоматов в...

Минимизация конечных автоматов
всем привет можете помочь? Разработать программное средство, реализующее следующие функции: 1) ввод исходного конечного автомата и...

Пример конечных автоматов
Добрый вечер! Кто-нибудь может подсказать какие-нибудь красивые примеры использования конечных автоматов (кроме компиляторов и...

Прямое произведение конечных автоматов
Не могу найти пример прямого произведения конечных автоматов. Повсюду голая теория. Где всё-таки можно найти пример?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru