忍者ブログ

NOROMA CLUB -日記-

2021年08月15日 RaspberryPi PicoでOpenOCD

6月に買ってみたRaspberryPi Picoのその後です。
一緒に買っておいたインターフェース8月号を見ながら
普通にプログラミングして動かすところはできました。
まあ、全然使いこなせてはいませんが・・・(笑)

てっきりPythonでゆるーく動かすのかと思っていたのですが、
ガッツリC言語(+さらに理解困難なPIO命令のアセンブラ)だったのは、ちょっと想定外。

あとはGDBとOpenOCDもちょっと使ってみたくて、先日日本橋に行ったときもう1台買い足してみました。

なんか配線がごちゃごちゃしていますが、
手前(USBが繋がっている方)がデバッガ化したRaspberryPi Picoで、
奥が実際にプログラムを動かす方のRaspberryPi Picoです。
デバッガ側のGPIO端子と、メイン側のSWD端子を接続しています。

Windows10 + WSL2(Windows Subsystem for Linux 2)環境で試しましたが、
インターフェースの記事通りにやっても全然動かず、いろいろハマりました・・・。
とりあえず動作確認までできたので、いくつかハマったポイントを列挙です。
(ここに偶然辿り着いて、同じことにハマっている方がいれば参考用)


○OpenOCDの起動に失敗
WSL2のターミナルでOpenOCD(openocd.exe)を実行しても、
数秒後にプログラムが勝手に終了してプロンプトに戻ってしまいました。
この状態でGDBから接続しても、接続エラーで失敗します。
プロンプトに戻っても、バックグラウンドで動いているのかと思ったのですが、
どうやらプロンプトに戻らず動き続けるのが正しい挙動だったようです。

openocd.exe という名前が示すとおり、これはLinux用のプログラムではなく、
Windows用のプログラムということのようです。
試しにWindowsのコマンドプロンプト(DOS窓)から、openocd.exeを実行すると、無事回避できました。

ただ、これはセキュリティソフト(Avast Antivirus 無料版を使っています)が
誤検出して余計なことをしている気もしてきました・・・。
別件でAvastの設定をいろいろ触っていたら、いつの間にかopenocd.exeも起動するようになりました・・・。
(どこの設定を変えたのか、いまいち把握できていないのですが)


○TeratermとWSL2の相性問題
WSL2純正のターミナルが使いにくいので、TeratermからWSL2環境に接続して作業していたのですが、
Windowsコマンドを呼び出す場合はWSL2純正ターミナルでないとダメな場合があるようです。
これはOpenOCDとか関係なく、単純にWSL2のPATH設定の違いだけのようですが。

TeratermだとWindows側のPATH設定は引き継いでくれないので、
"explorer.exe" とか、 "code"(=VS Code) とか、パス指定なしだとコマンドが見つからず、
しかたないので、この時だけWSL2純正のターミナルで回避しました。


○VS CodeのGUIデバッグが動かず
VS Codeを起動して、F5キーで実行してみても、謎のコンパイルエラーが出て動きませんでした。
どうやら、.vscode/ の下にjsonファイルを3つ準備しないといけないようです。
各ファイルの中身は、下記の内容を貼り付けると動くようになりました。
(中身は理解していませんが、ネットで探してきた情報です)
ちなみに、VS Codeを実行すると同じ名前のファイルが勝手に生成されているかもしれませんが、
生成されたものでは動かなかったので、全部コピーしなおす方がよさそうです。

.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Pico Debug",
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "external",
            "cwd": "${workspaceRoot}",
            "runToMain": true,
            "executable": "${command:cmake.launchTargetPath}",
            "device": "RP2040",
            "gdbPath": "gdb-multiarch",
            "gdbTarget": "${env:PICO_OPENOCD_ADDRESS}:3333",
            "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
            "runToEntryPoint": "main",
        }
    ]
}

.vscode/settings.json
{
    // These settings tweaks to the cmake plugin will ensure
    // that you debug using cortex-debug instead of trying to launch
    // a Pico binary on the host
    "cmake.statusbar.advanced": {
        "debug": {
            "visibility": "hidden"
        },
        "launch": {
            "visibility": "hidden"
        },
        "build": {
            "visibility": "hidden"
        },
        "buildTarget": {
            "visibility": "hidden"
        }
    },
    "cmake.buildBeforeRun": true,
    "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
}


.vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make",
            "type": "shell",
            "command": "make -j8",
            "options": {
                "cwd": "${workspaceFolder}/build/${relativeFileDirname}"
            },
            "presentation": {
                "revealProblems": "onProblem"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        },
        {
            "label": "make (verbose)",
            "type": "shell",
            "command": "make VERBOSE=1",
            "options": {
                "cwd": "${workspaceFolder}/build/${relativeFileDirname}"
            },
            "presentation": {
                "revealProblems": "onProblem"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "make clean",
            "options": {
                "cwd": "${workspaceFolder}/build/${relativeFileDirname}"
            },
            "problemMatcher": [],
            "group": "build"
        },
        {
            "label": "install",
            "type": "shell",
            "command": "pico-install",
            "args": [
                "*.uf2"
            ],
            "options": {
                "cwd": "${workspaceFolder}/build/${relativeFileDirname}"
            },
            "problemMatcher": [],
            "group": "build"
        },
        {
            "label": "distclean",
            "type": "shell",
            "command": "rm -rf ${workspaceFolder}/build",
            "problemMatcher": [],
            "group": "build"
        },
        {
            "label": "cmake",
            "type": "shell",
            "command": "mkdir build; (cd build; cmake .. -DCMAKE_BUILD_TYPE=${input:buildType} -DPICO_DEFAULT_BINARY_TYPE=${input:binaryType})",
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [],
            "group": "build"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: arm-none-eabi-gcc アクティブなファイルのビルド",
            "command": "/usr/bin/arm-none-eabi-gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "inputs": [
        {
            "type": "pickString",
            "id": "buildType",
            "description": "Build Type",
            "options": [
                "Release",
                "Debug"
            ],
            "default": "Debug"
        },
        {
            "type": "pickString",
            "id": "binaryType",
            "description": "Binary Type",
            "options": [
                "default",
                "no_flash",
                "copy_to_ram",
                "blocked_ram"
            ],
            "default": "default"
        }
    ]
}

拍手[1回]

PR