Zpět na domů

RTT CLI pro Cortex-M přes J-Link SWD

Článek popisuje integraci CLI shell přes J-Link RTT na ARM Cortex-M. Uvádí se kód inicializace, zpracování příkazů a odesílání odpovědí. Jsou zvážena nastavení Viewer, TCP přístup a porovnání s UART.

CLI přes RTT: SWD shell pro ARM bez UART
Advertisement 728x90

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í.

Google AdInline article slot

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:

Google AdInline article slot
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_cnt pro 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í:

Google AdInline article slot
  • 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

Advertisement 728x90

Číst dál