マイコン用デバッグプローブであるJ-Linkが超便利なので紹介します。 J-Linkを購入しなくても、STLink・LPCLinkをJ-Link化する方法も紹介します。

J-Linkとは

J-Linkとは、SEGGERの開発しているマイコン用デバッガです。
SEGGER: Debug Probes J-Link

※画像はSEGGERのWebページより

対応しているCPUは非常に多く、

  • ARM Cortex A,M,R
  • ARM 7,9,11
  • Microchip PIC32
  • Renesas RX

で使えるみたいです。
(自分はARMのCortexMシリーズにしか使ったことがありません)

J-Link Overview of Supported CPUs and Devices

例えば趣味でARMのCortex-Mシリーズを開発する場合、ST-LinkやらLPC-Linkといったデバッガを使うかと思います。 簡単に言うとJ-Linkもそれらのデバッガの仲間です。ただ、J-LinkにはJ-Link特有の便利機能があるので、この記事ではそれを紹介できればと思います。

J-Linkにできること

GDBとつないでデバッグできる

J-Linkのソフトウェア群にJ-Link GDB Serverというソフトがあります。 これを使うことでGDB用サーバーが立ち上がるので、GDBから接続してやればGDBからマイコンをデバッグすることができます。

SEGGER: J-Link GDB Server

これはST-Link + OpenOCDなどの組み合わせでも当然できることなのですが、J-Linkは動作速度が圧倒的に速いです。(ちゃんと計測していない主観ですが)

実行バイナリをマイコンに転送するスピード、break pointに差し掛かってデバッガに実行している部分が表示されるまで、長い配列の中身を覗いたとき、どの動作においてもST-Link + OpenOCDなどとは比べ物にならないくらいキビキビと動きます。

おなじみのGNU MCU Eclipse (旧 GNU ARM Eclipse Plugin)でもJ-Linkはサポートされているので、 簡単にJ-LinkからARMマイコンをデバッグすることができます。

また以前ブログで紹介していたのですが、FreeRTOSなどのRTOSのデバッグ用プラグインが用意されており、複数のタスクをデバッガから追うことができます。(タスク用のスタックの内容を解釈してくれる)

Eclipse+GDB+openocdでFreeRTOSの複数のタスクを追う

使い方

この記事の最後で紹介しています。

シリアルポートになる

J-LinkをPCに挿すと仮想シリアルポートとして認識され、J-Linkから出ているUARTのピンからシリアル通信をすることができます。

使い方

何も設定しなくてもJ-LinkをPCにつなぐだけで仮想シリアルポートとして認識されるはずです。 後はいつものUSB-UART変換モジュールの時と同じようにしてシリアル通信が使えます。

個人的にはこれが一番好きな機能です。 マイコンとJ-LinkをSWD/JTAGの線をつないでおくだけで、シリアル通信のようにPCとデータのやり取りが自由にできます。 しかも通信速度がシリアル通信よりも速いです。 デバッグ用にわざわざUARTの線を取り出す必要がないので、小さいものを作るときにも重宝します。

※画像はSEGGERのWebページより

通信速度については以下のページによると、J-Linkの普通モデルでも500kbpsくらい出るらしいです。

SEGGER: RTT Performance

PC側には

  • J-Link RTT Viewer
  • J-Link RTT Client
  • J-Link RTT Logger

といったソフトウェアが用意されています。 単純にソフトのターミナル上で文字をやり取りするだけではなく、 telnetサーバーを立てたり、ファイルにログを出力したりすることができます。

使い方

この記事の最後で紹介しています。

SEGGER SystemView というものが使えるらしい

これはまだ使ったことのない機能なのですが、RTOSのプロファイラをJ-Link経由で使えるみたいです。

SEGGER: SystemView

RTOSにおいていつどのタスクが実行されていたか、イベントがいつ起こったかなどがグラフィカルに確認できるみたいです。 そのうち使ってみます。

J-Linkを入手する

通販で買う

J-LinkにはいろいろなEditionがあり、値段もだいぶ違います。
標準なものではJ-Link Baseが一番安いのですが、4万円くらいします。

SEGGER: Price list—J-Link related

