Nastavení CLI shellu přes J-Link RTT pro ARM Cortex-M
Pro implementaci CLI přes SWD bez UART použijte knihovnu SEGGER_RTT. Stáhněte si zdrojové kódy: SEGGER_RTT.h (API, 253 řádků), SEGGER_RTT.c (implementace, 1751 řádků), SEGGER_RTT_printf.c (printf, 516 řádků), SEGGER_RTT_Conf.h (konfigurace, 333 řádků).
Začněte inicializací nulového kanálu RTT:
void SeggerInit() {
SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
SEGGER_RTT_ConfigDownBuffer(0, "RTTDOWN", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
SEGGER_RTT_SetTerminal(0);
}
bool segger_rtt_init_custom(void) {
bool res = true;
SeggerInit();
return res;
}
Voláním SeggerInit() na začátku firmware nastavíte přenosové a přijímací buffery bez blokování.
Zpracování příchozích příkazů
Pravidelně dotazujte kanál pomocí SEGGER_RTT_Read v hlavní smyčce nebo časovači:
bool segger_rtt_proc_one(uint8_t num) {
bool res = false;
LOG_PARN(SEGGER_RTT, "RTT%u,Proc", num);
SeggerRttHandle_t* Node = SeggerRttGetNode(num);
if(Node) {
if(Node->RxBuffer) {
if(Node->buffer_size) {
unsigned rx_byte = SEGGER_RTT_Read(Node->BufferIndex,
Node->RxBuffer,
Node->buffer_size);
if(rx_byte) {
res = segger_rtt_writer(num);
LOG_DEBUG(SEGGER_RTT,"RxData:[%s]=[%s],rxByteCnt:%u Bytes",
ArrayToStr(Node->RxBuffer,rx_byte),
ArrayToAsciiStr(Node->RxBuffer,rx_byte),
rx_byte);
res = cli_process_data(Node->cli_num,
Node->RxBuffer,
rx_byte);
memset(Node->RxBuffer, 0, rx_byte);
}
}
}
}
return res;
}
Funkce vrací počet přijatých bajtů. Předávejte data do zpracovatele CLI: cli_process_data().
Odesílání odpovědí z firmware
Pro přenos řetězců použijte SEGGER_RTT_Write. Implementujte funkce pro putc/puts a FIFO-buffer:
void segger_rtt1_puts(void* stream_ptr, const char* str, int32_t len) {
SeggerRttHandle_t* Node = SeggerRttGetNode(1);
if(Node) {
if(str) {
if(len) {
unsigned tx_cnt = SEGGER_RTT_Write(Node->BufferIndex,
(void* ) str,
(unsigned) len);
(void)tx_cnt;
}
}
}
}
void segger_rtt1_putc(void* stream_ptr, char ch) {
SeggerRttHandle_t* Node = SeggerRttGetNode(1);
if(Node) {
unsigned tx_cnt = SEGGER_RTT_Write(Node->BufferIndex,
(void* ) &ch,
(unsigned) 1);
(void)tx_cnt;
}
}
Extrahujte data z Tx FIFO a zapisujte do RTT-kanálu. Tím zajistíte asynchronní odesílání bez ztráty dat.
- Výhody FIFO: Bufferování zabraňuje přetečení při špičkovém zatížení.
- Monitorování: Logujte
tx_cntpro ladění přeskočení. - Škálování: Podpora více kanálů (num > 0).
Nastavení J-Link RTT Viewer na PC
Nainstalujte balíček SEGGER J-Link. Spusťte JLinkRTTViewer.exe z C:\Program Files\SEGGER\JLink_V834.
Nastavte připojení:
- Vyberte SWD nebo JTAG.
- Zadejte cílové zařízení (ARM Cortex-M).
- Nastavte rychlost (až megahertzy).
- Potvrďte připojení.
Zadávejte příkazy v Terminal 0 — podpora barevného zvýraznění. Při přetečení FIFO upravte SEGGER_RTT_Conf.h pro zvětšení bufferů.
Alternativní přístup přes TCP
RTT Viewer otevírá socket na 127.0.0.1:19021 (zkontrolujte netstat -ano | grep 19021).
Připojte se PuTTY nebo Tera Term:
- Host: 19021
- Typ: TCP
Tím emulujete UART-terminál. Funguje vzdáleně v WiFi-síti.
Výhody a omezení RTT CLI
Výhody:
- Paralelní práce s krokovým laděním.
- Nevyžaduje ELF-soubor: nahrajte firmware a předejte J-Link.
- Okamžitý přenos na rychlostech SWD.
- Copy-paste logů s zvýrazněním.
- Více terminálů.
Nevýhody:
- Závislost na J-Link (ne pro AVR/ESP32/RISC-V).
- Přerušení při resetu MCU — ruční opětovné připojení.
- Samostatné okno pro vstup (řeší TCP).
- Žádná podpora \r v Viewer (je v Tera Term).
| Aspekt | RTT přes SWD | UART |
|--------|-------------|------|
| Rychlost | MHz SWD | 115200+ |
| Piny | 3-4 | 2+ |
| Ladění | Paralelně | Ne |
| Reset | Přerušení | Stabilní |
Co je důležité
- Inicializujte RTT před main() pro časný log.
- Používejte NO_BLOCK_SKIP pro vyhnutí se zablokování.
- Monitorujte přetečení FIFO přes logy tx/rx_cnt.
- TCP 19021 řeší problémy UI Viewer.
- Vhodné pro Cortex-M s podporou J-Link.
— Editorial Team
Zatím žádné komentáře.