Com­pi­lando e testando o NuttX na Free­dom Board KL25Z da Freescale

- por Sergio Prado

Categorias: RTOS Tags: , ,

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 Free­dom Board KL25Z da Freescale.

O HARDWARE

A Free­dom 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.

FRDM-KL25Z

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!

nsh

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

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

  • Jorge Guzman

    Olá Sergio,
    Tentei reproduzir o passo a passo mas usando uma placa tm4c123g-launchpad, estou usando e apontando no PATH o toolchain que já uso para programar a placa é o mesmo usado no tutorial, mas também já tentei realizar o teste de varias outras formas sem sucesso.
    O erro acontece quando configuro o nuttx para a plataforma de hardware alvo, no meu caso:
    $ ./configure.sh tm4c123g-launchpad/nsh

    Durate o comando make aparece a seguinte mensagem de erro:
    “/nuttx/tools/mkdeps.sh: linha 106: arm-nuttx-elf-gcc: comando não encontrado”

    Não sei se você pode estar me ajudando por ser outra placa rsrsr XD, mas desde já obrigado pela atenção.

    • Olá Jorge,

      Você consegue executar o toolchain manualmente?

      $ arm-nuttx-elf-gcc

      • Jorge Guzman

        Oi,
        Não, ele não consegue executar esse comando, ele só encontra o $ arm-none-eabi-gcc.

        Um pessoal aconselhou adicionar a linha “CROSSDEV=arm-none-eabi-” antes de “CC = $(CROSSDEV)gcc” no arquivo configs/tm4c123g-launchpad/nsh/Make.defs, para forçar o uso do toolchain, mesmo assim não deu certo e gera a seguinte mensagem “cc1: error: target CPU does not support ARM mode”

        Alguma ideia do que pode ser?

  • Rafael Murakami

    Muito bom o tutorial Sergio! Você teria mais alguma fonte de informação além da documentação oficial para auxiliar no aprendizado com o nuttx?

    • Olá Rafael!

      Infelizmente não conheço nenhuma outra fonte de informação sobre o NuttX além da documentação oficial.

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.