非商用であればJ-Link EDUというものがあり、7000円くらいで買えます。 EDUとついていますがアカデミック用途に限定されたり、学生でないと買えないというわけではなさそうです。 非商用ライセンスなだけで、中身はJ-Link Bseと同じです。 最近出たらしいJ-Link EDU Miniも安くて小さいのでいいかもしれません。

私はこのJ-Link EDUとJ-Link Liteを持っています。

J-Link EDUはMouserで買いました。

Mouser: J-Link EDU

J-Link Liteは以下のNordicのBLEマイコンを使ったボードを買ったときについてきました。

ST-Link・LPC-Link2・OpenSDAといったデバッガをJ-Link OB化する方法が公式であります。 以下のページの下の方からそのためのツールを入手することができます。

SEGGER: J-Link / J-Trace Downloads

ただし、J-Link OB化できるのはSTやLPCが出している公式評価ボードに乗っているST-LinkやLPC-Linkだけみたいです。 ちなみに手持ちのSTのボード達は全てJ-Link-OB化することができました。

ダウンロードしたST用のツールでは、J-Link OBのfirmを書き込んだり、ST-LinkのFirmに戻したりすることができました。

使い方

GDB Server

以下のページの「J-Link Software and Documentation Pack」を 各OSに合わせてダウンロード&インストールしてください。 ドライバを含む、J-Linkのソフトウェア群がインストールされます。

SEGGER: J-Link / J-Trace Downloads

GDBからデバッグするときには「J-Link GDB Server」というソフトを使います。

WindowsだとGUI版があり、以下の画面で設定をしてOKを押すとGDB Serverが立ち上がります。

あとはGDBからリモートターゲットとしてport:2331に接続すればGDBからマイコンをいじることができます。

J-Link GDB Serverにはもちろんターミナル上で動作するものもあります。 Windowsでは「J-LinkGDBServerCL」、mac linuxでは「J-LinkGDBServer」というコマンドを実行するとターミナル上でJ-LinkのGDB Serverが立ち上がります。 このコマンドだけでは不十分で、オプションとしてデバイスや通信速度の指定をしないといけないので注意してください。

GNU MCU Eclipse (Plugin)と合わせて使う場合の設定はGNU MCU Eclipseのページにあるので、 そちらを参考にしてください。

GNU MCU Eclipse: The J-Link debugging Eclipse plug-in

前述の「J-Link Software and Documentation Pack」をインストールしておいてください。

マイコン側の設定

J-Link RTTを使うときにはマイコン側も設定が必要になります。
「J-Link Software and Documentation Pack」をインストールしたディレクトリ内に 「Samples\RTT」というディレクトリがあり(WindowsではC:\Program Files (x86)\SEGGER\J-Link_V612e\Samples\RTT)、 その中に「SEGGER_RTT_V***.zip」というファイルがあるので、それを解凍してください。

解凍するとRTTというディレクトリが出てくるので、その中身をマイコンのプロジェクトに入れてください。

マイコンからJ-Link RTTを通して文字を送信するには、以下のように最初に初期化関数を一回呼び、 あとは送信関数を呼ぶだけです。

#include "SEGGER_RTT.h"
#include <string.h>

int main()
{
    SEGGER_RTT_Init();

    char msg[] = "Hello world\n";
    SEGGER_RTT_Write(0, msg, strlen(msg));

    SEGGER_RTT_printf(0, "Hello world\n");

    while(1);
    return 0;
}

SEGGER_RTT_V***.zip内のSyscallsディレクトリには、 各種Toolchain用のwrite(systemcall)の定義ファイルも入っています。 これを使うと標準出力をJ-Link RTTにリダイレクトできるので、printfを呼ぶとJ-Link RTTを通してPCに文字を出したりできます。

すでに自前でwriteを実装している場合は、そこにSEGGER_RTT_Writeを書いてやってもprintfでJ-Link RTTに出力することができます。

PC側の設定

J-Link RTT のソフトを起動し、接続するマイコンや通信速度を設定すれば通信可能になります。

Windowsでは、 J-Link GDB Serverを起動するとWindowsのタスクバーにJ-Linkのアイコンが表示され、 そこをクリックして出てくる画面にもRTTのターミナルがあります。 それを使えばJ-Link RTTのソフトを起動しなくてもJ-Link RTTで通信ができます。

おわりに

J-Linkはおススメのデバッガなので皆さん使ってみてください。