Introdução detalhada à saída do console ESP_LOGx() do ESP32S3

Prefácio

(1) Ao entrar em contato com um novo chip, o primeiro passo é acender a luz ou realizar a saída da porta serial. Agora apresentarei como usar rapidamente o ESP32S3 para saída de log do console.
(2) A saída de log para ESP32 é relativamente simples, ao contrário de outros chips que exigem configuração da taxa de transmissão, configuração de bits de verificação de bits de dados, etc. É muito mais simples, mas também faz com que muitos jovens como eu, que costumam desenvolver microcontroladores, se sintam inseguros. Embora seja simples, sempre parece estranho de usar.
(3) Muitas operações do ESP32 parecem relacionadas ao Linux, especialmente a configuração do menuconfig a ser discutida neste artigo, que é semelhante à adaptação do kernel do Linux. Isto fará com que muitos irmãos que não foram expostos a este aspecto pareçam confusos. Para buscar simplicidade e facilidade de entendimento, este artigo foi configurado por meio do plug-in ESP32-IDF do vscode. Também darei uma breve introdução a outros ambientes.
(4)Uma coisa a observar aqui é se você estiver usando U0Tx, U0Rx, U1Tx, U1Rx. Este tipo de impressão de log através da porta serial será um pouco diferente da impressão de log através do cabo de dados USB.

Impressão de registros

6 níveis de registros

(1) A saída de log do ESP32 é hierárquica e ajustará os dados de saída através do compilador de acordo com as condições predefinidas.
(2) Ao contrário de outros chips, se você deseja classificar os dados de saída da porta serial, é necessário processá-los por meio de definição de macro. Como mostrado abaixo

#include <stdio.h>

#define NO_output  0
#define Error      1
#define Warning    2
#define Info       3
#define Debug      4
#define Verbose    5
 
#define Set_LOG_Level Info  //设置日志输出等级

void main()
{
    
    
#if Set_LOG_Level >= Verbose
	printf("所有数据都打印\r\n");
#endif
#if Set_LOG_Level >= Debug
	printf("打印用于调试阶段的数据\r\n");
#endif
#if Set_LOG_Level >= Info
	printf("只打印一些普通信息\r\n");
#endif
#if Set_LOG_Level >= Warning
	printf("打印警告信息\r\n");
#endif
#if Set_LOG_Level >= Error
	printf("打印报错信息\r\n");
#endif
#if Set_LOG_Level >= NO_output 
	printf("不进行信息打印\r\n");
#endif
}

Insira a descrição da imagem aqui

(3) Com base no código acima e nos resultados do teste, podemos entender claramente o princípio de funcionamento da impressão de log do ESP32. Não há nada de misterioso na classificação desse tipo de impressão de log, na verdade, é a etapa de pré-processamento do compilador utilizado, que é processado de acordo com as condições de compilação definidas por você. Se você não acredita, você pode usar o comando -E do gcc para pré-processar apenas o arquivo C. O resultado final que você vê é o seguinte:
Nota : interceptei apenas a parte da função main(), porque na fase de pré-processamento, o Cabeçalho stdio.h As informações do arquivo serão copiadas para o arquivo C atual. Se você não entende, você pode ler: Compreenda profundamente os arquivos #include e de cabeçalho dos programas C, para que o projeto C tenha apenas arquivos .h (cabeças de cachorro)

Insira a descrição da imagem aqui

Como definir o nível de saída do log

(1) Agora que já conhecemos o conceito de nível de log, como defino o nível de log de saída? Para o código acima, definimos o nível de saída do log final por meio da macro #define Set_LOG_Level Info.
(2) Este método de uso varia dependendo do ambiente operacional. Apresentarei primeiro o método mais simples.

Método 1 – vscode configura exclusivamente o nível de saída do log

Insira a descrição da imagem aqui

Método 2 – configuração do menuconfig

(1) Digite idf.py menuconfig na linha de comando para entrar na interface de configuração. Se você não conseguir abrir o menuconfig, poderá verificar se o ESP32S3 não consegue abrir o idf.py menuconfig - o arquivo especificado para download no ambiente Windows.
<2>Encontre o seguinte diretório e configure-o.

Insira a descrição da imagem aqui

Método 3 – Modifique o arquivo sdkconfig diretamente

(1) Encontre o arquivo sdkconfig no caminho do projeto

Insira a descrição da imagem aqui

