Raspberry Pico: 단일 장치로 간단한 디버깅 수행

복분자 피코는 2021년 2월 출시된 새로운 마이크로컨트롤러다.지역 사회가 이 새 이사회에 흥분하여 몇몇 사람들이 경탄할 만한 프로젝트를 시작했다.일찍이 나는 두 개의 회로판을 잡고 아두노 기반의 로봇을 여전히 사용하고 있을 때 일반적인 플래시 led와 전위계 강좌를 만들었다.간단하게 보기 위해 Micropython SDK를 사용했습니다.그것은 단지 몇 분만 있으면 설치할 수 있으며, 간단한 스케치는 매우 쉽다. 피코에 실시간으로 연결하여 프로그램을 실행할 수 있다.
CSDK를 사용하고 싶다면, 구축 도구, Cmake 설치, SDK 다운로드, SDK 경로 정의, 프로젝트에 Cmake 파일 추가, 필요한 라이브러리 추가 등 해야 할 일이 많다. UF2 파일을 컴파일해서 피코에 수동으로 업로드해야 하는 편안함도 있다.
얘가 더 좋고 쉬울 수 있을까요?맞아요!위대한 wizio-pico 프로젝트에 감사 드립니다. VS 코드 통합은 당신의 피코에 직접 업로드하는 것을 포함합니다.pico-debug project를 고려할 때 프로그램의 완전한 디버깅 기능을 통합할 수 있습니다.
이 블로그는 Pico 설치 시리즈의 계속으로, VS Studio 코드에 완전히 작동하는 디버거를 설치하는 방법에 대해 자세히 설명합니다.이러한 절차는 최종적으로pico-debug projectwizio-pico의 해석을 바탕으로 하지만 설정이 복잡하기 때문에 저는 총괄적인 블로그 글을 썼다는 것을 기억하세요.간단한 부팅 버튼 하나만 누르면 Pico C 프로그램을 디버깅할 수 있습니다.
본문은 최초로 발표되었다my blog.

도구 개요


우리가 완전히 통합된 디버깅 해결 방안을 달성하기 전에, 우리가 힘든 일을 완성할 수 있는 도구를 이해하는 것이 매우 중요하다.
JTAG standard는 집적회로를 어떻게 디버깅하는지 설명했다.이 표준은 회로에 접근하는 레지스터와 버스 시스템의 통신 프로토콜을 정의한다.직렬 포트와 같이 회로에 액세스하는 전기 인터페이스도 설명합니다.SWD(직렬선 디버깅) 프로토콜은 전용 포트를 사용할 필요가 없고 두 개의 트랙만 사용하면 ARM칩과 인터페이스 디버깅을 할 수 있다.이 표준은 도구OpenOCD에서 사용하며, 이 도구는 필름 디버거의 알파벳 줄임말이다.그것은 JTAG 표준을 사용하여 집적 회로를 만드는 디버깅 세션입니다.마지막으로 GNU Project Debugger GDB는 디버깅 프로그램의 소스 오픈 도구로 C, C++ 등을 지원합니다.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
...그리고 Git 메모리 라이브러리를 복제해서 맞춤형 OCD 버전을 컴파일하고 만들 것입니다.
$> 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

Pico 준비


