本帖最后由 yang377156216 于 2022-4-19 16:28 编辑
#申请原创# @21小跑堂
整体概览实际开发中,不同的人习惯用不同的开发工具,这就要求工程师在发布嵌入式软件项目的时候,需要考虑适配多个开发环境。有了解到目前大多国内的 32 位 MCU 厂商发布的库例程都会适配好 KEIL、IAR 和 GCC 这三大主流环境,开发者可以各取所需极为方便。由于下载灵动官方样例包中未包含到 GCC 平台的示例,不过上一篇中已经分享了一个简便的方法,让大家可以快速导入到 GCC 的开发中,但心中还是有个疑问:“是否有更优雅的操作方式,使得同一份源码可以打包生成不一样开发环境的工程?涵盖三大主流环境?”,带着疑问进行了探索,接下来将我发现的方法整理出来,内容主要分以下几点: 一、初识 project_generator带着上面的问题在网上搜寻了一番,无意间发现 CMSIS DAP 开源项目中使用到了一个叫 project.yaml 文件用于管理项目,并且根据记录中定义的一些规则来生成不同 IDE 的项目工程文件,还做了模块化处理,看起来就十分整洁: 后来才知道,原来它就是用到了一个叫 project_generator 的 python 项目管理工具,结合特定语法内容的 YAML 文件,让输出不同开发环境工程文件这件事变得简单起来。它是 ARM 官方开发的一个工具,源码是开源的,YAML 语法比 makefile 的要更加容易理解且格式简单,目前使用 progen(project_generator 的缩写叫法)可以支持生成以下环境的工程: uVision4 and uVision5 IAR Makefile (GCC ARM) Makefile (ARMCC) Cmake (GCC ARM) CoIDE (GCC ARM) Eclipse (Makefile with GCC ARM) Sublime (Makefile with GCC ARM) Visual studio (Makefile with GCC ARM)
它支持 init 、generate 、clean 、list 以及 build 五大主要命令和其对应的一些子命令,使用比较简单。更多介绍请参阅本文附带链接中内容。
二、搭建环境体验示例工程progen 依赖于 Python 环境,所以需要先搭建好 Python 环境,可以是 Python2.7.x ,也可以安装 Python3.x.x,我电脑中都安装了,但我使用的是 pip3.exe (这点需要注意区分,对应上自己的工具版本,而不盲目地照网上的用错指令),大家可以自行安装并且将其添加至系统环境变量中。下图显示了我安装的版本以及路径,并且还安装好了上节课提及的 MinGW 工具链(让电脑可以使用 make 指令): 安装好Python环境之后,使用 pip3 工具安装 project-generator,命令是 : pip3 install project-generator (注意我的是 pip3,也可以将其修改为 pip 而 python2.7 的修改为 pip2) 为了验证确实安装成功,可以使用 progen --version 命令,查到版本号表明成功了。由于官方给提供了一个 baremetal blinky examples 例子和一个 project_generator_mbed_examples 例子,我们基于后者实操一遍来体验一下 progen。 下载好示例代码后在根目录下使用以下命令即可生成不同环境的工程: progen generate -f projects.yaml -p k20d50m_blinky -t uvision progen generate -f projects.yaml -p k20d50m_blinky -t iar_arm progen generate -f projects.yaml -p k20d50m_blinky -t gcc_arm 打开对应生成的 KEIL 工程和 IAR 工程,发现有点不尽人意了,尽管是有将源码打包好但工程显示有点杂乱,且编译后都报错,可能官方没有考虑那么周全只是演示一个可以正常打包的例子但不保证实际运行的质量吧。 同时验证了一下其它例子生成的 GCC makefile,可以正常生成但也是无法正常编译通过的,这些槽点希望 ARM 官方能够优化一下吧。
三、在 MM32F0144C6P 的官方例程包中使用 progen 工具尽管官方示例体验感不是那么完美,但依旧不能阻挡我将它用在 MM32 芯片源码包的决心。我们都知道,一些开发环境和工具在起初支持的芯片都比较有限,需要后期安装一些芯片支持包进行扩展,progen 也是一样的,支持的开发板及芯片有限,只要知道在哪些文件中进行添加,该添加哪些文件即可。下面展示添加 MM32F0144C6P coreboard 核心板的步骤: 首先找到安装目录下的 targets.py 文件,我的路径为: D:\Program Files (x86)\Anaconda3\Lib\site-packages\project_generator_definitions\target 在文件最后添加目标板信息如下: 其中 mcu/mindmotion/mm32f0140 为目标芯片的相关信息,原以为得自己写,没想到 ARM 官方已经做好直接在安装路径下: mm32f0140.yaml 相关代码如下: mcu:
core:
- cortex-m0
name:
- mm32f0140
vendor:
- MindMotion
tool_specific:
iar:
OGChipSelectEditMenu:
state:
- MM32F0144C6P MindMotion MM32F0144C6P
OGCoreOrChip:
state:
- 1
uvision5:
TargetOption:
Cpu:
- IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE
Device:
- MM32F0144C6P
DeviceId:
- 0
FlashDriverDll:
- UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MM32F0140_64 -FS08000000 -FL010000 -FP0($Device:MM32F0144C6P$Flash\MM32F0140_64.FLM))
PackID:
- MindMotion.MM32F0140_DFP.0.0.6
RegisterFile:
- null
SFDFile:
- $Device:MM32F0144C6P$SVD\MM32F0140.svd
Vendor:
- MindMotion
有了这2个文件基本已经就可以在自己的工程包中添加 project.yaml 项目管理文件用来打包了,这里直接用到官方提供的闪灯例程用来展示,gcc 相关部分文件在上次分享中已经提供。我的 project.yaml 代码如下: projects:
gpio_blinky_demo_mm32f0140:
- records/mm32f0144c6p.yaml
records 记录文件夹其实是整个项目一个个子模块打包文件,这里由于示例比较简单,所以仅包含了一个 mm32f0144c6p.yaml 文件: 代码如下: common:
target:
- coreboard-f0144c6p
core:
- Cortex-M0
includes:
- Device/CMSIS/Include
- Device/MM32F0140/Include
- Device/MM32F0140/HAL_Lib/Inc
- USER
- HARDWARE/LED
- SYSTEM/SYS
- SYSTEM/DELAY
- SYSTEM/UART
sources:
- Device/MM32F0140/Source/system_mm32f0140.c
- Device/MM32F0140/HAL_Lib/Src
- HARDWARE/LED/led.c
- SYSTEM/SYS/sys.c
- SYSTEM/DELAY/delay.c
- SYSTEM/UART/uart.c
- USER/main.c
macros:
- USE_STDPERIPH_DRIVER
tool_specific:
uvision5:
sources:
- Device/MM32F0140/Source/KEIL_StartAsm/startup_mm32f0140_keil.s
iar_arm:
sources:
- Device/MM32F0140/Source/KEIL_StartAsm/startup_mm32f0140_iar.s
gcc_arm:
linker_file:
- Device/MM32F0140/Source/MM32F0144C6P_FLASH.ld
sources:
- Device/MM32F0140/Source/GCC_StartAsm/startup_mm32f0140_gcc.s
misc:
c_flags:
- -mfpu=fpv4-sp-d16
- -mfloat-abi=softfp
- -g
- -ggdb
- -Os
- -Wall
- -fno-strict-aliasing
- -ffunction-sections
- -fdata-sections
- -fno-exceptions
- -fno-delete-null-pointer-checks
- -fmessage-length=0
- -fno-builtin
- -mthumb
- -MMD
- -MP
standard_libraries:
- m
- gcc
- c
- nosys
armcc:
sources:
- Device/MM32F0140/Source/KEIL_StartAsm/startup_mm32f0140_keil.s
armclang:
sources:
- Device/MM32F0140/Source/KEIL_StartAsm/startup_mm32f0140_keil.s
整个配置中包含了支持的目标板及目标芯片源头、工程包含的 .h 文件路径、预定义、.c 源文件以及各个平台差异化的启动文件等等相关信息,有了这些文件后可以按照前面示例工程的操作步骤来进行输出了:
可以生成 KEIL、IAR、GCC makefile 了,过程中由于前面 target.py 文件中添加板子信息时与前面一个信息模块之间遗漏了一个 , 分隔符导致第一次生成报语法错误了,然后经过一番定位找到问题并且解决了。还对生成的 makefile 进行了 make 编译,验证成功。还要说一点,生成的 KEIL 工程和 IAR 工程只有一个默认的 default 文件夹,且目标芯片的 ROM 和 RAM 信息都错误了导致会编译失败,需要手动再进行修复,不清楚是不是还有些特殊命令需要填写来优化这点,不然体验度很不好,后面再仔细琢磨琢磨。这里顺便再提一下,该工具更加适合用于想要使用 GCC makefile 方式但又苦恼于编写 makefile 文件去进行项目开发的人员,对于 KEIL 转 IAR 工程,我认为还是使用 IAR 自带工具 Tools>Project Converter 会比较快,导入后再替换启动文件和增加一些平台相关的特殊命令符即可完成转换。
四、progen 生成的 makefile 编译及烧录演示视频实验中导入的示例工程为附件所提供的,可以作为 progen Template 使用。在使用工具生成 makefile 后进行 make 编译,然后使用 O-Zone 和 J-Link 工具进行烧录调试。烧录好程序后,开发板的串口会输出调试信息, LED 灯会一直以 1s 为周期持续闪烁。
五、附件内容附件资源包中有以下内容可供参考下载: MM32F0144C6P project_generator 示例软件工程代码包 —— 1. mm32f0144c6p_progen_gpio_blinky.zip
六、参考资源本文创作参阅学习了以下资源,在此声明感谢! https://pypi.org/project/project-generator/https://github.com/project-generator/project_generator/wiki/Homehttps://www.bilibili.com/video/av57977294/
|