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.
# 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
endmenuNotamos 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.
# Kconfig exemplo
menu "Configurações do projeto teste"
config REGISTRO_1
hex
prompt "Valor do registro"
default 0x05
help
valor do registro 1
endmenuAbaixo 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”.
# 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
endmenuAs 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.
# 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:
# 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.
endmenuO 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.
#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