Extensão do Visual Studio Code para Kernel Linux Embarcado

Extensão do VSCode

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:

Extensão do VSCode

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:

image1 4

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

devicetreetodriver

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

devicetreetodocview

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:

dtsinclude

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:
ctagstodefinition
  • Dicas para completar código:
ctagscodecomplete
  • Mouse hover tags:
ctagshover

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

image15

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!

Website | Veja + conteúdo

Cientista da Computação atuando desde 2013 nas áreas de sistemas embarcados, Android e Linux. Trabalhou diretamente com o Kernel Linux embarcado em modelos de smartphones e tablets Samsung comercializados na America Latina. Colaborou no upstream para o Kernel Linux, árvore git do Linus Torvalds, para o controlador de GPIO da família de processadores utilizados nos Raspberry Pi. Palestrante FISL 2018 e Linux Developer Conference Brazil 2018.

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.

Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
André
André
21/01/2020 18:50

Eu nem sabia que o VS Code roda no Linux kkk

Talvez você goste:

Nenhum resultado encontrado.

Séries

Menu