project generator 简单使用(二)之 CLion 与 AC6
文章目录
- 1 AC6 之于 CLion
- 2 配置 progen
- 3 可执行文件 size 显示优化
- 4 测试
1 AC6 之于 CLion
-
1)在上一篇文章中,我们知道 project generator 通过其 “Write Once, Compile any Tool” (跨工具)的特性,可以让我们使用 Keil5 uVision 优秀的仿真器与编译器 AC6 的同时,享受 CLion 等现代编译器的优秀代码组织能力。在这篇文章中,我们将基于 project generator,让 CLion 可以调用 Keil5 uVision 优秀的编译器 AC6(armclang)。
-
2)资源:
- (1)硬件:基于嘉立创的天空星 STM32F407VET6 开发板
- (2)代码:
- https://gitee.com/luyaocf/demo-jlc_stm32f407_cic.git
- https://gitee.com/luyaocf/demo-jlc_stm32f407_oop.git
- https://gitee.com/luyaocf/calcelf.git
2 配置 progen
-
1)progen(project generator)的基本安装使用可以参考上一篇文章《project generator 简单使用》,这里我们来快速完成准备工作。
-
2)将 STM32F407VET6 的相关配置提供给 progen:
-
(1)使用 STM32CubeMX 随便生成一个名为 stm32f407,但主芯片要选择 STM32F407VET6
-
(2)找到 stm32f407 项目的 stm32f407.uvprojx 文件所在目录,打开命令行,输入以下命令:
progendef create -m stm32f407vetx -t uvision5 -f stm32f407.uvprojx
-
(3)上述命令将在当前目录生成一个 stm32f407vetx.yaml 文件。打开该文件,将其中的 “Manually add core (cortex-mX) instead of this text” 内容替换成 STM32F407VET6 的 “cortex-m4”
-
(4)将 stm32f407vetx.yaml 文件复制到 %PYTHON_HOME%\Lib\site-packages\project_generator_definitions\mcu\st\ 目录下
-
(5)对于其它厂商的芯片,只要他们提供基于 Keil 的 SDK,都可以通过这种方式来生成 progen 的 yaml 配置文件
-
-
3)生成项目的模板配置:
-
(1)在上述提供的 demo-jlc_stm32f407_cic 和 demo-jlc_stm32f407_oop 两个项目的 /records/tools 目录下,有这些模板文件:
- cmakelist_armclang.tmpl 模板文件:用于生成在 CLion 中使用 AC6 编译器的项目;
- cmakelist_gccarm.tmpl 模板文件:用于生成在 CLion 中使用 arm GCC 编译器的项目。
- uvision5_armc6.uvoptx.tmpl 模板文件:用于修改默认的 Keil5 uVision 项目配置(修改自上述的 stm32f407.uvprojx 文件)。
-
(2)选择自己所需的模板文件,这里为 cmakelist_armclang.tmpl,复制到 %PYTHON_HOME%\Lib\site-packages\project_generator\templates 目录。(复制前记得备份,否则一旦出问题就需要重新安装 progen 了)
-
-
4)AC6 之于 cmake 配置:
- (1)AC6 之于 cmake 在 progen 中的工具名为 cmake_armclang,则:
-
- 生成项目时,-t 选项指定的工具名 cmake_armclang
-
- 配置代码的编译、汇编、链接选项时,要在 tool_specific.cmake_armclang.misc.xxx_flags 下
-
- 以上可参考代码的 /records/tools/armclang.yaml
-
- (2)添加环境变量
- (1)AC6 之于 cmake 在 progen 中的工具名为 cmake_armclang,则:
3 可执行文件 size 显示优化
- 1)AC6 的编译结果只提供了代码各个域的大小(如下),不够直观,所以由于 CMake 灵活的可定制化,这里将对结果进行优化显示(源码见上述第三个仓库),可配置展示为百分比或进度条(本来还想实现扇形,然而控制台效果不理想,可能需要用到图形库,遂放弃)。
- 代码参考:OpenOCD 的参数解析与日志部分
Program Size: Code=24796 RO-data=7524 RW-data=4 ZI-data=12404
- 2)使用说明:
calcelf.exe -hcalcelf(Calculate Executable file)
Licensed under GNU GPL v2--help | -h display this help--version | -v display program version--debug | -d set debug level. available options:(-d3)--format | -f set format to print. available options:(percent, progbar)--map | -m set Keil5 uVision .map file <name>--scatter | -s set Keil5 uVision .sct file <name>
-
3)配置:以在 CMake 中使用为例
- 首先需要将 /KEIL_HOME/ARM/ARMCLANG/bin 目录添加到环境变量
- 然后将 calcelf.exe 复制到上述目录,确保其可以在命令行访问到
- 配置完成后,通过在命令行输入 “calcelf.exe -h” 来测试
- 当然,如果不进行环境变量配置,也可以使用绝对路径
- CMake 中的配置已经集成到 /records/tools/cmakelist_armclang.tmpl 文件末尾:
# 8 Calculate Executable file add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${ARMCC_CALCELF} --format=progbar --map="${PROJECT_NAME}.elf.map" --scatter="{{linker_file}}" )
-
4)calcelf.exe 结果展示:
// 默认输出为百分比
calcelf.exe -m jlcsky031_blink.elf.map -s stm32f407.sct Memory Region Used Size Region Size %age UsedRAM: 1640 B 128 KB 1.25%FLASH: 2976 B 512 KB 0.57%// 也可以输出进度条
calcelf.exe -d0 -m jlcsky031_blink.elf.map -s stm32f407.sct -f progbarTotal RW Size ( RW Data + ZI Data) 1640 ( 1.60 KB)
Total ROM Size (Code + RW Data + RO Data) 2976 ( 2.91 KB)[==--------------------------------------------------------------------------------------------------] 1.25% RAM USED[=---------------------------------------------------------------------------------------------------] 0.57% ROM USED
4 测试
- 1)生成项目:
progen generate -t cmake -v -p jlcsky031_blink # 生成 CMake 项目 progen generate -t cmake_armclang -v -p jlcsky031_blink # 生成 uVision5 项目 progen generate -t uvision5_armc6 -v -p jlcsky031_blink # 生成 CMake AC6 项目