Ubuntu下使用VSCode編譯調試Betaflight飛控

日期:2019.05.05
開發環境:ubuntu18.04
工具鏈:gcc-arm-none-eabi-7-2018-q2(7.3.1)

一.基礎軟件

  • vscode
    安裝方式自行百度,之後記得再安裝一些必要插件比如C/C++,GitLens等。
  • git
    ubuntu自帶

二.下載和編譯

1.下載代碼

git clone https://github.com/betaflight/betaflight.git

2.安裝編譯工具鏈

我使用的工具鏈版本爲7.3.1,低於該版本無法編譯betaflight最新分支。

下載鏈接https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

請下載gcc-arm-none-eabi-7-2018-q2-update,Linux 64-bit

gcc-arm-none-eabi-7-2018-q2-update

拷貝該文件至Home目錄並解壓(其它任意目錄均可,不過導入環境變量時要注意修改爲你的實際目錄)。

在終端中輸入以下命令,導入工具鏈路徑到環境變量:

exportline="export PATH=$HOME/gcc-arm-none-eabi-7-2018-q2-update-linux/bin:\$PATH"

if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi

. ~/.profile

檢測gcc-arm-none-eabi是否已正確安裝,輸入

arm-none-eabi-gcc --version

應該輸出類似以下內容

arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

最好重啓或註銷使該環境變量應用到所有終端

reboot

3.編譯

啓動vscode,打開betaflight項目所在文件夾,然後按下"ctrl+shift+`"打開終端,輸入編譯命令

make TARGET=SPRACINGF3  DEBUG=INFO

編譯

其中TARGET指定了固件編譯目標,對應你的板子,注意基於STM32F3的飛控板已經不支持高於4.0版本的固件了。DEBUG=INFO表示編譯時開啓Debug信息(帶有一定優化級別),而DEBUG=GDB則是開啓Debug信息並關閉優化。
編譯成功

三.在線調試

1.安裝Jlink驅動

https://www.segger.com/downloads/jlink#J-LinkSoftwareAndDocumentationPack
Jlink驅動
請點擊"J-Link Software and Documentation pack for Linux, DEB installer, 64-bit",並選擇一個版本進行下載,我這裏選擇的是v5.10。下載完之後直接在ubuntu下雙擊安裝。

2.安裝vscode調試插件

在vscode的插件市場中搜索"Cortex-Debug"(下圖中左側欄的第五個圖標),並點擊安裝,安裝完之後最好重啓一下vscode。

Cortex-Debug

3.Debug參數配置

打開Debug界面(左側欄第三個圖標),在調試菜單欄中選擇“添加配置”,並選擇Cortex Debug。

點擊小齒輪圖標,打開launch.json,將下面的代碼複製(覆蓋)進去。

Debug參數配置

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "${workspaceRoot}",
            "executable": "./obj/main/betaflight_SPRACINGF3.elf", //需要設置爲你編譯出來的固件路徑
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "jlink",
            "device": "STM32F303CB", //飛控的單片機型號,需要jlink驅動支持
            "interface": "swd",
        }
    ]
}

根據不同的飛控板子,需要修改其中的"executable"和"device"。

4.開啓調試

將Jlink通過SWD接口連接飛控,在vscode中點擊DEBUG圖表或者按下F5,開始進入Debug模式。接下來可以在代碼左側單擊設置斷點,以及在Debug窗口中查看當前變量,也可以在WATCH窗口中設置需要觀察的變量(手動輸入變量名)。

開啓調試

四.使用OpenOCD實現燒錄調試一體

上述方式存在一個明顯的缺點,即無法通過vscode給飛控燒錄程序,而每次調試前又要必須更新飛控程序,使兩邊固件保持一致,否則調試時會引發錯誤。

可以使用OpenOCD軟件,來實現這個功能。

1.安裝OpenOCD

終端中輸入命令

sudo apt install openocd

2.修改vscode的Debug配置文件

在vscode的Debug頁面中點擊小齒輪圖標,打開launch.json文件,將下列代碼複製進去(覆蓋):

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Cortex Debug",
      "cwd": "${workspaceRoot}",
      "executable": "./obj/main/betaflight_SPRACINGF3.elf", //固件路徑,需要根據實際情況修改
      "request": "launch",
      "type": "cortex-debug",
      "servertype": "openocd",
      "configFiles": [
        "interface/jlink.cfg", //Jlink配置文件
        "target/stm32f3x.cfg" //目標芯片配置文件,需要根據自己飛控的實際芯片修改,可以到/usr/share/openocd/scripts/target目錄下查看存在的配置文件
      ]
    }
  ]
}

3.修改openocd的jlink配置

由於我使用的調試接口爲SWD,需要對openocd的配置文件進行修改,輸入:

sudo gedit /usr/share/openocd/scripts/interface/jlink.cfg

打開jlink.cfg文件進行修改,在其中加入一行並保存:

transport select swd

如下圖所示:
修改jlink.cfg

4.修改芯片配置文件

理論上到上一步就已經結束了,但實際上存在着一些意外情況,若此時直接在vscode中按下F5,進入調試,會輸出以下信息:
錯誤信息
提示固件加載失敗,此時繼續按F5,會接着進入調試,但毫無疑問的是固件燒錄失敗了。

原因在於,openocd的stm32f3x.cfg配置文件會自動識別F3芯片的flash大小爲128k,而實際燒錄的固件大小超出200k,因此會燒錄失敗。

因此,我們需要手動修改以下配置文件,輸入:

sudo gedit /usr/share/openocd/scripts/target/stm32f3x.cfg

找到這一行,將其註釋掉

flash bank $_FLASHNAME stm32f1x 0 0 0 0 $_TARGETNAME

並在下面加入一行(修改flash大小爲256k)

flash bank $_FLASHNAME stm32f1x 0x08000000 0x40000 0 0 $_TARGETNAME

如下圖所示
修改配置文件

如果你的飛控板不是F3而是基於F4或F7的,或許不存在這個問題(我沒測試過),便可以直接跳過這一步。

再打開vscode,按下F5,這時候已經沒有了錯誤提示,等待數秒,待固件燒寫完畢後,就可以開始調試了!

成功燒錄固件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章