Raspberry Pi Pico의 WSL + OpenOCD 디버깅에 VSCode 사용

  • Raspberry Pi Pico를 WSL (Windows Subsystem for Linux)에서 사용
  • Raspberry Pi Pico를 WSL + OpenOCD로 JTAG (SWD) 디버깅

  • 계속됩니다. Raspberry Pi Pico(이하 Pico)를 WSL 명령행에서 gdb를 사용하여 디버깅할 수 있게 되었으므로, 이번에는 이것을 Visual Studio Code에서 사용할 수 있도록 합니다.

    실은 현시점에서는 아직 불완전한 점이 있어, 사전에 브레이크 포인트를 두고 거기에 멈출 수는 있는 한편, 실행중의 프로그램을 정지시킬 수가 없습니다 (명령행에서 gdb를 사용할 때는 보통 Ctrl+C로 멈추는데…).
    하지만 VSCode의 GUI에서 디버깅을 할 수 있다면 편리한 것은 확실하기 때문에 불완전하지만 정보로 공개하고 싶습니다.

    (실행 환경의 WSL은 WSL2를 전제로 하고 있습니다. WSL1의 경우는 Windows측의 IP 주소를 지정하고 있는 개소를 삭제하는 등 하면 움직인다고 생각합니다)

    실행 전 준비


  • 다음 쉘 스크립트를 gdb-pico라는 파일 이름으로 경로가 지정된 위치에 놓습니다.
    (여기에서 쓴 것에서 조금만 바뀝니다)

  • gdb-pico
    #!/bin/sh
    killall -q gdb-multiarch
    gdb-multiarch -ex "target remote `tail -1 /etc/resolv.conf|awk '{print $2}'`:3333" $*
    
  • Pico SDK에서 실행할 프로그램이 있는 폴더를 VSCode의 Remote WSL에서 작업 공간으로 열고 해당 루트에 .vscode라는 폴더를 만들고 다음 파일launch.json을 놓습니다.
  • (pico-examples의 경우 pico-examples/.vscode/launch.json)


  • launch.json
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb)",
                "type": "cppdbg",
                "request": "launch",
                "targetArchitecture": "arm",
                "program": "${workspaceFolder}/build/${relativeFileDirname}/${fileBasenameNoExtension}.elf",
                "args": [],
                "stopAtEntry": true,
                "cwd": "${workspaceFolder}",
                "environment": [],
                "MIMode": "gdb",
                "miDebuggerPath": "${env:HOME}/bin/gdb-pico",
                "launchCompleteCommand": "exec-continue",
                "setupCommands": [
                    {
                        "text": "load ${workspaceFolder}/build/${relativeFileDirname}/${fileBasenameNoExtension}.elf"
                    }
                ]
            }
        ]
    }
    

    VSCode에서 디버깅


  • WSL 쉘에서 다음 명령을 실행하십시오.
  • openocd.exe -f interface/picoprobe.cfg -f target/rp2040.cfg -c 'bindto 0.0.0.0'
    
  • VSCode에서 디버깅하려는 앱을 빌드하고 소스 코드(여기서는 blink/blink.c)를 엽니다.
  • main() 첫 번째 행의 행 번호 왼쪽을 클릭하고 중단 점을 놓습니다 (빨간색으로 표시).
  • F5 또는 実行(R) - デバッグの開始에서 gdb가 실행되고 미리 실행중인 openocd에 연결하고 중단 점에 멈추고 디버깅을 시작합니다.


  • 브레이크 포인트를 두지 않고 続行(F5) 하면 멈출 수 없게 되어 버리는 것만 주의가 필요합니다만, 그 외 통상의 디버그 조작은 보통으로 할 수 있습니다.
  • 계속하면 gdb가 VSCode의 제어를 벗어나 움직이지 않게 됩니다만, 정지해 다시 디버그를 개시할 때는, gdb-pico 스크립트에 넣은 killall로 삭제되도록 하고 있습니다 합니다.


  • (덤) cmake / make 등을하는 tasks.json



    Getting Started에서는 VSCode를 사용할 때는 CMake Tools 확장을 사용하도록 쓰고 있습니다.

    소스 코드를 열고 tasks.json 또는 .vscode - Ctrl+Shift+B에서 다음을 수행할 수 있습니다.
  • cmake
  • 프로젝트의 루트에 build/디렉토리를 파고 cmake를 실행합니다

  • distclean
  • build/디렉토리 삭제

  • make
  • make (verbose)
  • 열려있는 소스 코드 앱을 빌드합니다

  • clean
  • 빌드 제품을 삭제합니다

  • install
  • 빌드로 만든 *.uf2 파일을 Pico에 설치합니다. 아래 기사에서 설명한 ターミナル 스크립트를 준비하고 경로를 통과해야합니다.
  • 【소 재료】 ​​WSL 이용시의 Raspberry Pi Pico에의 기입을 커맨드 라인으로부터 실시한다



  • tasks.json
    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "make",
                "type": "shell",
                "command": "make -j4",
                "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"
            },
        ],
        "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"
            }
        ]
    }
    

    좋은 웹페이지 즐겨찾기