Usando a biblioteca RTT (Real Time Transfer) da SEGGER

segger jlink

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.

image7 4

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
image11 1
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.

image5 5
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 via 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.

image10 1

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.

image2 8
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/
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.

[wpseo_breadcrumb]
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:

Séries

Menu
Privacy Settings saved!
Configurações de Privacidade

Entenda quais dados e informações usamos para ter melhor entrega de conteúdo personalizado para você.

These cookies are necessary for the website to function and cannot be switched off in our systems.

Para usar este site, usamos os seguintes cookies tecnicamente exigidos

  • wordpress_test_cookie
  • wordpress_logged_in_
  • wordpress_sec

Decline all Services
Accept all Services