Обмен технологиями

Архитектура программного обеспечения микроконтроллера Последовательный (5) — очередь

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

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

Фактически, в 2018 году я записал серию видеороликов по архитектуре программ, которые включали пошаговые руководства по формированию очередей, а также серию практических мыслей и методов программирования высокого уровня. Это было хорошо принято и признано многими поклонниками и пользователями. друзья. .

Однако, поскольку урок был записан относительно рано, качество звука относительно плохое, а некоторые детали не идеальны. Поэтому эта заноза всегда застряла в моем сердце. Чтобы дать возможность стойким приверженцам специального тренировочного лагеря по микроконтроллерам Уцзи более эффективно и лучше изучать наши проекты, я недавно планирую реорганизовать это базовое содержание и превратить его в серию. графические/видеоуроки по архитектуре программного обеспечения 2.0.

1. Почему стоит говорить об очередях?

Когда я работал инженером по исследованиям и разработкам, я часто сталкивался с некоторыми коммуникационными продуктами, такими как промышленные платы управления, блоки распределения питания и Интернет вещей.

Как правило, при создании такого рода продуктов возникает головная боль при записи и получении потоков данных, будь то последовательная связь или беспроводная связь.

Например, STM32 получает поток данных последовательного порта.

Вначале я определил массив и переменную индекса массива для обработки полученного потока данных. Код выглядит следующим образом:

Этот метод имеет множество проблем и увеличивает сложность написания кода инженерами.

  • Сопровождение кода обременительно

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

  • Данные склонны к путанице

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

Если прием и обработка данных не синхронизированы, использование массивов может привести к путанице в порядке данных, что приведет к потере пакетов данных из-за проблем в программе. Я раньше уже беспокоился об этой проблеме. Мне нужен дополнительный код для решения этой проблемы, что увеличивает сложность программы. Более того, у меня нет опыта, и сделать это после всех усилий не стабильно.

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

Это кажется намного проще? На самом деле алгоритм обработки данных очереди непрост: он просто использует очередь для создания общего шаблона для обработки данных. В следующий раз, когда вы столкнетесь с подобными потребностями, вы можете использовать его напрямую. С профессиональной точки зрения это означает переносимость и переносимость. код более многоразовый.

Это всего лишь одно из применений очередей. Суть очередей заключается в кэшировании данных. Ввод данных и удаление из очереди следуют правилу «первым вошел — первым вышел».

То есть сначала сохранять данные, а затем выводить их на обработку, когда у ЦП появляется свободное время или когда выполняются определенные условия программы.

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

2. В каких сценариях следует использовать очереди?

Я суммировал несколько мест, которыми пользуюсь чаще всего.

2.1 Буфер данных последовательной связи

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

2.2 Обработка звука

В устройствах воспроизведения или записи звука очереди используются для буферизации данных аудиосэмплов для реализации пошагового воспроизведения или записи. Например: например, в проекте 6 нашего специального тренировочного лагеря для микроконтроллеров Wuji хост сигнализации Wi-Fi и 4G имеет функцию голосовой подсказки. Например, если вы нажмете кнопку постановки на охрану вдали от дома, прозвучит голос «постановка на охрану вдали от дома». будет воспроизведен, и если нажать кнопку постановки на охрану дома, будет воспроизведен голос «Постановка на охрану дома».

Если я быстро нажму эти две кнопки, чтобы гарантировать полное воспроизведение голоса, я могу сначала поместить ключевое событие в кеш очереди, чтобы голос можно было воспроизводить полностью последовательно.

2.3 Планирование и синхронизация задач

В системах, использующих RTOS, очереди используются для доставки сообщений и синхронизации между задачами, а также поддерживают сложное планирование задач.

2.4 Обработка ввода с клавиатуры

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

2.5 Данные АЦП

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

2.6 Поток данных обновления прошивки

Взаимодействие данных при обновлении прошивки относительно велико, что очень удобно для использования очередей для обеспечения целостности данных. Оно также используется в нашем проекте 6. В процессе обновления прошивки загруженные блоки данных прошивки могут быть помещены в очередь, а затем затем. записываются во флэш-память последовательно. Подобных приложений много. В общем, очереди решили для меня много сложных задач.

3. Принцип очереди

