ÍNDICE DE CONTEÚDO
O que é o arquivo Kconfig?
O arquivo Kconfig foi criado com intuito de tornar o kernel do Linux altamente modular e também personalizável, possibilitando fornecer as configurações de símbolos e atributos do kernel.
Para a esp-idf, o Kconfig é utilizado com o mesmo intuito, ele fornece as configurações do projeto em tempo de compilação. Os exemplos foram desenvolvidos na versão 4.1 da esp-idf , nessa versão tivemos muitas mudanças no menu de configuração em relação às versões anteriores.
Criação do arquivo Kconfig no seu projeto
Foi utilizado o template da Espressif para a elaboração do projeto de teste.
Como apresentado na Figura 1, a arquitetura do projeto contempla um arquivo Kconfig.projbuild, localizado no diretório main, para o desenvolvimento do exemplo utilizaremos dessa mesma estrutura.
Criaremos um menu chamado “Configurações do projeto teste”, para isso utilizaremos os seguintes comandos:
- menu : Menu principal de um bloco de configurações, deve ter seu fim indicado através do endmenu.
- config : Entrada(s) de configuração ( atributo do menu ), cada uma delas define uma opção de configuração.
Abra um editor de sua preferência e edite o arquivo o Kconfig.projbuild, como apresentado no exemplo abaixo.
1 2 3 4 5 6 7 8 9 10 |
# Kconfig exemplo menu "Configurações do projeto teste" config GPIO_LED_2 int "GPIO do led 2" default 10 range 1 10 help Essa opção possibilita a configuração do pino endmenu |
Notamos no código, que a frente de config possuímos o nome da entrada, chamada GPIO_LED_2, esse nome posteriormente na etapa de compilação se transformará em uma definição, onde receberá o valor configurado.
Abaixo da entrada config se encontram seus atributos:
- int : A entrada deve assumir um valor inteiro. A frente temos o nome do campo que aparecerá na entrada.
- default : Valor padrão da entrada.
- range : Intervalo de valores válidos ( entre 1 e 10 no exemplo ).
- help : Mensagem de ajuda que será apresentada no menuconfig.
Após o desenvolvimento do arquivo Kconfig, utilizaremos o menu de configurações, para isso digite o comando idf.py menuconfig na pasta raiz do projeto. A Figura 2 apresenta a tela inicial do menu de configurações, onde se encontra nosso submenu “Configurações do projeto teste”.
Podemos utilizar as teclas ->, espaço e enter para navegar no menu, ao entrar na opção em destaque na Figura 2 será apresentado o item de configuração “GPIO do led 2”, como destacado na Figura 3.
A opção de configuração, definida com um valor inteiro, apresenta um intervalo válido de entradas, foi simulado uma entrada de valor fora do especificado pelo atributo range, o resultado é uma mensagem de erro apresentada na Figura 4.
Ao pressionar a tecla “?” será apresentado a tela de informação, com o texto que transcrevemos no atributo help, além de informações sobre a entrada. A Figura 5 apresenta a tela de informação.
Podemos alterar o tipo de entrada para outros além de int, no exemplo abaixo utilizamos uma entrada em hexadecimal, para mais informações sobre os tipos de entrada consulte a documentação do kernel.
1 2 3 4 5 6 7 8 9 10 |
# Kconfig exemplo menu "Configurações do projeto teste" config REGISTRO_1 hex prompt "Valor do registro" default 0x05 help valor do registro 1 endmenu |
Abaixo da entrada config se encontram seus atributos:
- hex : A entrada deve assumir um valor hexadecimal.
- prompt : Mensagem apresentada da configuração.
Notamos que no exemplo anterior não utilizamos o atributo prompt para apresentar a mensagem da configuração, essa mensagem também pode ser escrita a frente do tipo da entrada, deixando o prompt opcional em alguns casos. A Figura 6 apresenta a entrada em hexadecimal.
O Kconfig possui outras entradas além das numéricas, uma delas é a opção choice, que permite a escolha entre uma ou mais opções dentro de uma única configuração. Abaixo temos um exemplo onde possuímos duas opções dentro da configuração, “Aplicação” e “Teste”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Kconfig exemplo menu "Configurações do projeto teste" choice MODO_OPERACAO_FW prompt "Modo de operação do firmware" default MODO_DE_APLICACAO help Configuração do modo de operação do FW. config MODO_DE_APLICACAO bool "Aplicação" config MODO_DE_TESTE bool "Teste" endchoice endmenu |
As opções presentes dentro de um choice podem pertencer apenas ao tipo bool, como apresentado no exemplo.
Ao entrar no submenu é apresentado todas as opções possíveis para a configuração, assim como representado na Figura 8.
É muito comum termos dependências entre as configurações presentes no menu, o exemplo abaixo utiliza de um atributo denominado depends on, a frente dele temos todas as dependências de uma configuração.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Kconfig exemplo menu "Configurações do projeto teste" config SENSOR_STATUS bool "Habilita o sensor" default "n" help Selecione esta opção para habilitar o sensor. config SENSOR_PINO int "pino do sensor" default 10 depends on SENSOR_STATUS help Pino do sensor. endmenu |
No código a opção “pino do sensor” depende de SENSOR_STATUS estar habilitado, caso queira inverter a ordem basta adicionar o sinal de negação ! ao início de SENSOR_STATUS (depends on !SENSOR_STATUS).
Notamos que ao marcar o checkbox a opção “pino de sensor” é apresentada no menu, como apresentado na Figura 10.
O atributo depends on também pode ser utilizado em menus, comentários, entre outros. Consulte a documentação do kernel para mais informações.
Podemos utilizar a lógica if na elaboração do Kconfig, como demonstrado no exemplo abaixo, foi utilizado o if em um atributo de configuração:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Kconfig exemplo menu "Configurações do projeto teste" config PINO_SENSOR_1 int "pino do sensor 1" default 15 help Pino do sensor 1. config PINO_SENSOR_2 int prompt "pino do sensor 2" if PINO_SENSOR_1 < 10 default 10 help Pino do sensor 2. endmenu |
O código possui duas entradas do tipo int, PIN_SENSOR_1 e PIN_SENSOR_2, notamos que a segunda entrada possui um atributo prompt, o mesmo utiliza da lógica if, sendo assim a opção prompt só estará visível se o valor do primeiro argumento for menor do que 10.
Utilizamos o if junto a um atributo, porém seu uso pode ser feito de outras maneiras. Para mais informações sobre a lógica if consulte a documentação do kernel.
O Kconfig possui uma gama de tipos de menu, atributos e lógicas além das apresentadas nesse documento. Nos exemplos utilizamos a extensão “.projbuild”, porém podemos criar o arquivo em outros formatos, isso irá depender da aplicação em que será utilizado.
Implementação das definições no código C/C++
Faremos uma breve demonstração de uma implementação em C/C++, para essa demonstração, utilizaremos o exemplo apresentado nas figuras 7 e 8.
Após configurarmos o modo de operação do firmware através da ferramenta menuconfig, iremos compilar o código, para isso, basta executar o comando “idf.py build”.
Abaixo temos o código de exemplo, implementado na classe main.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "sdkconfig.h" void app_main(void) { while (1) { #ifdef CONFIG_MODO_DE_APLICACAO //executar o firmware em modo de aplicação #else //executar o firmware em modo de teste #endif vTaskDelay(5000 / portTICK_PERIOD_MS); } } |
Notamos que no código temos a inclusão do arquivo de cabeçalho “sdkconfig.h”, esse arquivo é gerado após a compilação e contém todas as definições de configurações, onde é adicionado ao início de cada definição o prefixo “CONFIG_”. A Figura 13 apresenta um trecho do arquivo gerado após a compilação, destacando a definição gerada pelo nosso exemplo.
Conclusão
O uso do menu é uma boa prática em projetos, visto que deixar as configurações escritas à mão dentro do código é menos rastreável e menos organizado. O artigo teve um intuito introdutório, recomenda-se que leia as documentações para utilizar a ferramenta com todos os recursos disponíveis.
Referências
https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html
https://github.com/espressif/esp-idf/blob/357a277/docs/en/api-reference/kconfig.rst
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html
https://opensource.com/article/18/10/kbuild-and-kconfig
Saiba mais
ESP32 – Lidando com Multiprocessamento – Parte I
Configurando o ambiente Eclipse para o ESP32
Configurando o ambiente de desenvolvimento do ESP32 no Windows
Muito bom!
Muito bom, Bruno!
Jeito ideal para troca de modos de operação do ESP