Compilando e testando o NuttX na Freedom Board KL25Z da Freescale
- por Sergio Prado
No último artigo falei um pouco sobre os conceitos e características principais do NuttX, um sistema operacional de tempo real bem completo para microcontroladores de 8 a 32 bits.
Neste artigo iremos estudar como compilar e testar o NuttX na Freedom Board KL25Z da Freescale.
O HARDWARE
A Freedom Board KL25Z é um kit de desenvolvimento de baixo custo ($12.95 no momento em que escrevo este artigo) que utiliza um microcontrolador da linha Kinetis KL2x da Freescale.
A placa é baseada no microcontrolador MKL25Z128VLK4, um ARM Cortex-M0+ rodando à 48MHz, com 128KB de memória flash e 16KB de memória RAM. Possui alguns periféricos, incluindo um touch deslizante capacitivo, um acelerômetro e um led de 3 cores, além de um barramento de pinos compatível com shields Arduino.
AMBIENTE DE DESENVOLVIMENTO
Todos os procedimentos descritos neste artigo foram executados em um PC com a distribuição Ubuntu 14.04 64 bits instalada, mas devem funcionar em outras distribuições GNU/Linux, com pouca ou nenhuma alteração.
Antes de começar, crie um diretório no HOME do seu usuário para baixar o código-fonte necessário para trabalhar com o NuttX:
$ mkdir -p ~/nuttx && cd ~/nuttx |
TOOLCHAIN
Para compilar o NuttX, utilizaremos o toolchain mantido e disponibilizado pela ARM.
Execute o comando abaixo para baixar e descompactar o toolchain:
$ wget https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q2-update/+download/gcc-arm-none-eabi-4_9-2015q2-20150609-linux.tar.bz2 $ tar xfv gcc-arm-none-eabi-4_9-2015q2-20150609-linux.tar.bz2 |
Adicione o caminho dos binários do toolchain no PATH do sistema (caso feche o terminal corrente, não se esqueça de executar este comando novamente, ou então adicione-o ao .bashrc do seu usuário):
$ export PATH=~/nuttx/gcc-arm-none-eabi-4_9-2015q2/bin/:$PATH |
E teste o toolchain:
$ arm-none-eabi-gcc -v |
BAIXANDO O CÓDIGO-FONTE DO NUTTX
O NuttX é versionado com o git e seu repositório está disponível no Bitbucket. Clone o repositório com o comando abaixo:
$ git clone https://bitbucket.org/patacongo/nuttx.git |
Verifique se o repositório foi clonado corretamente:
$ ls nuttx/ arch Directories.mk Kconfig Makefile ReleaseNotes audio Documentation KernelLibs.mk Makefile.unix sched binfmt drivers lib Makefile.win syscall ChangeLog FlatLibs.mk libc mm TODO configs fs libnx net tools COPYING graphics LibTargets.mk ProtectedLibs.mk crypto include libxx README.txt |
Clone também o repositório de aplicações do NuttX (este repositório contém algumas aplicações adicionais para o NuttX, incluindo o terminal de linha de comandos NuttShell que utilizaremos mais adiante neste artigo):
$ git clone https://bitbucket.org/nuttx/apps.git |
Verifique se o repositório foi clonado corretamente:
$ ls apps/ builtin graphics Kconfig modbus platform ChangeLog.txt import libapps.a netutils README.txt COPYING include Make.defs nshlib system examples interpreters Makefile NxWidgets tools |
Agora entre no diretório do código-fonte do NuttX:
$ cd nuttx/ |
O repositório git do NuttX possui alguns submódulos que precisam ser atualizados:
$ git submodule init $ git submodule update |
CONFIGURANDO
Para configurar o NuttX para uma plataforma de hardware, basta entrar no diretório tools e executar o script configure.sh, passando como parâmetro o nome da placa e da aplicação que você deseja configurar para compilação:
$ cd tools/ $ ./configure.sh freedom-kl25z/nsh $ cd .. |
Caso queira configurar o NuttX para uma outra plataforma de hardware, todas as placas suportadas estão disponíveis no diretório configs do código-fonte.
Ao executar o script configure.sh, será criado um arquivo chamado .config com a configuração do NuttX para a plataforma de hardware selecionada.
$ cat .config |
COMPILANDO
Para compilar o NuttX, basta executar o make:
$ make |
Ao final do processo de compilação, as imagens estarão disponíveis no diretório raiz do código-fonte:
$ ls -l nuttx* -rwxrwxr-x 1 sprado sprado 75682 Jul 21 17:29 nuttx -rwxrwxr-x 1 sprado sprado 39264 Jul 21 17:29 nuttx.bin -rwxrwxr-x 1 sprado sprado 105738 Jul 21 17:29 nuttx.srec |
Conecte a placa à sua máquina de desenvolvimento com um cabo USB e grave a imagem gerada. Utilize o arquivo nuttx.srec caso esteja utilizando o bootloader da P&E Micro ou o arquivo nuttx.bin caso esteja utilizando o bootloader do mbed.
TESTANDO
Com a placa conectada à sua máquina de desenvolvimento pelo cabo USB, execute uma aplicação de comunicação serial (minicom, picocom, screen, putty, etc) na porta serial /dev/ttyACM0, configurando o baud para 115200:
$ sudo picocom /dev/ttyACM0 -l -b 115200 -f n |
Você deverá ter acesso ao terminal de linha de comandos NuttShell!
NUTTSHELL
O NuttShell, ou apenas NSH, é um terminal de linha de comandos bem simples e funcional para o NuttX.
Os comandos disponíveis podem ser exibidos digitando help, conforme abaixo:
nsh> help help usage: help [-v] [] ? echo help mb sleep cat exec hexdump mh uname cmp exit kill mw usleep date free ls ps xd Builtin Apps: pwm |
A maioria dos comandos estão integrados ao NSH, mas comandos extras podem ser adicionados conforme a necessidade (veja por exemplo o comando pwm em “Builtin Apps” acima).
Existem alguns comandos bem interessantes, e muitos outros podem ser habilitados na configuração do NuttX.
Por exemplo, o comando free irá exibir a quantidade de memória RAM disponível:
nsh> free total used free largest Mem: 13664 3816 9848 9848 |
Já o comando ps irá listar todas as tarefas em execução (neste exemplo temos a tarefa idle do kernel e a tarefa do NSH):
nsh> ps PID PRI SCHD TYPE NP STATE NAME 0 0 FIFO KTHREAD READY () 1 100 FIFO TASK RUNNING () |
O NuttX se assemelha mesmo à um sistema GNU/Linux devido à implementação do sistema de arquivos virtual (VFS ou Virtual Files System).
Durante a inicialização, o NuttX irá montar o rootfs utilizando um sistema de arquivos em memória (pseudo filesystem), que pode ser listado conforme abaixo:
nsh> ls / /: dev/ |
E idêntico à sistemas GNU/Linux, o acesso ao hardware é exportado pelos drivers através de arquivos de dispositivo no diretório /dev:
nsh> ls /dev /dev: console null ttyS0 |
A documentação do NSH, com uma descrição de todos os comandos disponíveis, pode ser acessada no site do projeto.
ADICIONANDO UMA APLICAÇÃO NO NSH
Existem diversas aplicações de exemplo que podem ser compiladas e adicionadas ao NSH:
$ cd ~/nuttx/apps/ $ ls examples/ adc flash_test Makefile nxhello README.txt tiff ajoystick ftpc mm nximage relays timer bastest ftpd modbus nxlines rgmp touchscreen bridge hello mount nxterm romfs udgram buttons helloxx mtdpart nxtext sendmail udp can hidkbd mtdrwb ostest serialblaster unionfs cc3000 i2schar netpkt pashello serialrx usbserial configdata igmp nettest pipe serloop usbterm cpuhog json nrf24l01_term poll slcd ustream cxxtest Kconfig nsh posix_spawn smart watchdog dhcpd keypadtest null pppd smart_test webserver discover lcdrw nx pwm tcpecho wget djoystick ltdc nxffs qencoder telnetd wgetjson elf Make.defs nxflat random thttpd xmlrpc |
Para testar, vamos adicionar a aplicação hello, que apenas exibe uma mensagem na console.
Para adicionar a aplicação, podemos alterar diretamente o arquivo de configuração .config. Mas a forma mais fácil e intuitiva de alterar a configuração é utilizando um frontend gráfico para o kconfig, o mecanismo de configuração utilizado pelo NuttX. Para isso, precisamos compilar e instalar a ferramenta kconfig-frontends.
Primeiro execute o comando abaixo para preparar a máquina de desenvolvimento:
$ sudo apt-get install gperf libncurses5-dev flex bison |
Agora baixe o código-fonte, compile e instale o kconfig-frontends:
$ cd ~/nuttx $ wget http://ymorin.is-a-geek.org/download/kconfig-frontends/kconfig-frontends-3.12.0.0.tar.bz2 $ tar xfv kconfig-frontends-3.12.0.0.tar.bz2 $ cd kconfig-frontends-3.12.0.0 $ ./configure --prefix=/usr $ make $ sudo make install |
Retorne ao diretório do NuttX:
$ cd ~/nuttx/nuttx |
E abra o menu de configuração:
$ make menuconfig |
Agora está fácil! :)
Acesse o menu de configuração e habilite a aplicação hello, conforme abaixo:
Application Configuration ---> Examples ---> [*] "Hello, World!" example |
Recompile e grave a nova imagem na placa.
Ao digitar help, a aplicação deverá aparecer na seção “Builtin Apps“:
nsh> help help usage: help [-v] [] ? echo free kill mh sleep cat exec help ls mw usleep cmp exit hexdump mb ps xd Builtin Apps: hello pwm |
Teste a aplicação:
nsh> hello Hello, World!! |
O NuttX realmente me surpreendeu positivamente. Continuarei acompanhando a evolução do projeto, e espero em breve poder utilizá-lo em um projeto acadêmico ou comercial.
Enquanto isso, sinta-se à vontade para retornar ao menu de configuração, estudar as opções disponíveis, habilitar alguma nova opção e testar.
Divirta-se!
Um abraço,
Sergio Prado