Compartilhamento de tecnologia

Serial da arquitetura de software do microcontrolador (5)-Fila

2024-07-12

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

Falamos anteriormente sobre conhecimentos básicos, como ponteiros e estruturas. No início deste artigo faremos algumas aplicações complexas desses conhecimentos básicos, como filas.

Na verdade, em 2018, gravei um conjunto de vídeos sobre arquitetura de programas, que incluíam tutoriais passo a passo sobre formação de filas e uma série de pensamentos e técnicas práticas de programação de alto nível. Foi bem recebido e reconhecido por muitos fãs e. amigos. .

No entanto, como o tutorial foi gravado relativamente cedo, a qualidade do som é relativamente baixa e alguns detalhes não são perfeitos. Portanto, esse espinho sempre esteve cravado em meu coração. A fim de permitir que os obstinados do Campo de Treinamento Especial de Microcontroladores Wuji aprendam nossos projetos com mais eficiência e entendam melhor, recentemente pretendo reorganizar esses conteúdos básicos e transformá-los em uma série. de tutoriais gráficos/vídeos de arquitetura de software 2.0.

1. Por que devo falar sobre filas?

Quando trabalhava como engenheiro de P&D, frequentemente encontrava alguns produtos de comunicação, como placas de controle industrial, PDUs e Internet das Coisas.

Geralmente, ao fabricar este tipo de produto, será uma dor de cabeça ao escrever e receber fluxos de dados, seja comunicação serial ou sem fio.

Por exemplo, o STM32 recebe fluxo de dados da porta serial.

No início, defini um array e uma variável subscrita de array para processar o fluxo de dados recebido. O código é o seguinte:

Este método tem muitos problemas e aumenta a complexidade dos engenheiros que escrevem código.

  • A manutenção do código é problemática

Como você precisa verificar manualmente os limites do buffer da matriz para evitar erros fora dos limites, as matrizes não são tão fáceis de expandir e manter quanto as filas quando você precisa processar fluxos de dados mais complexos ou adicionar novas fontes de dados.

  • Os dados são propensos a confusão

Operar matrizes diretamente em um serviço de interrupção (ISR) pode causar competição de recursos com o programa principal. Se várias tarefas acessarem a mesma matriz, mecanismos de sincronização adicionais (como bloqueios mutex) serão necessários para evitar condições de corrida de dados e inconsistências.

Se a recepção e o processamento de dados não estiverem sincronizados, o uso de matrizes pode causar confusão na ordem dos dados, levando à perda de pacotes de dados causada por problemas no programa. Já estive preocupado com esse problema antes. Preciso de código extra para resolvê-lo, o que aumenta a complexidade do programa. Além disso, não tenho experiência e não é estável fazê-lo depois de todo o esforço.

Esse tipo de problema me incomodou por muito tempo. Só depois que mudei de emprego e li o código escrito por outros engenheiros é que percebi que as filas podem resolver esses pontos problemáticos. Desde então, a forma como lido com o fluxo de dados tornou-se a seguinte:

Parece muito mais simples? Na verdade, o algoritmo da fila para processamento de dados não é simples. Ele apenas usa a fila para criar um modelo geral para processamento de dados. Na próxima vez que você encontrar necessidades semelhantes, poderá usá-lo diretamente. do código.

Esta é apenas uma das aplicações das filas. A essência das filas é o armazenamento em cache de dados e a retirada da fila seguindo a regra do primeiro a entrar, primeiro a sair.

Isso significa armazenar os dados primeiro e depois retirá-los para processamento quando a CPU tiver tempo livre ou quando certas condições do programa forem atendidas.

Com base nesta característica, muitas aplicações práticas podem ser derivadas. Principalmente quando se trata de aplicações que precisam garantir a ordem dos dados.

2. Em quais cenários as filas devem ser utilizadas?

Resumi alguns dos lugares que mais uso.

2.1 Buffer de dados de comunicação serial

Quando o microcontrolador recebe dados através da porta serial, ele geralmente usa uma fila para armazenar em buffer os bytes recebidos. Isso garante que os dados não serão perdidos antes de serem processados ​​pelo programa principal.

2.2 Processamento de áudio

Em dispositivos de reprodução ou gravação de áudio, as filas são usadas para armazenar dados de amostra de áudio em buffer para implementar a reprodução ou gravação passo a passo. Por exemplo: Por exemplo, no Projeto 6 do nosso Campo de Treinamento Especial de Microcontrolador Wuji, o host de alarme WiFi e 4G tem uma função de prompt de voz. Por exemplo, se você pressionar o botão de armar fora de casa, a voz "armar fora de casa" será exibida. será reproduzida, e se o botão armar em casa for pressionado, a voz "armar em casa" será reproduzida.

Se eu pressionar esses dois botões rapidamente, para garantir que a voz possa ser reproduzida completamente, posso primeiro lançar o evento principal no cache da fila, para que a voz possa ser reproduzida completamente em sequência.

2.3 Agendamento e sincronização de tarefas

Em sistemas que utilizam RTOS, as filas são utilizadas para entrega de mensagens e sincronização entre tarefas e suportam agendamento de tarefas complexas.

2.4 Processamento de entrada principal

Depois de detectar os eventos principais, eles podem ser colocados na fila primeiro, e o programa principal pode processar esses eventos para evitar que os eventos principais sejam perdidos devido ao pressionamento muito rápido das teclas. Isso é usado atualmente em nosso projeto.

2.5 Dados ADC

Os dados ADC que coletamos também podem ser colocados na fila após determinado processamento para que possam ser processados ​​ou analisados ​​no momento apropriado.

2.6 Fluxo de dados de atualização de firmware

