簡介:
最近一段時間一直在學習Linux平臺下的嵌入式stm32開發環境的搭建,現在終于搭建完畢,基本滿足了自己的開發需求,就順便寫下自己的一點心得。
最開始做嵌入式開發是在win平臺下,后來因為學習需要轉到了deepin(一個linux的發行版)平臺,但是總不能一直兩個系統切換吧,況且Keil嵌入式開發軟件,雖然強大,但是語法補全功能實在做的捉急,各種嫌棄。作為一個IDE黨,于是轉投Clion,想使用Clion進行嵌入式開發。
Clion的優勢:
1. 編譯,連接自動化輔助工具Cmake很大程度上解決了,嵌入式開發環境復雜的編譯鏈接過程
2. 強大的語法智能補全、debug ?功能 ?(2017版本剛好又已經有了嵌入式所需要的 remote debug)
開發環境:
平臺:deepin?
工具鏈 : ?arm-none-eabi
IDE : ?Clion
調試器驅動:開源 openocd (適用于多種調試器jlink、stlink。這里我用的是stlink調試器)
輔助工具:expect, telnet ? ? (這兩個軟件可以直接在軟件倉庫下載 `sudo apt-get install xxxx` )
配置模板:
cmake配置:
cmake有一部分宏定義是需要在IDE -> setting -> build...->cmake 里面進行配置的,作為全局變量在cmake編譯過程中生效,這里我會一一進行詳細說明。
這里主要設置了兩個宏定義供CMake編譯的時候使用:
-DTOOLCHAIN_DIR=/home/sunqi/program/gcc-arm-none-eabi-5_4-2016q3
-DCMAKE_TOOLCHAIN_FILE=/home/sunqi/Desktop/mcu_proj/conf/t
第一個宏定義是自己arm-none-eabi編譯工具鏈的path
第二個宏定義是cmake自己的處理文件,基于第一個宏定義,找出所需要的編譯時用到的gcc,ld命令地址,還有一些是硬件相關的參數。
兩個宏定義的路徑是基于自己的文件路徑定義的,不要盲目搬磚??!
oolchain-arm-eabi-gcc.cmake ?文件的內容將下面內容保存,我將它放在了project根目錄下
include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m3)
find_program(ARM_CC arm-none-eabi-gcc ${TOOLCHAIN_DIR}/bin)
find_program(ARM_CXX arm-none-eabi-g++ ${TOOLCHAIN_DIR}/bin)
find_program(ARM_OBJCOPY arm-none-eabi-objcopy ${TOOLCHAIN_DIR}/bin)
find_program(ARM_SIZE_TOOL arm-none-eabi-size ${TOOLCHAIN_DIR}/bin)
CMAKE_FORCE_C_COMPILER(${ARM_CC} GNU)
CMAKE_FORCE_CXX_COMPILER(${ARM_CXX} GNU)
set(CMAKE_ARM_FLAGS
"-mcpu=cortex-m3 -mthumb -fno-common -ffunction-sections -fdata-sections"
)
if(CMAKE_SYSTEM_PROCESSOR STREQUAL"cortex-m3")
set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS} ${CMAKE_ARM_FLAGS}")
set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} ${CMAKE_ARM_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_ARM_FLAGS}")
else()
message(WARNING
"Processor not recognised in toolchain file,"
"compiler flags not configured."
)
endif()
# fix long strings (CMake appends semicolons)
string(REGEX REPLACE";" " "CMAKE_C_FLAGS"${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS}"CACHE STRING"")
set(BUILD_SHARED_LIBS OFF)
Clion項目根目錄下還有一個CMakeList 是整個項目的編譯配置文件,包含了編譯、連接參數的配置以及輸出編譯文件的路徑, 默認是在 工程目錄下的build文件夾下。
cmakeList的具體配置我就不多說了,具體看文件內部的注釋。
gdb相關配置:
openocd相當于建立了一個gdb-server。clion使用arm-noen-eabi-gdb的進行調試的時候需要進行先關的設置
進入run/debug configuration界面以后 點擊左上角的 `+`號,里面選擇remote gdb debugger 選項,然后按照如下進行配置。
openocd的默認tcp 調試端口是3333。
symbol file的路徑是 project/build/xxx.elf ? ? 看你項目的名字了 ? ? xxx 由項目根目錄下CMakeList 文件中的項目名字決定。
還需要對gdb初始化文件進行配置,初始化配置文件 `.gdbinit`可以在兩個地方
1. gdb程序的絕對地址所在的目錄下
2. ~/.gdbinit
一般我們選擇第二種方式,如果沒有在 ~路徑下創建。
~/.gdbinit 內容如下
add-auto-load-safe-path ~/.gdbinit
define target hookpost-remote
#file "~/CLionProjects/mcu/build/mcu.elf"
monitor reset
monitor halt
load
break main
end
openocd的相關配置:
我們使用openocd其實是為了將它作為一個gdb-server傳遞指令,我們在Clion中要新建一個相關的工具,開啟gdb-server服務。
配置具體如下:
注意 下方倒數第三個欄目 program欄目中程序的路徑是根據自己程序存放的地址來定義的。
第二行參數是與調試器相關的我的是stlink v2所以使用的是這個參數。jlink的參數可以到官網查詢,也可以在網上直接搜到很簡單我就不說了。
整個工程的模板我放在了我的github
項目的編譯:
項目的debug:
上張圖中 step1:切換到remote debug欄目,切換后然后直接按下按鈕右邊debug按鈕即可。
美中不足的是不能查看對應的匯編寄存器變量,不過對我來說是夠了。
參考文章:
使用CLion做嵌入式開發? 這篇文章少了.gdbinit的配置這個很重要 缺少后會一直報錯
STM32高級開發(11)-使用GDB調試你的工程? gdb調試命令解釋的很詳細
windows下使用CLion+OpenOCD+expect做嵌入式開發(在CLion中編譯、燒錄、調試stm32)?win平臺下的clion參考?
github stlink?開源的stlink驅動 這個的作用和openocd一樣 都是gdb-server 看它的readme很有用