最近看了一些资料,关于工程和项目方面的,其中一方面是关于持续集成和持续部署方面的,以为有必要学习一下并运用到实际中,无奈编译那部分没法搞定,由于咱们作单片机的基本上都是用MDK作为开发工具,不得不说,MDK开发嵌入式确实挺好,各类板子的配置,debug方面很出色,内存占用也很小,可是有几点不喜欢:linux
改造以后就能够脱离MDK来进行程序的编写,编译以及运行,不只能够学习到整个工程编译过程(怎么从源码变成elf文件再变成hex和bin文件)的还能够实现持续集成相关任务,经过cmd或者linux终端便可实现程序的编译,下载.c++
不过每次都到命令行敲指令毕竟很麻烦,我们更多的仍是使用图形化的IDE界面,能够经过点击按钮就实现程序编译下载等等,我比较喜欢Clion和Qtcreater两款IDE,可是Clion占用内存比Qtcreater大并且须要收费(也能够破解和买tb激活码,可是毕竟盗版了),加上从业以来一直喜欢用qtcreater,最终选择了qtvreater,可是最终的效果是同样的,你们弄懂了其中原理也能够改造到本身喜欢的编辑器里去,好比vs code,sublime等等,不列举了
开始以前须要了解的知识储备大体以下,没必要深究细节,理解为主,老鸟自动忽略便可编程
1.编译工具链(gcc llvm armcc armclang) 2.编译的四步骤(预处理,汇编,编译,连接) 3.什么叫elf文件(可执行文件) 4.elf和hex,bin文件什么关系(固件) 5.make(makefile)和cmake有什么关系 若是对于以上几个概念没有什么基础,你们去百度上搜索相关资料,这里我就很少作介绍,真要提及来,一匹布那么长......
windows平台上下载mingw-make工具并添加到系统路径下(cmd调出make指令不会提示未找到指令),linux平台直接就能用,具体的安装方法上网搜索之,这里就不浪费篇幅,以windows为例,达到如下效果便可:segmentfault
cmake的安装也很简单,上网搜索就能够了,安装后添加系统路径,cmd能找到指令就好了,以下图所示:windows
这两个ide是否安装全凭喜爱,不习惯或者有别的顺手的家伙也能够不装,经过命令行敲命令的方式能够能够的.具体的安装过程这里也不赘述ide的安装过程,总之安装好了以后桌面上会出现图标,点击打开便可,新安装的clion可能会提示激活,不要紧咱们免费用30天,30天到期以后是破解仍是买激活码各童鞋本身选择便可.app
接下来就是真正动手的环节了,大致步骤:重头戏--编辑cmake文件,导入cmake生成makefile,编译,下载等等,具体的工程是使用我如今用的芯片nrf52832,sdk12.3,编译链选择的是armclang,个童鞋也能够用gcc来编译.编程语言
cmake使用一个叫作CMakeLists.txt的文件进行编译管理,这个名字大多数状况下是固定的,由于不少IDE依靠这个名称进行cmake识别
1.使用armclang或者armgcc须要的文章的cmake文件分为两个,一个是tollchain.cmake,一个就是CMakeLists.txt,这两个文件的做用不太同样,一个是定义编译工具, 一个就是具体的编译规则
2.使用MDK自带的armcc工具链只须要一个文件就是CMakeLists.txt,注意,cmake3.5在版本在3.5版本以后才增长了armcc的支持,目前cmake最新版本是3.15,建议你们都用最新版本或者次新版本(防止先版本有bug)
本文属于抛砖引玉型文章,由于大多数的工程仍是用的armcc编译链来进行编译的,这里先按照从易到难先从armcc的方式给你们理解一下cmakelists文件的编写.关于armclang由于有许多的芯片库sdk在armclang下会出问题(定义的__GUN__可是又不能使用.ld文件,会形成不少麻烦,固然有解决办法,比较复杂)编辑器
1.定义cmake版本以及工程名称ide
cmake_minimum_required(VERSION 3.12) ##支持的cmake最低版本 project("S350N_M8" C) ##定义项目名称和源码语言(新) enable_language(ASM) ##启用汇编语言
2.定义编译,连接工具
用于给makefile文件指定交叉编译工具,简单来讲就是让makefile知道用什么工具去干活,很重要,那么工具链在哪呢,咱们打开文件管理器定位到mdk的安装目录,以下图所示目录:函数
代码以下:
set(TOLLCHAIN_PATH "D:/keil_v5/armcc/bin") ##先设置一个赞成的路径,用set语法至关于编程语言的定义一个字符串 set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/armcc.exe") ##设置c语言编译链,c++为CMAKE_CXX_COMPILER set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH}/armasm.exe") ##设置汇编编译工具 set(CMAKE_C_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlinke.exe") ##设置连接工具
3添加工程源文件和头文件/路径
设置完编译链以后就能够添加代码源文件了,这个有好几个方法,你们也能够本身百度一下cmake的语法或者找一个教程来实践一下,拿我本身的文件举例说明一下:
##file语法,前一个参数是固定的 后面一个参数本身定义 ##添加文件的时候注意 相对路径和绝对路径 file(GLOB_RECURSE C_FILES src/*.c src/*.h src/drivers/*.c src/drivers/*.h src/sm9/*.h rtt_src/rtconfig.h rtt_src/board.c ) ##好比我使用的rtthread的相关文件不想挤在一块儿,还能够这样 file(GLOB_RECURSE KENEL_FILES ${RTTHREAD_SDK}/src/*.c ${RTTHREAD_SDK}/libcpu/arm/cortex-m4/context_rvds.s ${RTTHREAD_SDK}/libcpu/arm/cortex-m4/cpuport.c ) ##cmake语法比较灵活,空格还有换行这些比较随意,相比之下makefile就死板不少,常常出现修改以后makefile文件就报错了 ##而后就能够把文件归属为源码 set(SOURCE_FILES ${C_FILES} ${KENEL_FILES}) ##上面file定义了标识符,有几个写几个就好了,灵活配置 ##接下来就是包含头文件路径,好比某些库函数这些,直接设置头文件就行,由于咱们通常不会去改他,包含就行 include_directories( ${TOOLCHAIN_DIR}/include ## rtthread kenel include ${RTTHREAD_SDK}/include src src/drivers src/interface src/sm9 rtt_src ./RTE/_nrf52832_xxaa ${SDK_ROOT}/components/softdevice/common ${SDK_ROOT}/components/libraries/strerror ${SDK_ROOT}/components/drivers_nrf/comp )
4.定义编译,连接参数
编译连接参数一样很重要,影响到编译的文件的生成,好比说,设置这个有个捷径,咱们能够直接从mdk里面拷贝,这里以图片展现好比下面的图片:
c/c++编译选项
汇编编译选项
连接选项
注意连接选项这里有一个分散加载文件,路径不要搞错了,通常是从mdk工程里面直接拷过来就行,愿意研究这个文件的能够本身研究
而后cmake里面还有一个语法能够定义编译选项:
5.编译其余选项
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/path/to/xxx.lib") #加载静态库 #添加可执行文件,依赖上面定义的sourcefile 若是是编译成静态库用add_library()函数,可自行研究 add_executable(${TARGETS} ${SOURCE_FILES} )
至此,就能够用cmake生成makefile文件而后生成elf文件,生成elf文件以后用fromelf文件转换成hex文件就好了,在fromelf的目录用cmd打开,就获得下面这个指令使用说明:
固然,不可能每次都手动去敲命令来进行转换,cmake已经替咱们想到了:
set(ELF_FILE ${TARGETS}.elf) set(HEX_FILE ${TARGETS}.hex) set(APP_FILE app_${TARGETS}.hex) set(BIN_FILE ${TARGETS}.bin) set(elfPath D:/Keil_v5/ARM/ARMCC/bin/fromelf.exe) add_custom_command(TARGET ${TARGETS} POST_BUILD COMMAND ${elfPath} --i32 --output=${APP_FILE} ${TARGETS}.exe )
关于这个指令,网上有不少解释,能单独成一篇文章了,这里只是简单展现用法,在目标(TARGET )建立以后(POST_BUILD)调用这些指令(COMMAND)具体用法读者自行理解吧
同时,不少同窗在使用mdk的时候会用过用户自定义指令,好比:
不用担忧,cmake也有,仍是上面那个指令,在hex生成那里本身添就好了,并且MDK只有两条,咱们用cmake想写多少就写多少
至此咱们的cmake就编写完成了,下面就是在cmakelists.txt文件的目录运行指令生成目标,好比:cmake --build .--target all
能够运行指令后看一看生成的文件
此文完,后续介绍Qtcreater和clion相操做与设置:https://segmentfault.com/a/11...