Очередь представляет собой линейную структуру данных, которая следует принципу «первым поступил — первым обслужен» (FIFO), то есть первые данные, поступившие в очередь, будут первыми удалены. В очереди данные обычно помещаются в очередь на одном конце, называемом хвостом очереди, а данные выводятся из очереди на другом конце, называемом началом очереди. Такая структура делает очереди очень подходящими для ситуаций, когда данные необходимо обрабатывать упорядоченно.

Мы можем представить себе очередь как забрасывание шариков для пинг-понга в двустороннюю трубу. Мы закидываем шарики для пинг-понга в трубу слева. Это действие называется постановкой в ​​очередь. Вынимаем шарик для пинг-понга с правой стороны трубы. Это действие называется снятием с очереди.

Шарики для пинг-понга в трубе выстроятся в ряд. Мяч для настольного тенниса, который войдет первым, выйдет первым. В очереди действует правило «первым пришел – первым ушел».

Шарики для пинг-понга сравниваются с данными. Конвейер — это кэш, в котором хранятся данные. Количество шариков для пинг-понга, которое может храниться в конвейере, означает, сколько данных может хранить кэш. Проще говоря, это размер массива. Очередь на рисунке выше может хранить 4 фрагмента данных. Это эквивалентно Buff[4].

Программная реализация очереди осуществляется с помощью массива фиксированного размера, головного указателя и хвостового указателя. Массивы отвечают за хранение данных. Указатель головы отвечает за адрес, с которого следует извлечь данные при выводе из очереди. Указатель хвоста отвечает за то, по какому адресу должны храниться данные, когда они поставлены в очередь. Таким образом, операции постановки в очередь и удаления из очереди представляют собой два указателя, воспроизводящие в массиве алгоритм «первым поступили — первым обслужены».

4. Использование очередей

Разные инженеры реализуют коды очередей по-разному. Если у вас нет богатого опыта работы над проектами или вы раньше не использовали очереди, не смущайтесь, что вы должны уметь написать алгоритм очереди.

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

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

В качестве примера возьмем программу очереди нашего специального учебного лагеря Infinite Microcontroller Project. Всего существует 4 функции.

ОчередьПустая(x)

Очистите функцию очереди. Перед каждым использованием очереди необходимо очистить очередь. Функция очистки заставит указатель заголовка и хвоста указывать на действительный адрес по умолчанию, который является первым элементом массива. произойдет исключение адреса.

Формальное описание параметра: x - переменная структуры очереди.

QueueDataIn(x,y,z)

Функция постановки в очередь данных заключается в добавлении одного или нескольких байтов данных в указанную очередь.

Формальное описание параметра:

x - переменная структуры очереди

y - адрес данных

z — объем данных для постановки в очередь в байтах.

Уведомление:

①.Введенные данные могут иметь только тип беззнакового символа.

②. Если очередь заполнена и данные продолжают находиться в очереди, данные будут перезаписаны из первого местоположения данных.

QueueDataOut(x,y)

Функция удаления данных из очереди предназначена для извлечения одного байта данных из указанной очереди.

Формальное описание параметра: x – переменная структуры очереди, y – извлекаемые данные, адрес для сохранения.

Примечание. Наша функция удаления из очереди может принимать только один байт данных за раз.

QueueDataLen(x)

Очистить все данные в указанной очереди. Формальное описание параметра: x - переменная структуры очереди.

5. Использование очереди видео-демонстрации

Следующий контент включает в себя некоторые пояснения к коду и видео, которые неудобно редактировать. Вы можете связаться со мной, чтобы организовать Feishu для более удобного чтения.


Недавно многие фанаты спросили меня, как изучить микроконтроллеры. Основываясь на своем десятилетнем опыте работы в отрасли, я потратил месяц и тщательно собрал «однокристальный микрокомпьютер».

Лучший путь обучения микроконтроллерам + учебные пособия от начального до продвинутого уровня по микроконтроллерам + набор инструментов" Все это доступно преданным фанатам бесплатно! ! !

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

Пакеты учебных пособий и подробные схемы обучения можно найти у меня.Начало этой статьи ниже

Путь обучения от начального уровня до продвинутого взлома микроконтроллеров (с учебными пособиями и инструментами)

Путь обучения от начального уровня до продвинутого взлома микроконтроллеров (с учебными пособиями и инструментами)

Путь обучения от начального уровня до продвинутого взлома микроконтроллеров (с учебными пособиями и инструментами)