Se você está começando a trabalhar com, ou a estudar, desenvolver para sistemas embarcados microprocessados, talvez, você esbarre na tarefa de ter que desenvolver um módulo, ou editar algum device tree, para o Kernel Linux.
Então que ferramenta de edição de código ou IDE utilizar para ganhar agilidade nessas tarefas? O editor de código mais popular entre os desenvolvedores do Kernel Linux é o VIM, e seus muitos plugins. Não é minha intenção aqui entrar no mérito de qual a melhor IDE, editor de texto, nem blasfemar contra a religião das pessoas. É, o VIM tem até igreja para seus seguidores ????. Brincadeiras a parte, cada um tem a sua preferência, e se adapta melhor a uma certa ferramenta.
Eu pessoalmente me adapto melhor ao VS Code. Usei o Atom por bastante tempo, mas o VS Code me ganhou, por ser similar ao Atom e pelas extensões, temas, APIs para criar extensões, tarefas e etc. Porém, como nem tudo são flores, para projetos com base de código grandes, caso do Kernel Linux, a extensão padrão da Microsoft para C/C++ é bem pesada, demora para indexar, devora sua memória RAM e deixa tudo travado ????. Além de sentir falta de alguns plugins para agilizar tarefas em arquivos de device-tree. A solução foi criar uma extensão, pensando no desenvolvimento de Kernel Linux embarcado para o VS Code.
Extensão – Embedded Linux Kernel Dev
A extensão pode ser baixada no Visual Studio Marketplace. Ou no menu “View > Extensions” do próprio VS Code:
Estou compartilhando a extensão com licença MIT, open source. Fiquem livres para contribuir ou usar como quiserem.
Dependências
A extensão, por hora, funciona apenas em sistemas Linux e usa alguns pacotes para seu funcionamento correto. Antes de usar é necessário instalar as seguintes dependências em seu sistema:
- bash
- universal-ctags
Um detalhe importante é que seja instalado o universal-ctags e não o exuberant-ctags. Pois o exuberant não indexa arquivos de device tree.
Para uma experiência completa de desenvolvimento para o kernel Linux, durante a instalação da extensão, as seguintes extensões serão requisitadas a serem instaladas em conjunto:
- DeviceTree (implementa syntax highlighting para arquivos de device-tree .dts e .dtsi)
- kconfig (implementa syntax highlighting para arquivos Kconfig)
Funcionalidades
Todas as funcionalidades da extensão podem ser executadas, por comandos de click, pela barra de atividades:
Nos próximos tópicos, irei descrever cada uma das funcionalidades da extensão, bem como descrever o problema que resolve.
Device Driver From Compatible
Um das tarefas repetitivas, no meu dia dia, era a procura pelo match em arquivos “.c”, código de driver, de uma certa string “compatible”. Vamos usar o arquivo bcm2837-rpi-3-b.dts como exemplo. Esse é o device tree source que descreve o hardware do Raspberry Pi 3B para o kernel Linux. Note o trecho retirado do arquivo:
O “compatible”, em destaque na imagem, é a string que faz o “bind” entre a descrição do hardware, nó do device tree, e o driver do kernel que irá usar essa descrição. Para saber qual é o arquivo “.c” do driver que será utilizado, eu fazia uma busca, um grep, entre os arquivos “.c”, pela string do compatible. Pegava as respostas listadas, pelo grep, e abria o arquivo no editor.
Agora com a extensão, dentro de um arquivo de device-tree, “.dts” ou “.dtsi”, posso clicar com o mouse sobre uma string de “compatible” e selecionar o comando “Device Driver from compatible”. O VS Code irá realizar o match, busca, automaticamente e vai abrir o arquivo de código, “.c”, do driver que implementa o “compatible”:
Essa funcionalidade também pode ser selecionada no menu de contexto, com click do botão direito:
Device Tree Doc From Compatible
Aqui o mesmo problema de procura por string de “compatible” acontecia, só que para arquivos de documentação. Todos os device tree bindings tem uma documentação em “Documentation/devicetree/bindings”.
Agora com a extensão dentro de um arquivo de device-tree, “.dts” , “.dtsi”, ou código “.c”, posso clicar com o mouse sobre uma string de “compatible” e selecionar o comando “Device Tree Doc From Compatible”. O VS Code irá abrir o arquivo de documentação respectivo ao “compatible”:
Essa funcionalidade também pode ser selecionada no menu de contexto, com click do botão direito:
ARM/ARM64 dts/dtsi From Include
Geralmente arquivos “.dts” tem seus includes, “.dtsi”. A repetição que eu tinha aqui era de ter que ir até o terminal, digitar o caminho e nome do arquivo “.dtsi” para abrir o include.
Agora com a extensão dentro de um arquivo de device-tree, “.dts” ou “.dtsi”, apenas clico com o mouse sobre o string, de um device-tree include, e selecione o comando “ARM dts/dtsi From Include”. O VS Code irá abrir o arquivo correspondente automaticamente:
Essa funcionalidade também pode ser selecionada no menu de contexto, com click do botão direito:
Há duas opções deste comando, uma para ARM e outra para ARM64, pois os devices-tree para cada uma dessas ficam em caminhos diferentes.
Linux Include From Selected
Essa é uma funcionalidade da qual sentia falta, que funcionava na extensão padrão do C/C++, para abrir includes “.h”.
Dentro de arquivos “.c”, “.dts” ou “.dtsi”, clique com o mouse sobre um string de um include e selecione o comando “Linux Include From Selected”. O VS Code irá abrir o include correspondente:
Essa funcionalidade também pode ser selecionada no menu de contexto, com click do botão direito:
Generate CTags
Por último, mas, nem de longe, a menos importante. Essa funcionalidade gera um arquivo “.vscode-ctags” na raiz da pasta que foi aberta. Esse arquivo é o índice de tags gerado pelo universal-ctags. Ele é necessário para gerar as ajudas de navegação no código do projeto:
- Pular para a definição:
- Dicas para completar código:
- Mouse hover tags:
O Ctags resolve o problema das dicas de código e navegação da extensão C/C++ do VS Code. As funcionalidades são mais básicas, não possui um code linter por exemplo, mas em contrapartida é bem mais leve e fluído.
Atalhos de Teclado
Outro funcionalidade interessante é que a extensão também exporta todos os comandos, para serem usados em atalhos de teclado. Utilize os seguintes nomes para assinar os comandos aos atalhos de sua preferência:
- embeddedLinuxDev.findAndOpenDeviceTreeDoc
- Device Tree Doc From Compatible
- embeddedLinuxDev.findAndOpenDeviceTreeMatchDriver
- Device Driver From Compatible
- embeddedLinuxDev.openArmDtsDtsi
- ARM dts/dtsi From Include
- embeddedLinuxDev.openArm64DtsDtsi
- ARM64 dts/dtsi From Include
- embeddedLinuxDev.findAndOpenDeviceTreeMatchDriver
- Generate CTags
Exemplo, definindo o atalho “alt+d” para executar o comando “Device Tree Doc From Compatible”:
Confira também o vídeo aonde mostro na prática a utilização da extensão:
Conclusões
Essas foram as funcionalidades implementadas, que resolvem e agilizam meu workflow, para desenvolvimento de kernel Linux embarcado, utilizando o VS Code.
Eu considero o VS Code bem amigável e com uma estrutura bem intuitiva. A utilização de Linux para dispositivos e soluções embarcados é crescente, e eu vejo o VS Code como a ferramenta, para edição de código, de escolha para desenvolvedores que estão migrando para o mundo do Linux embarcado. Digo minha experiência pessoal, ainda lá na época que migrei do Windows e Visual Studio, para o Linux e Atom. Achei o VIM e as outras opções meio “esquisitas” ao que estava acostumado.
A extensão está em uma versão Alfa. Há coisas que poderiam ser melhoradas ou incluídas. Fiquem a vontade para contribuir. O bacana do open source é isso. Você não fica preso a uma ferramenta, pode estender ela, reutilizar funcionalidades, escrever a sua própria ????.
Espero que tenham gostado da extensão, se for útil pra você deixe eu saber. Comente aqui nos comentários. Abraços!





















Eu nem sabia que o VS Code roda no Linux kkk