ラズベリーピコ:1つのデバイスでシンプルなデバッグ


ラズベリーピコは2021年2月に発売された新しいマイクロコントローラである.コミュニティはこの新しいボードについて興奮しました、そして、何人かの人々は驚くべきプロジェクトを始めました.私は初期の2つのボードをつかんで、まだ私のArduinoベースのロボットに取り組んでいる間、通常の点滅LEDとポテンショメータのチュートリアルを行いました.簡単にするために、私はマイクロPython SDKを使いました.それは数分でセットアップです、単純なスケッチは簡単です、そして、あなたはPicoに接続して、プログラムを実行することができます.
あなたがC SDKを使用するならば、あなたは多くをする必要があります:構築ツール、cmake、SDKをダウンロードして、SDKパスを定義してください、そして、あなたのプロジェクトのためにCMakeファイルを加えて、すべての必要な図書館その他を加えてください、そして、あなたが到着する快適さレベルはOKです-あなたは、まだUFO 2ファイルをピコにアップロードする必要があります.
より良い、より簡単ですか?はい!偉大さのおかげでwizio-pico プロジェクト、VSコードの統合は、あなたのピコに直接アップロードを含む達成することができます.そして、あなたが考えるときpico-debug project , また、プログラムの完全デバッグ機能を統合できます.
このブログポットは、ピコセットアップシリーズを続けて、どのようにセットアップを完全に動作するデバッガVS Studioコードで詳細になります.最終的にステップが説明に基づいていることを心に留めておいてくださいpico-debug project , and wizio-pico , しかし、セットアップは複雑ですので、ブログ記事の要約を書きました.に沿って従ってください、あなたは簡単な起動ボタンを押すだけでピコCプログラムをデバッグされます.
この記事はもとでmy blog .

ツール概要


完全に統合されたデバッグソリューションに到達する前に、重いリフティングを行うツールを理解することが重要です.
The JTAG standard 集積回路をデバッグする方法について説明します.標準は、回路上のレジスタおよびバスシステムがどのようにアクセスされることができるかについて通信プロトコルを定義する.そして、回路にアクセスするために、電気インターフェース(例えばシリアルポート)も記載する.専用ポートを使用する代わりに、SWD ( Serial Wire Debug )プロトコルはデバッグ用のARMチップとのインタフェースにちょうど2つのピンを使用することができます.この規格は道具で使われるOpenOCD , これはオンチップデバッガの頭字語です.これは、統合された回路にデバッグセッションを確立するJTAG標準を使用します.最後にGNU Project Debugger GDB アプリケーションをデバッグするためのオープンソースのワークホースです.GDBはデバッグを開始するためにOpenocdセッションに接続できます.GDB自体は最終的にCLIアプリケーションです.プログラムをロードするために専用の言語を提供し、ブレークポイントと変数を設定します.現代のIDEは、GDBとのインターフェイスと強力な、視覚的なデバッグ体験を提供します.
これらのツールを使用するには、ARMコード、GDB、OpenOCDを生成するコンパイラを設定する必要があります.始めましょう!

コンパイラとGDB


ARMコードを生成できるクロスコンパイラをインストールする必要がありますgcc-arm-none-eabi . 次のコマンドを実行し、このコンパイラとその他の必要なツールをインストールします.
$> sudo apt update
$> sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential
これらのツールが正しくインストールされていることをテストします.
$> arm-none-eabi-gcc -v

Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-none-eabi/9.2.1/lto-wrapper
Target: arm-none-eabi
gdbをインストールするには、次の手順に従います
apt install gdb-multiarch
また、正しくインストールされていることをテストします.
$> db-multiarch -v

GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Openocd


フォローpico-debug project 説明、我々はラズベリーピコをサポートするOCDの特別なバージョンをインストールします.
まずは普通のLinuxパッケージをインストールします.
$> sudo apt install automake autoconf texinfo libtool libhidapi-dev libusb-1.0-0-dev
...それから、我々はカスタムOCDバージョンをコンパイルして、作るために、Git倉庫をクローン化します.
$> git clone https://github.com/majbthrd/openocd.git --recursive --branch rp2040_cmsisdap_demo --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-cmsis-dap
$ make -j4
$ sudo make install
もう一度、インストールが成功したことをテストします.
$> openocd -h

Open On-Chip Debugger 0.10.0+dev-gb4af1af-dirty (2021-03-21-10:40)
Licensed under GNU GPL v2

ピコの準備