(2) Pesquise a configuração do Bootloader e encontre os parágrafos a seguir. Copie e cole minha configuração abaixo conforme necessário e, finalmente, salve-a. Como são muitos, darei apenas três exemplos.

/*--- 日志输出等级为INFO ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=3
/*--- 日志输出等级为DEBUG ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG=y
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=4
/*--- 日志输出等级为VERBOSE ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE=y
CONFIG_BOOTLOADER_LOG_LEVEL=5

Introdução à função de saída de log

(1) A seguir estão várias funções que podemos usar (para ser mais preciso, na verdade são definições de macro. Se você estiver interessado, pode dar uma olhada em seu princípio de implementação).
(2) Se o nível de saída do log estiver definido como INFO, as informações de impressão das funções ESP_LOGI(), ESP_LOGW() e ESP_LOGE() poderão ser geradas.

ESP_LOGE() // 错误
ESP_LOGW() // 警告
ESP_LOGI() // 信息
ESP_LOGD() // 调试
ESP_LOGV() // 详细

(3) Ao usar macros como ESP_LOGx(), a primeira é sempre uma string. Geralmente é usado para indicar qual arquivo foi executado. Ao verificar as informações de log posteriormente, você pode localizar rapidamente o código problemático com base na primeira string.
(4) O segundo parâmetro também é uma string. O % nesta string pode determinar quantos parâmetros variáveis ​​podem ser obtidos posteriormente.
Fora do tópico: Se você quiser entender o princípio dos parâmetros variáveis, você pode ler Como escrever uma função de parâmetro variável? Como fazer com que todas as portas seriais de todos os microcontroladores implementem a função printf?

static const char *TAG = "main";
ESP_LOGI(TAG, "tast1: 1");
ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__);

(5) Como visualizar informações de log no vscode:

Insira a descrição da imagem aqui

(6) Para visualizar informações de log em outras plataformas, digite a seguinte linha de comando para iniciar o monitoramento

idf.py monitor

Em relação ao problema da impressão incompleta de logs

A solução exclusiva do vscode

(1) Minha porta USB não era reconhecida antes, então inicialmente utilizei o CH340 para realizar o programa de gravação no ESP32S3 através da porta serial. Mais tarde, quando estudei a saída do console de ESP_LOGx(), descobri que meu ESP_LOGI() não conseguiu gerar dados, o que me deu vontade de vomitar.
(2) Posteriormente, entrei em contato com a equipe oficial da Espressif e descobri qual era o problema.
(3) Entre na interface de configuração menuconfig e pesquise Canal para saída do console para definir as configurações de saída do console ESP_LOGx().
(4) O parágrafo seguinte é uma introdução a esta opção de configuração. Para ser sincero, não vou apresentá-la aleatoriamente porque não a entendo. A configuração da imagem é baseada nas instruções da equipe oficial da Espressif, portanto não haverá problema.
<1>Por padrão, UART0 é usado em gpio predefinido.
<2>Se você selecionar "Personalizado", poderá selecionar UART0 ou UART1 e poderá selecionar qualquer pino.
<3>Se "Nenhum" for selecionado, não haverá saída de console em nenhum UART, exceto a saída inicial do bootloader ROM. Esta saída ROM pode ser inibida via cinta GPIO ou EFUSE, consulte a folha de dados do chip para obter detalhes.
<4>Em chips com periféricos USB OTG, a opção "USB CDC" redireciona a saída para a porta CDC. Esta opção usa o driver CDC da ROM do chip, esta opção não é compatível com a pilha TinyUSB.
<5>Em chips com um controlador de depuração USB serial/JTAG, selecione esta opção para redirecionar a saída para o componente CDC/ACM (emulação de porta serial) do dispositivo.

Insira a descrição da imagem aqui

método de processamento menuconfig

(1) Digite idf.py menuconfig na linha de comando para entrar na interface de configuração.
(2) Diretório de nível superior—>Configuração do componente—>Configurações do sistema ESP—>Canal para saída do console, selecione de acordo com suas condições

Insira a descrição da imagem aqui

(3) Se achar difícil encontrar o caminho, você pode inserir "/" para entrar na interface de pesquisa e, em seguida, inserir Canal para saída do console para encontrar esta opção. (Observe que na linha de comando, o comando colar é ctrl+shift+v)

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_63922192/article/details/132852003
Recomendado
Clasificación