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

image.png

請點擊"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,這時候已經沒有了錯誤提示,等待數秒,待固件燒寫完畢后,就可以開始調試了!

成功燒錄固件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。