Saturday, October 11, 2014

Nuttx 7.5 Realtime Operating System na STM32VLDiscovery, Tiva C, FRDM-KL25Z

O Nuttx (http://www.nuttx.org/)  é um sistema operacional de tempo real que tem praticamente tudo que tem no Linux.
A grande vantagem é que cabe em microcontroladores de 8-bits até 32-bits, consumo de energia ultra-low-power.



Com o Nuttx instalado é possível usar a biblioteca pthread do praticamente do mesmo jeito do Linux, também dá para fazer scripts e gravar na própria flash do microcontrolador, tem Ramdisk, sistema de arquivos em rede (NFS), e drivers para zilhões de sensores, rádios e adaptadores de rede, ... é praticamente um PC com Linux só que ultra-low-power.

UPDATE:  +Jeronimo Avelar Filho me reportou bugs no build pelo MacOSX. Faltou colocar neste post uma coisa em relação ao processo de compilação. Quando o Nuttx é configurado para uma placa cria vários links dentro do sistema de build, se mudar de configuração e tentar buildar denovo vai dar vários erros, antes de reconfigurar para outra placa é preciso fazer um "make distclean" para limpar completamente os resíduos da configuração anterior. Outra opção é fazer um git checkout para cada placa em diretórios diferentes.


Instalando na stm32vldiscovery

#baixar os fontes
git clone http://git.code.sf.net/p/nuttx/git
#entrar na pasta
cd git
#mudar para o código da tag 7.5
git checkout nuttx-7.5
#ir para pasta de ferramentas
cd nuttx/tools
#configurar para stm32vldiscovery
./configure.sh stm32f100rc_generic/nsh
# voltar para raiz do nuttx
cd ..
#para compilar o projeto da shell nsh para stm32vldiscovery
make
#para gravar o projeto na stm32vldiscovery (instale antes https://github.com/texane/stlink)
st-flash write nuttx.bin 0x8000000
#conecte um cabo usb-ttl (pl2303, ftdi, cp2301, ...) nos pinos PA2 e PA3
para ter acesso a console ao prompt do NSH, comandos de Linux como free, ps, df e vários outros estão disponíveis.

STM32VLDiscovery com ARM Cortex-M3 STM32F103RG
(configurado para usar somente 24 Kbytes de RAM)
RAM 96 Kbytes
Flash 1 MByte
Espaço da RAM usado pelo Nuttx.bin é 11KBytes fica 85KBytes livres para aplicativos
Espaço da flash usado pelo Nuttx.bin é 67Kbytes fica 957Kbytes livres para aplicativos
No caso a minha STM32VLDiscovery foi modificada para substituir o STM32F100RB (8KB RAM 128KB flash) por um STM32F103RG (96KB RAM 1MB flash).

Foi necessário mudar algumas coisas no código para ajustar o tamanho da RAM.

Também dá para usar a STM32VLDiscovery para gravar outras placas STM32 por SWD, que faz o mesmo serviço de uma JTAG usando apenas 2 fios.

Para ativar o SWD para um STM32 externo basta abrir os jumpers do CN3.
E conectar o SWCLK e SWDIO no STM32 externo,
o GND é mandatório sempre ligar,
o VCC liga se precisa alimentar a placa externa.

STM32VL gravando o Nuttx.bin em uma CZ miniSTM32F103V_-EK
Esse é um STM32F103VET6 - ARM Cortex-M3 64KB RAM e 512KB Flash

STM32VL pin 2 --> externo PA14 (SWCLK)
STM32VL pin 3 --> externo GND
STM32VL pin 4 --> externo PA13 (SWDIO)


Instalando na FRDM-KL25Z

#baixar os fontes
git clone http://git.code.sf.net/p/nuttx/git
#entrar na pasta
cd git
#mudar para o código da tag 7.5
git checkout nuttx-7.5
#ir para pasta de ferramentas
cd nuttx/tools
#configurar para FRDM-KL25Z
./configure.sh freedom-kl25z/nsh
# voltar para raiz do nuttx
cd ..
#para compilar o projeto da shell nsh para FRDM-KL25Z
make
#instalar o firmware da OpenSDA da MBED
http://developer.mbed.org/handbook/Firmware-FRDM-KL25Z
Agora que a FRDM-KL25Z virou um pendrive MBED gravador de firmware basta arrastar o nuttx.bin para dentro.

Freescale FRDM KL25Z com ARM Cortex-M0 16KBytes RAM 128KBytes
Usado de RAM pelo Nuttx.bin 6 KB e livre 10 KB para apps
Usado de Flash pelo Nuttx.bin 38KB e livre 90KB para apps
Um outra vantagem do OpenSDA da MBED é que dá para acessar o NSH do Nuttx pela porta serial USB virtual da MBED, no caso do Linux é só abrir o minicom na /dev/ttyACM0

Não foi necessário modificar nada no código para funcionar de primeira.

Instalando na Tiva EK-TM4C123GXL e Stellaris EK-LM4F120XL

#baixar os fontes
git clone http://git.code.sf.net/p/nuttx/git
#entrar na pasta
cd git
#mudar para o código da tag 7.5
git checkout nuttx-7.5
#ir para pasta de ferramentas
cd nuttx/tools
#configurar para Tiva/Stellaris
./configure.sh tm4c123g-launchpad/nsh
# voltar para raiz do nuttx
cd ..
#para compilar o projeto da shell nsh para Tiva/Stellaris
make
#instale o lm4flash (https://github.com/utzig/lm4tools)
#programe a Tiva/Stellaris com o nuttx.bin
lm4flash nuttx.bin 

Tiva C com ARM Cortex-M4F 32KB RAM 256KB Flash
Usado de RAM pelo Nuttx.bin 10 KB e livre 22 KB para apps
Usado de Flash pelo Nuttx.bin 52KB e livre 204 KB para apps
No caso da Tiva/Stellaris já existe um conversor serial usb na placa, basta abrir o minicom na /dev/ttyACM0

Foi necessários modificar o toolchain para compilar com o GNU Tools for ARM Embedded Processors (https://launchpad.net/gcc-arm-embedded), o STM32 e o FRDM-KL25 também usam esse mesmo toolchain. Também dá para usar outros toolchains ou criar o seu próprio.


Como considerações finais deste post, pode se dizer que instalando o Nuttx, não importa mais qual o microcontrolador usado, sempre haverá uma interface de programação praticamente igual ao Linux, e dezenas de drivers e bibliotecas prontas para uso.