Criando o arquivo de configuração Kconfig para sua aplicação IDF com o ESP32

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. 

Kconfig
Figura 1 – Template do projeto.

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.

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”.

Kconfig
Figura 2 – Menu principal.

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.

Kconfig
Figura 3 – Entrada de dados valor inteiro.

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. 

Kconfig
Figura 4 – Valor invalido.

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.

Kconfig
Figura 5 – Tela de help.

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.

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.

Kconfig
Figura 6 – Entrada de dados 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”.

 As opções presentes dentro de um choice podem pertencer apenas ao tipo bool, como apresentado no exemplo.

Kconfig
Figura 7 – Configuração de modo de operação do FW.

Ao entrar no submenu é apresentado todas as opções possíveis para a configuração, assim como representado na Figura 8.

Kconfig
Figura 8 – Opções de modo de operação do FW.

É 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. 


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).

Figura 9 – Checkbox de configuração.

Notamos que ao marcar o checkbox a opção “pino de sensor” é apresentada no menu, como apresentado na Figura 10.

Figura 10 – Campo com dependência.

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:

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.

Figura 11 – Entrada de dados do sensor 1.
Figura 12 – Lógica if no campo pino do sensor 2.

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.

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.

Figura 13 – Arquivo sdkconfig.h.

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

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Criando o arquivo de configuração Kconfig para sua aplicação IDF com o ESP32
Comentários:
Notificações
Notificar
guest
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Vagner Rodrigues
Vagner Rodrigues
18/11/2020 10:02

Muito bom, Bruno!

Carlos
Carlos
06/11/2020 11:51

Jeito ideal para troca de modos de operação do ESP

Talvez você goste:

Nenhum resultado encontrado.

Séries

Menu