Постановка задачи следующая: нужно принять по uart
некоторое количество пакетов, линия может быть зашумлена и в паузах могут появлятся фантомные байты (которые передатчик не передавал), отделить пакеты от мусора и выполнить какие-то действия, скорость соединения не большая, допустим 115200
.
Статья будет являться небольшой демонтрацией для работы с FreeRTOS
и тем кольцевым буфером, о котором я однажды писал. А uart
здесь каким боком? А таким, что данная заметка будет еще и небольшим туториалом для одного хорошего человека.
Погнали...
Я думаю часто приходилось использовать коэффициенты вроде 0.78
, 0.23
, 0.87
для корректировки измереных значений АЦП, для последующей обработки, или может где-то ещё, где это значение является константой.
Но что делать если у нас есть требования ко времени выполнения и использовать float
кажется слишком дорого?
Я думаю многим нарвиться темная тема оформления в Visual Studio. Если вы один из этих людей, то предлагаю посмотреть как быстро реализовать данную расцветку в редакторе keil.
Как-то долго я не обращал внимания на эту библиотеку, но вот насталов время.
Там есть куча всяких полезностей, в том числе и быстрых математических функций. И даже вычисление целочисленного квадратного корня. Круто, я смогу отказаться от самописной реализации в пользу той, которую предлагает компания ARM.
Для начала проверим, так ли быстр армовский квадратный корень и подходит ли он именно для тех задач, для которые необходимы мне.
У меня была одна из заметок про подобную тему, но то был контроллер Миландр. На этот раз его собрат от компании STMicroelectronics - stm32f103rc
. Необходимо было задетвовать ножки порта PB3
, PB4
и PB5
- на них висит SPI1
, с помощью которого планировалось управлять переферийной микросхемой.
Постоянно приходится передавать и принимать данные из/в UART
, SPI
, I2C
и др. Всё просто и понятно когда посылки идут редко и есть время на их обработку, а что же делать если посылки могут идти пачками за один раз, а потом долгое время отсутствовать и мы при обработке первой не успеваем обрабатывать остальные и они теряются или портятся. Значит нужно использовать какой-то буфер, откуда потом понемногу брать и обрабатывать данные, а что делать если мы уже заполнили буфер и нам уже некуда писать? Писать дальше начиная с первого (на самом деле с нулевого) элемента буфера, дополнительно нужно учитывать место с которого можно читать данные и место с которого можно писать. Вот мы и получаем наш кольцевой буфер.