A interação de dados de atualização de firmware é relativamente grande, o que é muito adequado para usar filas para garantir a integridade dos dados. Também é usado em nosso projeto 6. Durante o processo de atualização de firmware, os blocos de dados de firmware baixados podem ser colocados na fila e depois. gravados na memória flash em sequência. Existem muitos aplicativos semelhantes. Em suma, as filas resolveram muitos problemas difíceis para mim.

3. Princípio da fila

A fila é uma estrutura de dados linear que segue o princípio primeiro a entrar, primeiro a sair (FIFO), ou seja, os primeiros dados a entrar na fila serão os primeiros a serem removidos. Em uma fila, os dados geralmente são colocados na fila em uma extremidade, chamada de final da fila, e os dados são retirados da fila na outra extremidade, chamada de início da fila. Essa estrutura torna as filas muito adequadas para situações em que os dados precisam ser processados ​​de maneira ordenada.

Podemos pensar na fila como colocar bolas de pingue-pongue em um cano bidirecional. Colocamos bolas de pingue-pongue no cano pela esquerda. Retiramos a bola de pingue-pongue do lado direito do cano. Essa ação é chamada de desenfileiramento.

As bolas de pingue-pongue no tubo se alinharão em formação. A bola de tênis de mesa que entrar primeiro sairá primeiro. Esta é a regra do primeiro a entrar, primeiro a sair da fila.

As bolas de pingue-pongue são comparadas aos dados. O pipeline é um cache que armazena dados. Quantas bolas de pingue-pongue o pipeline pode conter significa quantos dados o cache pode armazenar. A fila na imagem acima pode armazenar 4 dados. É equivalente a Buff[4].

A implementação do programa da fila é feita por meio de um array de tamanho fixo, um ponteiro inicial e um ponteiro final. Arrays são responsáveis ​​por armazenar dados. O ponteiro principal é responsável pelo endereço do qual os dados devem ser retirados durante a retirada da fila. O ponteiro final é responsável por qual endereço os dados devem ser armazenados quando são enfileirados. Portanto, as operações de enfileiramento e desenfileiramento são dois ponteiros, reproduzindo o algoritmo primeiro a entrar, primeiro a sair dos dados na matriz.

4. Uso de filas

Diferentes engenheiros implementam códigos de fila de maneira diferente. Se você não tem muita experiência em projetos ou se nunca usou filas antes, não se sinta envergonhado por ser capaz de escrever o algoritmo de fila.

Quando comecei, transplantei diretamente os programas de fila de outras pessoas e continuei a usá-los em meus próprios projetos. Depois de usá-los proficientemente em vários projetos, estudei o código detalhado da implementação do algoritmo de fila e o escrevi algumas vezes.

Portanto, veteranos do nosso campo de treinamento especial, não escrevam sozinhos no início. Aprendam a usá-lo primeiro, tirem conclusões de um exemplo, apliquem-no a diferentes cenários e projetos e depois tentem escrevê-lo vocês mesmos depois de se familiarizarem. com ele. Esta é uma sequência de aprendizagem muito importante.

Veja o programa de fila do nosso Campo de Treinamento Especial do Projeto de Microcontrolador Infinito como exemplo. Existem 4 funções no total.

FilaVazia(x)

Limpe a função de fila Antes de cada uso da fila, a fila deve ser limpa. A função clear fará com que o ponteiro principal e o ponteiro final apontem para um endereço válido, que é o primeiro elemento da matriz. ocorrerá uma exceção de endereço.

Descrição formal do parâmetro: x - é uma variável de estrutura de fila

QueueDataIn(x,y,z)

A função de enfileiramento de dados consiste em lançar um ou mais bytes de dados na fila especificada.

Descrição formal do parâmetro:

x - Variável de estrutura da fila

y - endereço de dados

z - A quantidade de dados a serem enfileirados, em bytes.

Perceber:

①.Os dados inseridos só podem ser do tipo unsigned char.

② Se a fila estiver cheia e os dados continuarem na fila, os dados serão substituídos do primeiro local de dados.

QueueDataOut(x,y)

A função de desenfileiramento de dados consiste em retirar um byte de dados da fila especificada.

Descrição formal do parâmetro: x - Variável da estrutura da fila y - Os dados retirados, o endereço a ser armazenado

Nota: Nossa função de desenfileiramento só pode receber um byte de dados por vez.

ComprimentoDadosFila(x)

Limpe todos os dados na fila especificada. Descrição formal do parâmetro: x - variável de estrutura da fila

5. Uso da fila de demonstração de vídeo

O conteúdo a seguir envolve algumas explicações de código e vídeo, que são inconvenientes para editar. Você pode entrar em contato comigo para organizar o Feishu para uma melhor experiência de leitura.


Recentemente, muitos fãs me perguntaram como aprender microcontroladores. Com base em meus dez anos de experiência na indústria, passei um mês compilando cuidadosamente um "microcomputador de chip único".

O melhor caminho de aprendizagem para microcontroladores + tutoriais de microcontroladores de nível básico a avançado + kit de ferramentas" Tudo compartilhado com fãs obstinados de graça! ! !

Além disso, estou compartilhando entre lágrimas o que tenho no fundo da minha caixa22 projetos populares de código aberto,IncluirCódigo fonte + esquema + PCB + documentação, deixar vocêTorne-se um mestre rapidamente

Para pacotes de tutoriais e caminhos de aprendizagem detalhados, consulte-meO início deste artigo abaixo

Caminho de aprendizagem desde o nível básico até o hacking avançado de microcontroladores (com tutoriais + ferramentas)

Caminho de aprendizagem desde o nível básico até o hacking avançado de microcontroladores (com tutoriais + ferramentas)

Caminho de aprendizagem desde o nível básico até o hacking avançado de microcontroladores (com tutoriais + ferramentas)