«Распознавание речи TWen-ASR-ONE: заметки по разработке» Глава 3 Многопоточность TWen-ASR-ONE и очередь сообщений

искусственный интеллект
«Распознавание речи TWen-ASR-ONE: заметки по разработке» Глава 3 Многопоточность TWen-ASR-ONE и очередь сообщений

3.1 Введение в Скретч

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

После того, как разработчики TWen-ASR-ON построили логику программного обеспечения с помощью программирования Scratch, IDE Tianwen Block преобразует его в язык C, но он не открыт для разработчиков.Scratch очень прост, у вас есть только творчество, просто нужно вытащить модули на IDE и строить логические блоки один за другим, как строительные блоки. Автору брезгливо в это играть, но к сожалению официалы не разрабатывают базовый интерфейс, не буду вдаваться в подробности про Scratch, пока у вас есть основа программирования, с первого взгляда видно, я так думаю оскорбительно для всех рассказывать об этом подробно.Поэтому не буду говорить о самом языке.

Адрес официального сайта

3.2 Основы многопоточности

Интерьер TWen-ASR-ONНа основе FreeRTOS,Поэтому TWen-ASR-ON может использовать многопоточность.Я не хочу говорить о тредах.Ведь у всех,кто может прочитать мою статью,есть определенная программная база,но автор тут для того,чтобы кратко объяснить.. Когда мы хотим сделать несколько вещей, нам нужно создать несколько задач для одновременного выполнения, но следует отметить, что для одноядерного ЦП: многопоточность — это ЦП, который переключается туда и обратно и выполняется попеременно. Для многоядерных ЦП: многопоточность означает, что несколько путей выполнения выполняются одновременно (параллельно), каждое ядро ​​выполняет один поток, и несколько ядер могут выполняться одновременно. одно ядро, поэтому, когда вы создаете несколько задач, кажется, что несколько задач выполняются вместе. На самом деле ЦП постоянно переключает задачи. Каждый поток имеет свой собственный стек и локальные переменные, а потоки независимо планируются ЦП. , так сказатьПоток — это наименьшая единица выполнения программы.

FreeRTOS — это вытесняющая многозадачная система реального времени, поэтому ее планировщик задач также является вытесняющим.Запущенный процесс показан на рисунке:

在这里插入图片描述

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

3.3 Многопоточная реализация TWen-ASR-ONE

Реализация многопоточности TWen-ASR-ON очень проста, вы можете комбинировать соответствующие логические блоки через Tianwen Block IDE.

在这里插入图片描述

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

在这里插入图片描述

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

Далее для удобства автор будет использовать официальный пример.

在这里插入图片描述

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

在这里插入图片描述

Коды символов следующие:

#include "asr.h"
#include "setup.h"

uint32_t snid;
void ASR_CODE();

//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
void LED_1_app(){
  while (1) {
    digitalWrite(12,1);
    delay(700);
    digitalWrite(12,0);
    delay(700);
  }
vTaskDelete(NULL);
}
void LED_2_app(){
  while (1) {
    digitalWrite(14,1);
    delay(300);
    digitalWrite(14,0);
    delay(300);
  }
vTaskDelete(NULL);
}
/*描述该功能...
*/
void ASR_CODE(){
  switch (snid) {
   case 4:
    digitalWrite(13,1);
    break;
   case 6:
    digitalWrite(13,0);
    break;
  }
}

void setup()
{
  //{speak:小蝶-清新女声,vol:10,speed:10}
  //{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}
  //{playid:10002,voice:我退下了,用智能管家唤醒我}
  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}
  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}
  xTaskCreate(LED_1_app,"LED_1_app",128,NULL,4,NULL);
  xTaskCreate(LED_2_app,"LED_2_app",128,NULL,4,NULL);
}

Коды символов могут выглядеть чище и писать, не правда ли, очень просто.

3.4 Использование очереди сообщений TWen-ASR-ONE

Очередь сообщений помещается в модуль потока, поэтому она должна быть связана с потоком.Так называемая очередь сообщений на самом деле представляет собой структуру данных, обычно используемую для связи между потоками (задачами).Логические блоки, связанные с очередью сообщений TWEN -ASR ONE следующие:

在这里插入图片描述

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

Что касается прерывания вашего пробуждающего сообщения, после того, как ЦП спит, вы можете разбудить его таким образом.

Далее давайте объясним это на примерах или воспользуемся официальными примерами.

在这里插入图片描述

Здесь создаются две очереди сообщений и два потока.Когда идентификатор идентификации языка равен 4, значение идентификатора записывается в очередь сообщений 1. Если в очереди сообщений есть сообщение, сообщение выводится через последовательный порт.То же самое верно для другого Последовательный порт объясняется в следующем содержании.

Наконец, скомпилируйте и скачайте. Эффект следующий:

Я: умная домработница

TWen-ASR-ONE: Я Я: включи красный свет TWen-ASR-ONE: Хорошо, сейчас же включи красный свет.

在这里插入图片描述

я: выключи красный свет

TWen-ASR-ONE: Ладно, выключи сейчас же красный свет.

在这里插入图片描述