Hloubkové ladění vestavěných systémů: SEGGER RTT a SystemView pro FreeRTOS
Efektivní ladění a analýza výkonu vestavěných systémů jsou základním kamenem vývoje mikrokontrolérů. Technologie SEGGER RTT (Real-Time Transfer) a SystemView nabízejí výkonné nástroje pro tyto úkoly, umožňující vývojářům získat detailní ladicí informace a provádět hloubkový monitoring operačního systému reálného času (RTOS), jako je FreeRTOS, aniž by zastavily činnost cílového zařízení. V tomto článku se podíváme na principy fungování a praktické aspekty nastavení RTT Viewer pro výstup logů a SystemView pro vizualizaci událostí RTOS, což je kriticky důležité pro diagnostiku složitých vzorců chování vestavěného softwaru.
Základy ladění vestavěných systémů a role SEGGER RTT
Ladění vestavěných systémů vyžaduje specializované přístupy, které minimalizují vliv na chování cílového zařízení. Tradiční metody, jako je JTAG/SWD ladění s breakpointy, mohou způsobovat nežádoucí zpoždění. Zde přicházejí na pomoc mechanismy jako DAP (Debug Access Port), ITM (Instrumentation Trace Macrocell) a RTT (Real-Time Transfer).
- DAP (Debug Access Port): Hardwarový blok, který poskytuje přístup k sběrnicím a jádru mikrokontroléru pro účely ladění.
- ITM (Instrumentation Trace Macrocell): Specializovaný blok v jádrech Cortex-M (počínaje M3), určený pro vysokorychlostní výstup ladicích zpráv s minimálními časovými ztrátami.
- RTT (Real-Time Transfer): Patentovaná technologie společnosti SEGGER, která využívá kruhový buffer v operační paměti (RAM) mikrokontroléru pro obousměrnou výměnu dat s hostitelským počítačem. Klíčovou výhodou RTT je neintruzivnost: CPU mikrokontroléru se nezastavuje a ladicí informace se přenášejí velmi vysokou rychlostí, což ji činí ideální pro výstup logů (
printf) v reálném čase.
Pro integraci RTT do projektu je nutné přidat zdrojové soubory knihovny SEGGER RTT. Proces není vázán na konkrétní vývojové prostředí (IDE), ať už je to Keil uVision nebo jiné. Po kompilaci a spuštění ladicí program J-Link automaticky vyhledá strukturu RTT Control Block (CB) v RAM mikrokontroléru. Tento blok obsahuje identifikátor, počet kanálů a popis kruhových bufferů pro čtení a zápis, čímž poskytuje vstupní bod pro výměnu dat. Ve většině případů je vyhledávání automatizované, ale je možné i ruční nastavení adresy.
Příklad připojení a použití RTT:
Připojení hlavičkových souborů:
#include <stdio.h>
#include "SEGGER_RTT.h"
Obalové funkce pro typizované zprávy (volitelné, pro usnadnění):
#define LOG_INFO(msg, ...) { SEGGER_RTT_TerminalOut(0, "INFO: "); SEGGER_RTT_printf(0, msg, ##__VA_ARGS__); }
#define LOG_ERR(msg, ...) { SEGGER_RTT_TerminalOut(0, "ERROR: "); SEGGER_RTT_printf(0, msg, ##__VA_ARGS__); }
void LOG_FLOAT(const char* prefix, float value, const char* suffix) {
char buf[64];
snprintf(buf, sizeof(buf), "%s%.2f%s", prefix, value, suffix);
SEGGER_RTT_TerminalOut(0, buf);
}
Inicializace Control Block a výstup logů:
SEGGER_RTT_Init();
// ...
LOG_INFO("Central Heating: %s\r\n", Boiler.isCentralHeatingActive(response) ? "on" : "off");
LOG_ERR("Error: OpenTherm is not initialized");
Nástroj RTT Viewer, který je součástí balíčku ovladačů J-Link, umožňuje prohlížení těchto logů. Podporuje výstup informací na různé záložky (terminály) a použití několika kanálů RTT pro pokročilejší přenos uživatelských dat. Výhody RTT zahrnují možnost výstupu printf přes SWD bez použití dalších pinů mikrokontroléru (například SWO), kompatibilitu s Cortex-M0/M0+, jednoduchost nastavení a velmi vysokou rychlost ve srovnání s jinými metodami.
SystemView: Detailní analýza výkonu RTOS v reálném čase
SystemView je výkonný nástroj SEGGER pro analýzu a vizualizaci práce vestavěných systémů v reálném čase, který využívá RTT jako transportní vrstvu. Umožňuje vývojářům hlouběji porozumět chování FreeRTOS, sledovat přepínání úloh, zpracování přerušení a další systémové události. Nastavení SystemView je složitější než RTT a zahrnuje několik klíčových kroků:
- Připojení zdrojových souborů: Přidejte potřebné soubory SystemView do projektu.
- Nastavení FreeRTOS: SystemView funguje tak, že zachytává trace makra FreeRTOS (trace-makra), která jsou umístěna v klíčových bodech jádra (například při vytvoření úlohy nebo přepnutí kontextu). Pro aktivaci tohoto mechanismu v souboru
FreeRTOSConfig.hje nutné:
* Nastavit #define configUSE_TRACE_FACILITY 1.
* Pro FreeRTOS V10+ přidat #define INCLUDE_xTaskGetIdleTaskHandle 1.
* Na samém konci souboru FreeRTOSConfig.h připojit SEGGER_SYSVIEW_FreeRTOS.h.
Příklad trace maker:
```c
#define traceTASK_SWITCHED_IN() SEGGER_SYSVIEW_OnTaskStartExec((U32)pxCurrentTCB)
#define traceTASK_SWITCHED_OUT() SEGGER_SYSVIEW_OnTaskStopExec()
#define traceISR_ENTER() SEGGER_SYSVIEW_RecordEnterISR()
// a tak dále
```
- Použití DWT_CYCCNT pro přesný čas: Jádra Cortex-M3/M4 obsahují vestavěný modul DWT (Data Watchpoint and Trace) s 32bitovým čítačem cyklů (CYCCNT). SystemView jej používá jako vysoce přesný časový referenční bod. Ve funkci
SEGGER_SYSVIEW_Conf()je nutné tento čítač aktivovat:
```c
void SEGGER_SYSVIEW_Conf(void) {
// ---- Setup DWT (for Cortex-M3/M4) ----
#define DEMCR ((volatile U32)0xE000EDFCu)
#define DWT_CTRL ((volatile U32)0xE0001000u)
#define DWT_CYCCNT ((volatile U32)0xE0001004u)
#define DEMCR_TRCENA (1u << 24)
#define DWT_CTRL_CYCCNTENA (1u << 0)
DEMCR |= DEMCR_TRCENA; // Enable access to TRCENA
DWT_CYCCNT = 0; // Clear counter
DWT_CTRL |= DWT_CTRL_CYCCNTENA; // Start DWT count
SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ,
&SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);
SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
}
```
Také se ujistěte, že makro SYSVIEW_RAM_BASE odpovídá adrese RAM vašeho mikrokontroléru.
- Zpracování přerušení (ISR): Na rozdíl od přepínání úloh, které SystemView zachytává pomocí maker FreeRTOS, přerušení vyžadují explicitní volání. Do obslužných rutin přerušení je nutné přidat funkce
SEGGER_SYSVIEW_RecordEnterISR()aSEGGER_SYSVIEW_RecordExitISR():
```c
void EINT15_10_IRQHandler()
{
SEGGER_SYSVIEW_RecordEnterISR();
if(EINT->IPEND & EINT_IPEND_11) {
// Váš kód
}
SEGGER_SYSVIEW_RecordExitISR();
}
```
- Pojmenování přerušení: Pro názornost v SystemView je nutné nástroji sdělit názvy přerušení, doplněním funkce
_cbSendSystemDesc()(nachází se vSEGGER_SYSVIEW_Config_FreeRTOS.c):
```c
static void _cbSendSystemDesc(void) {
SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",D="SYSVIEW_DEVICE_NAME",O=FreeRTOS");
SEGGER_SYSVIEW_SendSysDesc("I#15=SysTickIRQ");
SEGGER_SYSVIEW_SendSysDesc("I#46=ModbusIRQ");
//...
}
```
- Funkce pro získání ID přerušení a časové značky: Přidejte do
main(nebo jiného vhodného místa) dvě funkce, nezbytné pro správnou funkci SystemView:
```c
// Funkce pro získání čísla aktuálně aktivního přerušení (ISR)
U32 SEGGER_SYSVIEW_X_GetInterruptId(void) {
// V jádře Cortex-M je číslo přerušení uloženo v dolních 9 bitech registru IPSR.
return (((volatile U32)(0xE000ED04u)) & 0x1FFu);
}
// V Cortex-M3/M4 používáme registr čítače cyklů jádra DWT_CYCCNT
U32 SEGGER_SYSVIEW_X_GetTimestamp(void) {
return ((volatile U32)(0xE0001004u));
}
```
- Finální inicializace: Po inicializaci hardwaru a periferií ve funkci
mainzavolejteSEGGER_SYSVIEW_Conf(), a poté spusťte plánovač úlohvTaskStartScheduler():
```c
InitPhy();
SEGGER_SYSVIEW_Conf(); // Inicializace Segger SystemView
CreateDeviceTasks();
vTaskStartScheduler(); // Spuštění plánovače reálného času
```
Po úspěšném nastavení nástroj SystemView poskytne podrobnou vizualizaci chování systému. Jednou z nejcennějších výhod SystemView je jeho schopnost fungovat i tehdy, když cílový mikrokontrolér není v režimu ladění. To umožňuje provádět monitoring v reálných provozních podmínkách, připojení J-Linku podle potřeby pro diagnostiku, což výrazně zjednodušuje odhalování složitých, na čase závislých chyb.
Integrace a výběr nástrojů: RTT Viewer vs. SystemView
SEGGER RTT Viewer a SystemView jsou komplementární nástroje, z nichž každý řeší své úkoly v procesu vývoje vestavěného softwaru. RTT Viewer je ideální pro výstup textových logů a ladicích informací, nahrazuje tradiční printf a nabízí přitom výrazně vyšší výkon a neintruzivnost. SystemView zase posouvá analýzu na novou úroveň, poskytuje grafické znázornění událostí FreeRTOS, jako jsou přepínání kontextu, provádění úloh a zpracování přerušení, což je kriticky důležité pro optimalizaci výkonu a odhalování problémů s plánováním.
Volba mezi SEGGER_RTT_printf a SEGGER_SYSVIEW_Print (pokud je používán pro výstup textových zpráv v SystemView) závisí na kontextu: SEGGER_RTT_printf je určen pro obecné logy, zatímco funkce SystemView pro události, které mají být integrovány do časové osy analýzy. Je důležité poznamenat, že SystemView používá svůj vlastní interní kanál RTT pro přenos trasovacích dat, který obvykle není určen pro přímou uživatelskou interakci. Ačkoli SystemView může fungovat i bez RTOS, jeho funkčnost bude silně omezena, protože mnoho jeho funkcí je vázáno na hooky operačního systému.
Použití DWT_CYCCNT místo SysTick pro časové značky v SystemView je dáno několika faktory. DWT_CYCCNT je vyhrazený hardwarový čítač cyklů procesoru, který zajišťuje maximální možnou přesnost a nezávisí na nastavení systémového časovače používaného RTOS. To zaručuje, že časové značky v SystemView budou maximálně věrohodné a nebudou zkresleny činností samotného operačního systému.
Existují i další nástroje pro trasování a analýzu RTOS, jako je Tracealyzer od Percepio, které také nabízejí bohatou funkcionalitu pro vizualizaci a analýzu chování vestavěných systémů. SEGGER RTT a SystemView se však vyznačují hlubokou integrací s ekosystémem J-Link a vysokým výkonem, což je činí jedním z preferovaných řešení pro vývojáře pracující s mikrokontroléry Cortex-M.
Co je důležité:
- SEGGER RTT zajišťuje vysokorychlostní, neintruzivní výstup ladicích logů (
printf) prostřednictvím kruhového bufferu v RAM. - SystemView je výkonný nástroj pro vizualizaci a analýzu FreeRTOS v reálném čase, využívající RTT jako transport.
- Pro přesnou časovou osu se SystemView opírá o hardwarový čítač DWT_CYCCNT (Cortex-M3/M4).
- Oba nástroje výrazně zjednodušují diagnostiku složitých problémů, umožňují monitorovat systém bez zastavení CPU.
- SystemView umožňuje analyzovat chování systému i mimo režim ladění, připojení J-Linku podle potřeby.
— Editorial Team
Zatím žádné komentáře.