简介:
最近一段时间一直在学习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宏定义设置这里主要设置了两个宏定义供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 选项,然后按照如下进行配置。
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服务。
新建tool工具栏选项配置具体如下:
注意 下方倒数第三个栏目 program栏目中程序的路径是根据自己程序存放的地址来定义的。
第二行参数是与调试器相关的我的是stlink v2所以使用的是这个参数。jlink的参数可以到官网查询,也可以在网上直接搜到很简单我就不说了。
openocd stlink-v2的具体配置整个工程的模板我放在了我的github
项目的编译:
项目的debug:
上张图中 step1:切换到remote debug栏目,切换后然后直接按下按钮右边debug按钮即可。
debug截图美中不足的是不能查看对应的汇编寄存器变量,不过对我来说是够了。
参考文章:
使用CLion做嵌入式开发 这篇文章少了.gdbinit的配置这个很重要 缺少后会一直报错
STM32高级开发(11)-使用GDB调试你的工程 gdb调试命令解释的很详细
windows下使用CLion+OpenOCD+expect做嵌入式开发(在CLion中编译、烧录、调试stm32) win平台下的clion参考
github stlink 开源的stlink驱动 这个的作用和openocd一样 都是gdb-server 看它的readme很有用
网友评论