project generator 简单使用(二)之 CLion 与 AC6

devtools/2024/9/24 20:06:49/

文章目录

    • 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,则:
        1. 生成项目时,-t 选项指定的工具名 cmake_armclang
        1. 配置代码的编译、汇编、链接选项时,要在 tool_specific.cmake_armclang.misc.xxx_flags 下
        1. 以上可参考代码的 /records/tools/armclang.yaml
    • (2)添加环境变量

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 项目
    

http://www.ppmy.cn/devtools/116647.html

相关文章

Vue3:$refs和$parent实现组件通信

在Vue3中&#xff0c;refs和refs和parent是用于组件间通信的重要机制 一.$refs 1.操作子组件数据 一旦获取到子组件的实例&#xff0c;父组件可以修改子组件暴露的变量值&#xff0c;实现父子组件间的直接数据交换。 2.批量处理子组件 $refs可以用于同时获取多个子组件的…

Vue相关

Vue2 组件传递事件&#xff1a; props $emit sync v-model $parent / $children $parent获取父组件的实例&#xff0c;任意调用父组件的方法&#xff0c;修改父组件的数据 ref 父组件获取 子组件 实例&#xff0c;任意调用子组件的方法获取子组件的属性 provide / injectp…

【Linux】环境变量

一、引入环境变量 1.1 引入环境变量 main函数是有参数的&#xff0c;该参数就用来接收命令行参数的。当我们在执行文件的过程中&#xff0c;我们可以输入一些选项。 1.1.1 参数说明 argc&#xff08;argument count&#xff09;&#xff1a;表示命令行参数的数量&#xff0c…

c++ pair

C中的pair是一个模板类&#xff0c;用来存储两个不同类型的对象。它位于<utility>头文件中&#xff0c;并定义在std命名空间中。 pair的定义如下&#xff1a; template <class T1, class T2> struct pair {using first_type T1;using second_type T2;T1 first;…

单片机学到什么程度才可以去工作?

说实话&#xff0c;10几年前&#xff0c;我自学单片机转行的时候&#xff0c;也是一头雾水&#xff0c;也是一边苦苦挣扎&#xff0c;一边迷茫的状态。 硬件、软件、编程...样样都需要学&#xff0c;连从哪儿开始都不知道&#xff0c;每次看到那些密密麻麻的电路图和代码&#…

c语言中“函数指针”

变量有地址&#xff0c;数组有地址&#xff0c;那么函数是否有地址呢&#xff1f; 有 int Add(int x,int y){ return xy; } int main() { pritnf("%p\n",&Add); pritnf("%p\n",Add); //&函数名和函数名都是函数的地址&#xff0c;没…

解决 Ubuntu 18.04 下与 TIFFField 和 Anaconda 冲突导致的库加载问题

在 Ubuntu 18.04 系统上&#xff0c;我在安装完ROS后&#xff0c;启动具有 GUI 的软件&#xff08;如 RViz 和 Gazebo&#xff09;时遇到了一个问题&#xff1a;每次尝试启动这些软件时&#xff0c;终端中都会报错&#xff0c;错误信息类似如下&#xff1a; rviz: relocation …

【资源三号卫星】

资源三号卫星 资源三号卫星&#xff08;ZY-3&#xff09;&#xff0c;作为中国第一颗民用高分辨率光学传输型测绘卫星&#xff0c;于2012年1月9日成功发射&#xff0c;正式拉开了我国在高分辨率对地观测领域自主发展的序幕。以下是对资源三号卫星的详细介绍&#xff1a; 基本…