Usando a biblioteca RTT (Real Time Transfer) da SEGGER

Neste artigo explicaremos o que é a biblioteca RTT (Real Time Transfer) da SEGGER e como ela pode nos ajudar, durante o período de desenvolvimento, a transmitir dados críticos em tempo real sem prejudicar o desempenho de nossa aplicação. Usaremos o Kit SMT32F429 Discovery e a IDE Atollic para mostrar como usar a lib RTT. Este artigo é uma continuação do artigo Convertendo ST-Link em um J-link.

 

RTT

 

A biblioteca RTT (Real Time Transfer) possibilita transferir dados em alta velocidade entre o Host (PC) e o target (microcontrolador). Esta tecnologia não usa nenhum pino adicional do microcontrolador como uma UART, conexão SWO ou semihost; ela se dá apenas entre uma região de memória RAM do microcontrolador e o J-Link. A lib RTT armazena as strings de saída nessa região de memória usando uma rotina de memcpy; posteriormente essas strings são enviadas ao J-Link via SWD ou JTAG (Protocolos de debug).

 

A velocidade máxima de envio de dados depende do tamanho do buffer e da taxa de comunicação do J-Link com o microcontrolador. Abaixo podemos ver que o RTT gasta 1 microssegundo para enviar 82 caracteres com o microcontrolador rodando a 168 MHz; em contraponto, a conexão SWO gasta 120 microsegundos, e a conexão semihost gasta 10,7 milisegundos.

 

 

Bem rápido né!

 

A biblioteca RTT usa em torno de 500 Bytes de ROM e 24 Bytes ID + 24 Bytes por canal para o bloco de controle na RAM. Cada canal requer uma quantidade de memória para o buffer. Os tamanhos recomendados são 1 kByte para canais ascendentes e 16 a 32 Bytes para canais descendentes, dependendo da carga de entrada / saída.

 

Principais funções da biblioteca

 

A biblioteca disponibiliza diversas funções para enviar e receber dados, as principais são:

  • Função SEGGER_RTT_init: Inicializa a estrutura do bloco de controle RTT ao usar somente destinos de RAM.
  • Função SEGGER_RTT_printf: Com ela é possível transmitir mensagens formatadas; ela suporta o print dos seguintes tipos de argumentos:
    • %c: char
    • %d: signed integer
    • %u: unsigned integer
    • %x: hexadecimal
    • %s: string
    • %p: ponteiro

Ex:

 

  • Função SEGGER_RTT_Write (é uma segunda opção para transmitir dados).

Ex:

  • Função SEGGER_RTT_Read: Com ela é possível receber mensagens.

 

Para ver mais detalhes de todas as funções acesse o manual da biblioteca RTT no capítulo 14.

 

Porte da biblioteca RTT

 

Neste exemplo estaremos usando o ambiente Ubuntu/Linux 16.04, o kit Discovery STM32F429 e a IDE de desenvolvimento Atollic.

 

Acesse a pasta J-Link e procure o arquivo SEGGER_RTT_V634h.tgz.

 

Caminho da pasta RTT
Caminho da pasta RTT
Conteúdo dos arquivos contidos na pasta.

 

Após descompactar a pasta e ter acesso ao seu conteúdo, criaremos uma pasta chamada Application e dentro dela enviaremos os arquivos necessários para rodar a lib RTT em nossa aplicação. Os arquivos app_rtt.c e app_rtt.h conterão as funções app_rtt_run_ex1 e app_rtt_run_ex2 com os exemplos contidos na pasta Examples.

 

Conteúdo da pasta Application

 

Crie um projeto simples e adicione a pasta Application ao seu projeto. Na função main realize a chamada das nossas 2 funções de exemplo: app_rtt_run_ex1 e app_rtt_run_ex2.

 

Configuração do terminal de Debug para usar o J-Link
Configuração do terminal de Debug para usar o J-Link

 

Acessando os dados enviados ao Host

 

Existem 3 formas de acessar os dados enviados pelo microcontrolador ao Host, são elas: via conexão Telnet; página web com J-Link Web control panel; e usando o software J-Link RTT Viewer (funciona apenas em máquinas Windows). Nesta etapa usaremos somente o exemplo da função app_rtt_run_ex1.

 

1 - Telnet

 

Durante o período de debug usando o J-Link acesse a aba Terminal do Atollic e crie uma conexão Telnet como mostra a figura abaixo:

 

Estabelecendo uma conexão Telnet
Estabelecendo uma conexão Telnet

 

Inicie o debug. Abaixo executamos a aplicação app_rtt_run_ex1(). Esta função usa o exemplo contido no arquivo Main_RTT_PrintfTest.c. Na figura abaixo podemos ver os dados sendo recebidos via conexão Telnet.

 

Dados recebidos via Telnet

 

2 - J-Link Web Control Panel

 

Uma segunda forma de receber os dados do RTT é via browser. Acessando o endereço 127.0.0.1:19080 na aba RTT podemos visualizar os mesmos dados sendo recebidos.

 