도구 체인의 설치와 테스트에 따라 Pico 자체를 계속 준비할 수 있습니다.마찬가지로 두 가지 임무를 완성해야 한다.
  • Pico는 디버그 장치로 사용할 수 있도록 특수한 UF2 이미지로 시작해야 합니다
  • 목표 프로그램은 특수한 디버깅 컴파일러 로고
  • 를 사용하여 컴파일해야 한다.

    디버그 UF2 이미지 설치


    먼저 https://github.com/majbthrd/pico-debug/releases에서 최신 UF2 이미지를 캡처한 다음 파일을 대용량 스토리지 모드에 설치된 Pico로 드래그합니다.이것은 복분자 Pico를 CMSIS-DAP 장치로 안내합니다.이 알파벳 줄임말은 Cortex 마이크로컨트롤러 소프트웨어 인터페이스 표준인 디버깅 액세스 포트를 대표하는데 이것은 프로토콜 규범일 뿐만 아니라 구체적인 하드웨어이기도 하다.기술적으로는 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 파일, 디버깅 가능한 버전의 프로그램을 컴파일하고 가지고 있습니다.그러나 상황은 그렇지 않다.Pico 하나만 사용하여 디버깅을 하려면 특수 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
    
    
    구체적인 단계는 다음과 같습니다.
  • 카탈로그 생성builddebug
  • debug에서 특수한 uf2 파일을 복사하고 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/
    
  • 폴더로 이동하고 다음 명령을 실행합니다.
  • 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
    
  • 폴더에서 볼 수 있음debug/build - 이 디렉토리로 전환하고 실행build
  • 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
    
    완성!이제 프로그램이 디버깅 가능한 버전으로 연결되어 있는 Pico에서 실행됩니다.

    CLI에서 디버깅


    우리는 이미 공구 체인을 설치했다.우리는 이미 피코를 준비했다.이제 우리는 디버깅 과정을 시작할 수 있다.이 섹션에서는 CLI 도구를 직접 사용합니다.다음 섹션에서는 이러한 도구를 VisualStudio 코드에 통합합니다.

    OpenOCD: 일반 사용자로 실행


    일반 사용자로 OpenOCD를 실행하기 위해서는 OpenOCD 시작 파일을 만들고 일반 사용자를 특수 그룹에 추가해야 합니다.이 절차의 참고 자료는 다음과 같다stackexchange post.
    파일src을 만들고 다음을 추가합니다.
    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"
    
    이 명령이 무엇을 의미하는지 나처럼 궁금하다면:
  • 두 개make 로고는 설정 파일의 로드를 지시합니다. 여기에 디버깅 액세스 포트(DAP) 설정과 피카(RP2040) 설정
  • 을 로드합니다.
  • 두 개의 /etc/udev/rules.d/98-openocd.rules 표지판은 운행하는 다른 명령을 지시한다. 우리는 직렬선을 통해 연결을 디버깅하고 호스트와 Pico 간의 연결 속도(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)
    
    파일-f을 만들고 다음을 입력합니다.
    {
      "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"]
        }
      ]
    }
    
    중요한 변경 사항은 다음과 같습니다.
  • -c: 디버깅이 완료된 컴파일러 파일을 가리켜야 합니다
  • .vscode/launch.json: SVD는 마이크로 컨트롤러의 세부 사항을 포함하는 파일 형식으로 Openocd는 이 파일을 사용하여 하드웨어와 관련된 디버깅 정보를 제공한다.
  • executable: OpenOCD 설치 tcl 경로로 구성
  • 지금이 마지막 순간이야.VS 코드에서 svdFile를 클릭하면 몇 초 후에 다음 창이 표시됩니다.

    IDE의 모든 편의가 있으니 이제 디버깅을 할 수 있습니다.

    결론


    이 블로그는 몇 가지 측면에서 더 많은 시간을 들였다. 그것은 글을 쓰는 시간, 모든 옵션을 테스트하는 시간, 그리고 이 글의 길이였다.모든 설정이 완료되면 통합된 IDE에서 Pico 프로그램을 작성하여 코드 하이라이트 디스플레이, 라이브러리 함수 탐색, 재구성 옵션의 모든 편의를 누릴 수 있습니다.또한 원클릭 업로드 기능을 사용하면 아두노처럼 프로그래밍을 할 수 있다.또한 프로그램의 디버그 버전을 컴파일하고 Visual Studio 코드에서 디버거를 실행할 수 있습니다.이것은 당신의 개발 효율을 크게 높일 것입니다.
    향후 프로젝트를 시작하는 데 도움이 되려면 내 pico-project-setup repo on Github를 참조하십시오.

    좋은 웹페이지 즐겨찾기