ツールチェーンをインストールしてテストすると、ピコ自体を準備し続けることができます.再び、2つのタスクを行う必要があります.
  • PIOは、それがデバッグ装置として使うことができるように、特別なUF 2イメージでブートされる必要があります
  • ターゲットプログラムは、特別なデバッグコンパイラフラグでコンパイルする必要があります
  • デバッグUF 2イメージをインストールします


    まず、最新のUF 2イメージをhttps://github.com/majbthrd/pico-debug/releases , それから、ファイルをあなたの大容量記憶装置モードにピコマウントしてください.それはCMSIS - DAPデバイスとしてあなたのラズベリーピコを起動します.この頭字語は、Oracle MicroController Software Interface Standardのための略です-デバッグ・アクセス・ポート、それはプロトコル仕様と具体的なファームウェアです.技術的には、Picosのシリアル・ワイヤ・デバッグ・インタフェースをラップし、USB経由でデバッグ・アクセス・ポート(DAP)をエミュレートする.この標準化されたインターフェースはデバッガを実行している接続されたホストコンピュータによって使用されることができます.
    画像が正しく処理されているかどうかを確認します.実行時dmesg , 次の出力が表示されます.
    [50852.541543] usb 1-2: new full-speed USB device number 70 using xhci_hcd
    [50852.690691] usb 1-2: New USB device found, idVendor=1209, idProduct=2488, bcdDevice=10.02
    [50852.690696] usb 1-2: New USB device strings: Mfr=0, Product=1, SerialNumber=0
    [50852.690698] usb 1-2: Product: CMSIS-DAP
    
    ピコが出来上がる.さて、デバッグ用にプログラムをコンパイルします.

    ターゲットプログラムのコンパイル


    私が記事を書き始めたとき、私はあなたがプラットフォームの小さなスイッチを作る必要があることを望みました.INIファイル、コンパイルし、デバッグ可能なバージョンのプログラムを持っています.しかし、これはまだそうではありません.デバッグ用の1つのピコを使用する場合は、プログラムをコンパイルするための特別なSDKを使用する必要があります.このSDKは、デバッグに干渉していないUSBシステムの初期化に関するいくつかの問題を修正します.あなたの詳細を読むことができますgithub thread .
    より良い解決が可能になるまで、特別なcmakeのコンパイルファイルを追加する必要があります.
    最終的なディレクトリレイアウトを取得します.
    .
    ├── debug
    │   ├── build
    │   ├── CMakeLists.txt
    │   ├── pico-debug.uf2
    │   ├── pico_sdk_import.cmake
    │   └── src -> /home/work/development/pico2/src/
    ├── include
    │   ├── pico
    │   │   └── config_autogen.h
    │   └── README
    ├── lib
    │   └── README
    ├── LICENSE.txt
    ├── platformio.ini
    ├── README.md
    ├── src
    │   ├── CMakeLists.txt
    │   └── main.c
    └── test
        └── README
    
    
    具体的な手順は
  • ディレクトリを作るbuild and debug
  • インdebug , 特殊なUF 2ファイルをコピーし、src ディレクトリ
  • インdebug , これを置くCMakeLists.txt ファイルを入れる.
  • cmake_minimum_required(VERSION 3.12)
    
    # Pull in SDK (must be before project)
    include(pico_sdk_import.cmake)
    
    project(pico_examples C CXX ASM)
    set(CMAKE_C_STANDARD 11)
    set(CMAKE_CXX_STANDARD 17)
    
    set(PICO_EXAMPLES_PATH ${pwd})
    
    # Initialize the SDK
    pico_sdk_init()
    
    add_subdirectory(src)
    
  • インsrc/ フォルダを追加CMakeLists.txt ファイル.
  • add_executable(main
            main.c
            )
    
    # Pull in our pico_stdlib which pulls in commonly used features
    target_link_libraries(main pico_stdlib)
    
    # create map/bin/hex file etc.
    pico_add_extra_outputs(main)
    
    これでプログラムをコンパイルできます.
  • 環境変数を設定するPICO_SDK_PATH 特殊SDKを示す
  • export PICO_SDK_PATH=/home/work/development/pico-debug-sdk/
    
  • に移動debug/build 次のコマンドを実行します.
  • cmake -DCMAKE_BUILD_TYPE=Debug -g0 ..
    
    コンパイルプロセスは次のように出力を開始し、表示します.
    Using PICO_SDK_PATH from environment ('/home/work/development/pico-debug-sdk/')
    PICO_SDK_PATH is /home/work/development/pico-debug-sdk
    Defaulting PICO_PLATFORM to rp2040 since not specified.
    Defaulting PICO platform compiler to pico_arm_gcc since not specified.
    PICO compiler is pico_arm_gcc
    PICO_GCC_TRIPLE defaulted to arm-none-eabi
    -- The C compiler identification is GNU 9.2.1
    -- The CXX compiler identification is GNU 9.2.1
    -- The ASM compiler identification is GNU
    -- Found assembler: /usr/bin/arm-none-eabi-gcc
    Using regular optimized debug build (set PICO_DEOPTIMIZED_DEBUG=1 to de-optimize)
    Defaulting PICO target board to pico since not specified.
    Using board configuration from /home/work/development/pico-debug-sdk/src/boards/include/boards/pico.h
    -- Found Python3: /usr/bin/python3.8 (found version "3.8.5") found components: Interpreter
    TinyUSB available at /home/work/development/pico-debug-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; adding USB support.
    Compiling TinyUSB with CFG_TUSB_DEBUG=1
    -- Found Doxygen: /usr/bin/doxygen (found version "1.8.17") found components: doxygen dot
    ELF2UF2 will need to be built
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/work/development/pico2/debug/build
    
  • build フォルダが表示されますsrc - このディレクトリに変更して実行するmake
  • cd src/
    make
    
    この出力を見るべきです.
    Scanning dependencies of target ELF2UF2Build
    [  1%] Creating directories for 'ELF2UF2Build'
    [  3%] No download step for 'ELF2UF2Build'
    [  5%] No patch step for 'ELF2UF2Build'
    [  6%] No update step for 'ELF2UF2Build'
    [  8%] Performing configure step for 'ELF2UF2Build'
    -- The C compiler identification is GNU 9.3.0
    -- The CXX compiler identification is GNU 9.3.0
    ...
    -- Build files have been written to: /home/work/development/pico2/debug/build/elf2uf2
    [ 10%] Performing build step for 'ELF2UF2Build'
    Scanning dependencies of target elf2uf2
    [ 50%] Building CXX object CMakeFiles/elf2uf2.dir/main.cpp.o
    [100%] Linking CXX executable elf2uf2
    [100%] Built target elf2uf2
    [ 11%] No install step for 'ELF2UF2Build'
    [ 13%] Completed 'ELF2UF2Build'
    [ 13%] Built target ELF2UF2Build
    Scanning dependencies of target bs2_default
    [ 15%] Building ASM object pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/boot2_w25q080.S.obj
    [ 16%] Linking ASM executable bs2_default.elf
    ...
    [100%] Linking CXX executable main.elf
    [100%] Built target main
    
    完了!これで、1つだけ接続ピコで実行できるプログラムのデバッグ可能なバージョンがあります.

    CLIのデバッグ


    ツールチェーンをインストールしました.ピコを用意しました.さて、デバッグプロセスを開始できます.この節では、CLIツールを直接使用します.次の節では、これらのツールをVisual Studioコードに統合します.

    openocd :通常ユーザとしての実行


    OpenOCDを通常のユーザーとして実行するには、Openocd起動ファイルを作成し、通常のユーザを特別なグループに追加する必要があります.これらのステップのリファレンスはこれですstackexchange post .
    ファイルを作る/etc/udev/rules.d/98-openocd.rules このコンテンツを追加します.
    ACTION!="add|change", GOTO="openocd_rules_end"
    SUBSYSTEM!="usb|tty|hidraw", GOTO="openocd_rules_end"
    ATTRS{product}=="*CMSIS-DAP*", MODE="664" GROUP="plugdev"
    LABEL="openocd_rules_end"
    
    次に、新しいLinuxグループを作成し、そのグループに個人ユーザーを追加します.
    $> sudo groupadd plugedev
    $> sudo gpasswd -a devcon plugdev
    $> sudo udevadm control --reload
    
    前と同様に、テストします.ユーザが新しく作成したグループのメンバーであることを確認します
    $> groups
    devcon adm dialout cdrom sudo dip plugdev lpadmin lxd sambashare
    

    openocdを起動する


    今すぐ手動でOpenocdサーバーを起動します.同じディレクトリで、このコマンドを実行します.
    $> cd openocd/tcl
    $> openocd -f interface/cmsis-dap.cfg -f target/rp2040-core0.cfg -c "transport select swd" -c "adapter speed 4000"
    
    あなたがこのコマンドが意味することについて私と同じくらい好奇心があるならば
  • 二つ-f フラグは設定ファイルのロードを示します.ここでは、デバッグアクセスポート( DAP )の設定とPIOボードの設定をロードします( RP 2040 )
  • 二つ-c フラグは実行される追加のコマンドを示します、私たちはシリアル・ワイヤ・デバッグを通して接続して、ホストとピコの間でkHzで接続速度をセットします.
  • この出力を見るべきです.
    Open On-Chip Debugger 0.10.0+dev-gb4af1af-dirty (2021-03-21-10:40)
    Licensed under GNU GPL v2
    For bug reports, read
     http://openocd.org/doc/doxygen/bugs.html
    swd
    adapter speed: 4000 kHz
    
    Info : Hardware thread awareness created
    Info : RP2040 Flash Bank Command
    Info : Listening on port 6666 for tcl connections
    Info : Listening on port 4444 for telnet connections
    Info : CMSIS-DAP: SWD  Supported
    Info : CMSIS-DAP: FW Version = 2.0.0
    Info : CMSIS-DAP: Interface Initialized (SWD)
    Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
    Info : CMSIS-DAP: Interface ready
    Info : clock speed 4000 kHz
    Info : SWD DPIDR 0x0bc12477
    Info : SWD DLPIDR 0x00000001
    Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints
    Info : starting gdb server for rp2040.core0 on 3333
    Info : Listening on port 3333 for gdb connections
    
    番目のターミナルウィンドウを開き、Picoプロジェクトをコンパイルしたディレクトリに移動します.GDBセッションを開始します.
    $> cd debug/build/src
    $> gdb-multiarch main.elf
    
    この出力を見るべきです.
    gdb-multiarch main.elf
    GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
    Copyright (C) 2020 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from src/main.elf...
    
    GDBセッションを開くと、デバッグを実行するコマンドを実行できます.GDBは精巧な言語を持っています、我々は単純なコンソールベースのデバッグセッションをドライブする主なコマンドに集中します.
    (gdb) target remote localhost:3333
    Remote debugging using localhost:3333
    main () at /home/work/development/pico2/debug/src/main.c:37
    37 int main() {
    (gdb) load
    Loading section .boot2, size 0x100 lma 0x10000000
    Loading section .text, size 0x4b10 lma 0x10000100
    Loading section .rodata, size 0xd84 lma 0x10004c10
    Loading section .binary_info, size 0x20 lma 0x10005994
    Loading section .data, size 0xa04 lma 0x100059b4
    Start address 0x100001e8, load size 25528
    Transfer rate: 8 KB/sec, 4254 bytes/write.
    (gdb) monitor reset init
    target halted due to debug-request, current mode: Thread
    xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
    (gdb) b main
    Breakpoint 1 at 0x100003d8: file /home/work/development/pico2/debug/src/main.c, line 37.
    (gdb) c
    Continuing.
    Note: automatically using hardware breakpoints for read-only addresses.
    
    Breakpoint 1, main () at /home/work/development/pico2/debug/src/main.c:37
    37 int main() {
    (gdb) n
    38     setup();
    (gdb) n
    40     printf("Hello World\n");
    (gdb) n
    43         printf(".");
    (gdb) n
    44         blink();
    (gdb) n
    42     while (true) {
    (gdb) p LED_GREEN
    $1 = 15
    (gdb)
    
    あなたがこれまで来たならば、それはあなたのIDEでデバッグをセットアップするためにより少しのステップだけです.
    vscode拡張モジュールのインストール
    C/C++ Extension Pack (by Microsoft)
    Cortex-Debug (by marus25)
    CMake Tools (by Microsoft)
    
    ファイルを作る.vscode/launch.json , このコンテンツを入力します.
    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Pico Debug",
          "device": "RP2040",
          "gdbPath": "gdb-multiarch",
          "cwd": "${workspaceRoot}",
          "executable": "${workspaceRoot}/debug/build/src/main.elf",
          "request": "launch",
          "type": "cortex-debug",
          "servertype": "openocd",
          "configFiles": ["interface/cmsis-dap.cfg", "target/rp2040-core0.cfg"],
          "openOCDLaunchCommands": ["transport select swd", "adapter speed 4000"],
          "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
          "searchDir": ["/home/work/development/openocd/tcl"],
          "runToMain": true,
          "postRestartCommands": ["break main", "continue"]
        }
      ]
    }
    
    変更すべき重要なことは、
  • executable : デバッグ可能なコンパイル済みファイルを指す必要があります
  • svdFile : SVDはマイクロコントローラの詳細を含んでいるファイル形式です.このファイルはOpenocdによってレジスタなどのハードウェア関連のデバッグ情報を提供するために使用されます.
  • serachDir : これをOpenocdインストールTcl PATHに設定します
  • そして、現在最終的な瞬間が来ます.VSコードでRun/Start Debugging , 数秒後、次のウィンドウが表示されます.

    IDEのすべての快適さで、デバッグすることができます.

    結論


    このブログのポストは、いくつかの側面で長くなりました:それを書く時、すべてのオプションをテストする時間、そしてこの記事の長さ.すべてのセットアップを行うと、統合されたIDEであなたのピコプログラムを書くことができます、コードの強調表示のすべての快適さ、ライブラリ機能をブラウズ、およびリファクタリングオプションがあります.また、ワンクリックでアップロード機能を使用すると、ほぼArduinoと同じようにプログラムすることができます.そして、その上に、プログラムのデバッグバージョンをコンパイルし、Visual Studioコードの中からデバッガを実行できます.これはあなたの開発効果を大いに高めるべきです.
    あなたが将来のプロジェクトから始めるのを援助するために、私をチェックしてくださいpico-project-setup repo on Github .