Recebendo os dados RTT via Browser
Recebendo os dados RTT via Browser

 

3 - J-Link RTT Viewer (funciona somente em ambiente Windows)

 

Realize o download do arquivo JLink_Windows_V635g.exe no site da Segger. Após instalar o pacote você terá acesso às ferramentas disponibilizadas pela SEGGER para serem usadas com o J-Link. Estamos usando uma versão lite do J-Link, portanto alguns recursos podem ser limitados.

 

Download do pacote J-Link
Download do pacote J-Link
Abrindo e configurando o J-LInk RTT Viewer
Abrindo e configurando o J-LInk RTT Viewer
Recebendo os dados via RTT no terminal 0
Recebendo os dados via RTT no terminal 0

 

Também é possível customizar o formato de saída das mensagens como mostra a imagem abaixo, para mais informações acesse o link.

 

 

Extra: Redirecionando a saída de conexão Telnet a uma porta serial Virtual

 

Vão existir momentos nos quais vamos querer ver a variação de um sinal na forma de gráficos, e infelizmente nenhuma das situações acima vai nos possibilitar isso. Uma forma de fazê-lo é usar o SerialPlot, mas como jogar a saída e entrada de uma conexão Telnet a uma conexão serial? Felizmente para resolver isso podemos usar a ferramenta socat.

 

Instale o pacote socat:

Nesta parte focaremos na função app_rtt_run_ex2, ela transmitirá dados aleatórios gerados pelo RNG do microcontrolador.

 

 

Infelizmente como vimos acima a função SEGGER_RTT_printf não suporta a formatação %f usada para imprimir variáveis do tipo float. Para resolver isso habilitamos esse recurso no compilador e usaremos a função sprintf.

 

Para habilitar o recurso adicione o comando -u _printf_float nas propriedades de compilação do projeto como mostra a figura abaixo.

 

Habilitando o print de dados do tipo float

 

Agora, durante o período de debug, execute o comando abaixo para redirecionar a saída da conexão Telnet à porta serial virtual /dev/ttyS1.

 

Em seguida abra outro terminal e libere os recursos de escrita e leitura para seu usuário na porta ttyS1.

 

Feito isso, estabeleça uma conexão na porta /dev/ttyS1 usando o SerialPlot. A imagem abaixo mostra os dados aleatórios gerados e transmitidos via RTT e recebidos via SerialPlot.

 

Recebendo dados RTT via SerialPlot
Recebendo dados RTT via SerialPlot

 

Conclusão

 

Neste artigo explicamos um pouco como funciona a biblioteca RTT da SEGGER, como adicioná-la e usá-la em um projeto usando o Kit SMT32F429 discovery e a IDE Atollic. Vimos 3 formas diferentes de receber esses dados e como redirecionar a saída Telnet para uma porta serial virtual.

 

Vantagens:

  • É uma ferramenta confiável para transmitir dados críticos em tempo real;
  • A velocidade de transmissão via RTT é muito maior comparada à uma transmissão via UART, SWO ou semihost.

 

Desvantagens:

  • Ela só pode ser usada em modo de debug com o J-Link;
  • Dependendo do número de canais criados há um consumo considerável de memória RAM. (Neste artigo usamos o canal default zero para transmitir os dados);
  • Por estarmos usando uma versão limitada do J-Link para os kits da ST alguns recursos dos softwares também são limitados.

 

Extra:



Durante escrita deste artigo percebi a existência de um arquivo chamado JLinkARM.dll na pasta JLink_V635g. Lendo mais a respeito eu vi que a SEGGER possui um SDK que nos possibilita usar essa dll em suas aplicações C#, C++, Visual Basic, etc. Ela nos permite criar aplicações de gravação e leitura da flash e RAM, visualizar variáveis em run time durante o debug, e até mesmo ferramentas de automação de testes e validação. Para mais informações acesse o link.

 

Usando J-Link SDK com Visual Basic .NET
Usando J-Link SDK com Visual Basic .NET

 

Código fonte:

https://github.com/JorgeGzm/STM32-RTT

 

Saiba mais

 

Debug Remoto na Raspberry Pi através do Plugin Pydev do Eclipse

Utilizando a UART da FRDM-K64F com o componente fsl_debug_console

Conhecendo o SerialPlot

 

Referências:


https://www.segger.com/products/debug-probes/j-link/tools/rtt-viewer/

https://www.segger.com/products/debug-probes/j-link/technology/j-link-sdk/

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Jorge Guzman
Sou formado em engenharia da computação com pós-graduação em automação industrial e engenharia de software. Possuo experiência no desenvolvimento de hardware, firmware, distribuições Linux e software para sistemas embarcados. Sou adepto ao compartilhamento do conhecimento e totalmente contra a metodologia de desenvolvimento GHP (Go Horse Process) em projetos.

Deixe um comentário

avatar
 
  Notificações  
Notificar