簡介:
最近一段時間一直在學(xué)習(xí)Linux平臺下的嵌入式stm32開發(fā)環(huán)境的搭建,現(xiàn)在終于搭建完畢,基本滿足了自己的開發(fā)需求,就順便寫下自己的一點心得。
最開始做嵌入式開發(fā)是在win平臺下,后來因為學(xué)習(xí)需要轉(zhuǎn)到了deepin(一個linux的發(fā)行版)平臺,但是總不能一直兩個系統(tǒng)切換吧,況且Keil嵌入式開發(fā)軟件,雖然強大,但是語法補全功能實在做的捉急,各種嫌棄。作為一個IDE黨,于是轉(zhuǎn)投Clion,想使用Clion進行嵌入式開發(fā)。
Clion的優(yōu)勢:
1. 編譯,連接自動化輔助工具Cmake很大程度上解決了,嵌入式開發(fā)環(huán)境復(fù)雜的編譯鏈接過程
2. 強大的語法智能補全、debug ?功能 ?(2017版本剛好又已經(jīng)有了嵌入式所需要的 remote debug)
開發(fā)環(huán)境:
平臺:deepin?
工具鏈 : ?arm-none-eabi
IDE : ?Clion
調(diào)試器驅(qū)動:開源 openocd (適用于多種調(diào)試器jlink、stlink。這里我用的是stlink調(diào)試器)
輔助工具:expect, telnet ? ? (這兩個軟件可以直接在軟件倉庫下載 `sudo apt-get install xxxx` )
配置模板:
cmake配置:
cmake有一部分宏定義是需要在IDE -> setting -> build...->cmake 里面進行配置的,作為全局變量在cmake編譯過程中生效,這里我會一一進行詳細說明。
這里主要設(shè)置了兩個宏定義供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命令地址,還有一些是硬件相關(guān)的參數(shù)。
兩個宏定義的路徑是基于自己的文件路徑定義的,不要盲目搬磚!!
oolchain-arm-eabi-gcc.cmake ?文件的內(nèi)容將下面內(nèi)容保存,我將它放在了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 是整個項目的編譯配置文件,包含了編譯、連接參數(shù)的配置以及輸出編譯文件的路徑, 默認是在 工程目錄下的build文件夾下。
cmakeList的具體配置我就不多說了,具體看文件內(nèi)部的注釋。
gdb相關(guān)配置:
openocd相當(dāng)于建立了一個gdb-server。clion使用arm-noen-eabi-gdb的進行調(diào)試的時候需要進行先關(guān)的設(shè)置
進入run/debug configuration界面以后 點擊左上角的 `+`號,里面選擇remote gdb debugger 選項,然后按照如下進行配置。
openocd的默認tcp 調(diào)試端口是3333。
symbol file的路徑是 project/build/xxx.elf ? ? 看你項目的名字了 ? ? xxx 由項目根目錄下CMakeList 文件中的項目名字決定。
還需要對gdb初始化文件進行配置,初始化配置文件 `.gdbinit`可以在兩個地方
1. gdb程序的絕對地址所在的目錄下
2. ~/.gdbinit
一般我們選擇第二種方式,如果沒有在 ~路徑下創(chuàng)建。
~/.gdbinit 內(nèi)容如下
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的相關(guān)配置:
我們使用openocd其實是為了將它作為一個gdb-server傳遞指令,我們在Clion中要新建一個相關(guān)的工具,開啟gdb-server服務(wù)。
配置具體如下:
注意 下方倒數(shù)第三個欄目 program欄目中程序的路徑是根據(jù)自己程序存放的地址來定義的。
第二行參數(shù)是與調(diào)試器相關(guān)的我的是stlink v2所以使用的是這個參數(shù)。jlink的參數(shù)可以到官網(wǎng)查詢,也可以在網(wǎng)上直接搜到很簡單我就不說了。
整個工程的模板我放在了我的github
項目的編譯:
項目的debug:
上張圖中 step1:切換到remote debug欄目,切換后然后直接按下按鈕右邊debug按鈕即可。
美中不足的是不能查看對應(yīng)的匯編寄存器變量,不過對我來說是夠了。
參考文章:
使用CLion做嵌入式開發(fā)? 這篇文章少了.gdbinit的配置這個很重要 缺少后會一直報錯
STM32高級開發(fā)(11)-使用GDB調(diào)試你的工程? gdb調(diào)試命令解釋的很詳細
windows下使用CLion+OpenOCD+expect做嵌入式開發(fā)(在CLion中編譯、燒錄、調(diào)試stm32)?win平臺下的clion參考?
github stlink?開源的stlink驅(qū)動 這個的作用和openocd一樣 都是gdb-server 看它的readme很有用