project generator 简单使用
文章目录
- 1 progen 资源
- 2 使用简介
- 2.1 安装
- 2.2 添加 target(可选)
- 2.3 替换 CMake 模板(可选)
- 2.4 创建 progen 项目
- 3 总结
1 progen 资源
-
0)简介:progen(project-generator,项目生成器)是 ARM 编写的,基于 Python 的,让我们的项目跨工具的神器。所谓跨工具,类比一下 Java 的跨平台,即代码编写完成后,可以生成为基于 uVision、IAR、Makefile(cmake)等编译工具的项目。
-
1)官网:
- progen: https://pypi.org/project/project-generator/
- progendef: https://github.com/project-generator/project_generator_definitions
-
2)官方示例:
- https://github.com/project-generator/project_generator_frdm_boards_example
- https://github.com/project-generator/project_generator_mbed_examples
-
3)本例:
- 学习 B 站 UP 主 “江协科技” STM32 视频(https://jiangxiekeji.com/)
- 基于光子物联的 STM32G431CBT6 开发板
- ll 库代码:https://gitee.com/luyaocf/demo-jxtech_stm32g4_ll.git
2 使用简介
-
1)progen 的几个组件:
-
(1)Record:基于 YAML 语法的配置文件,有 3 种:
- 项目列表文件 projects.yaml,声明配置项、模块、项目等
- 项目定义文件,即主工程文件,其中定义工程名称,开发板,等
- 模块文件,定义模块的头文件与源文件
-
(2)Tool:泛指嵌入式开发工具,如 uVision、IAR、CoIDE、Makefile(gcc/armcc/cmake)等等
-
(3)Target:泛指 mcu。其内部指定 MCU 的 RAM、ROM、CPU 内核、SFD、烧录算法等令牌。progen 根据 target 生成指定 tool 的工程文件,如 Keil5 的 .uvprojx、IAR 的 .ewp 等
-
-
2)progen 的几个命令:
-
(1)init:将当前项目初始化为 progen 项目。当你已经有一个 uVision5 项目时,可以在其根目录直接使用该命令,将该项目变成一个 progen 项目。然而就像 PCB 中的自动布线一样,可以使用但不要完全使用,因为我们想要的不是 progen <-> uVision,而是 progen -> uVision、IAR、CMake 等等
-
(2)generate:生成指定 Tool 的项目。当我们有一个 progen 项目时,可使用该命令生成基于 Tool 的任何工程
-
(3)clean:清理生成的项目。
-
(4)list:列出当前 progen 支持的 targets(MCU), tools(IDE 或 toolchain) 或工程
-
(5)build:构建指定工程。
-
2.1 安装
-
1)安装 Python
-
2)安装 progen
pip install project-generator
2.2 添加 target(可选)
-
1)progen 安装完成后,在目录 %PYTHON_HOME%\Lib\site-packages\project_generator_definitions\mcu 下,按照厂商列出了 progen 支持的所有 mcu target。但总有些不常用的 mcu 尚未支持,需要我们手动创建 target。比如我这里使用的 STM32G431CBT6 芯片,progen 尚未支持。
-
2)幸运的是我们不用手动编写 target 配置文件,progen 提供了 progendef 命令来帮我们自动生成添加 target 的配置文件:
-
(1)使用 STM32CubeMX 生成一个基于 STM32G431CBT6 的 uVision5 项目,如 STM32G431CBT6.uvprojx。(当然,其它厂商的 mcu 只要提供了基于 Keil uVision5 的项目都可以。事实上,progen 还支持基于 IAR 项目的生成。)
-
(2)找到 STM32G431CBT6.uvprojx 所在目录,在命令行中执行以下命令:
progendef create -m stm32g431cbtx -t uvision5 -f STM32G431CBT6.uvprojx
-
(3)将生成的 stm32g431cbtx.yaml 文件复制到
%PYTHON_HOME%\Lib\site-packages\project_generator_definitions\mcu\st\ 目录下,然后我们在生成 uVision5 项目时即可引用到它。
-
2.3 替换 CMake 模板(可选)
-
1)progen 中使用的 cmake 版本为 3.6,而 STM32CubeMX 生成的代码中 cmake 版本最新为 3.27(于 2024.3.8),所以这里更新一下 progen 的 cmake 模板。
-
2)首先尝试在项目中指定 cmake 模板,发现无法生效。最终发现:
- (1)首先找到 %PYTHON_HOME%\Lib\site-packages\project_generator\templates 目录
- (2)备份 cmakelist_gccarm.tmpl 文件
- (3)将本项目 records/tools/cmakelist_gccarm.tmpl 文件替换该文件
-
3)对比过后,新版本的 cmake 编译速度提升了,配置内容清晰,生成的目标文件减少,使用确实更加方便。
2.4 创建 progen 项目
-
1)ARM 官方的 DAPLink 项目是基于 progen 应用的一个项目,我们可以参考它来使用。
-
2)我们可以先使用 STM32CubeMX 生成 uVision5 项目和 CMake 项目,然后分别在两个项目的根目录执行 progen init 命令来分别生成 progen 项目,最后提取其中的配置文件并组装成我们需要的项目。
-
3)配置完成后,便可以通过以下命令来生成项目了:
progen generate -t cmake -v -p jxtech031_blink # 生成 CMake 项目 progen generate -t uvision5 -v -p jxtech031_blink # 生成 uVision5 项目
-
4)项目根目录下提供了一个 generate.bat 批处理脚本,用来自动生成项目:
-----------------------------------------------------------------------------------project generator -----------------------------------------------------------------------------------code project code project [031] jxtech031_blink [091] jxtech091_usart [032] jxtech032_waterlight [092] jxtech092_usart_recv [033] jxtech033_buzzer [093] jxtech093_usart_hex [034] jxtech034_keyled [094] jxtech094_usart_txt [035] jxtech035_ldr [101] jxtech101_i2c_mpu6050 [041] jxtech041_oled [102] jxtech102_i2c_mpu6050 [051] jxtech051_exti [103] jxtech103_i2c_24cxx [061] jxtech061_timer_it [111] jxtech111_spi_w25qxx [062] jxtech062_timer_externalclk [112] jxtech112_spi_w25qxx [063] jxtech063_timer_pwmled [113] jxtech113_spi_tftlcd [064] jxtech064_timer_pwmservo [121] jxtech121_bkp [065] jxtech065_timer_pwmmotor [122] jxtech122_rtc [066] jxtech066_timer_inputcapture1 [131] jxtech131_systemclk [067] jxtech067_timer_inputcapture2 [132] jxtech132_mode_sleep [068] jxtech068_timer_encoderspeed [133] jxtech133_mode_stop [071] jxtech071_adc_singlechannel [134] jxtech134_mode_standby [072] jxtech072_adc_multichannel [135] jxtech135_mode_shutdown [080] jxtech080_memory [141] jxtech141_iwdg [081] jxtech081_dma [142] jxtech142_wwdg [082] jxtech082_dma_adc [151] jxtech151_flash[1] generate all [2] clean all [0] exitInput the code:
- 要生成多个工程时,可以输入多个编号,以空格分隔。
3 总结
-
1)使用 progen 带来的几点好处:
-
(1)跨工具。对于一个代码仓库的协作开发来说,无疑是极大的方便,它可以满足习惯于不同开发工具的协作者。
-
(2)破除木桶效应。如果你还在纠结 Keil 的丑界面,CLion 基于 OpenOCD 的基本调试,ARM GCC 的编译效率,那么 progen 值得拥有。它可以让我们可以使用 Keil uVision 方便的调试功能 + CLion 的代码提示功能 + ARMCLANG 强大的代码编译能力。
-
(3)减少代码量。当我们学习一个教程时,往往会按照章节创建对应的项目,无疑会产生非常多的冗余源文件,比如 STM32 的 HAL 库文件。使用 progen 可以在 projects.yaml 定义所有的项目,然后将 HAL 库文件声明为模块并复用它。
-
-
2)不建议使用的情况:
- 单个项目。如果只有单个项目,即使需要跨工具开发,使用 STM32CubeMX 会比使用 progen 更有性价比。
相关文章:
project generator 简单使用
文章目录 1 progen 资源2 使用简介2.1 安装2.2 添加 target(可选)2.3 替换 CMake 模板(可选)2.4 创建 progen 项目 3 总结 1 progen 资源 0)简介:progen(project-generator,项目生成…...

C语言 —— 图形打印
题目1: 思路: 如果我们要打印一个实心正方形,其实就是一个二维数组,i控制行,j控制列,行列不需要控制,arr[i][j]直接打印星号即可。 对于空心正方形,我们只需要控制行和列的条件&…...
Python基础学习(11)常用模块
文章目录 一、time二、random三、os四、sys五、json补充1:JSON字符串补充2:JSON字符串和字典的区别 六、hashlib Python基础学习(1)基本知识 Python基础学习(2)序列类型方法与数据类型转换 Python基础学习(3)进阶字符串(格式化输出) Python基础学习(4)散…...

嵌入式学习37-TCP并发模型
TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来 资源开销 2.能够实现的 并发量 比较有限 2.IO模型: 1.阻塞IO: 没有…...

C语言字符函数和字符串函数
前言 今天这篇博客咱们一起来认识一些特殊的函数,在编程的过程中,我们经常要处理字符和字符串,为了方便字符和字符串,C语言提供了一些库函数,让我们一起看看这些函数都有什么功能吧!!࿰…...
Go语言必知必会100问题-22 空切片与nil切片有区别吗?
空切片与nil切片有区别吗? 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil,而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片…...

【C++进阶】C++多态概念详解
C多态概念详解 一,多态概念二,多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写(覆盖)和重定义(隐藏)的区别 三,抽象…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 2、线条平滑曲面但有间隔
环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata imp…...

前端精准测试调用链路分析
精准测试在评估需求的测试范围时,需要评估一下代码的影响范围,这个范围有两部分:一是需求直接修改的代码;二是修改代码影响到的功能模块。代码影响到的功能一般是通过调用链路分析来实现的,java和kotlin代码可以由java…...

Objective-C blocks 概要
1.block的使用 1.1什么是block? Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块,封装了函数调用及调用…...

Linux操作系统-07-Linux安装应用
一、使用rpm安装应用(不推荐) 先下载到本地,以.rpm文件名结尾,下载完成后,再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …...
DevOps实战:Docker、Kubernetes与Jenkins的完美融合
DevOps与容器化技术:Docker、Kubernetes和Jenkins 引言 在软件开发领域,DevOps文化和容器化技术已经成为当今最热门的话题之一。DevOps的目标是缩短开发和运维之间的距离,提高软件交付的速度和质量。而容器化技术,如Docker和Kub…...

Python面向对象——程序架构
需求 创建图形管理器 -记录多种图形(圆形、矩形.) --提供计算总面积的方法, 要求:增加新图形,不影响图形管理器 测试: 创建图形管理器,存储多个图形对象。 通过图形管理器,调用计算总面积方法 思路 代码 # ------…...
springboot单体项目链路日志跟踪及接口耗时
最近接触一个新的传统项目,在联调过程中,查看日志特别不方便,既无trackId,即无接口耗时,所以写了该博客。话不多说,直接上代码 1、实体类user package com.yk.domain;import lombok.Data;@Data public class User {private Long id;private String username;private St…...

力扣hot---岛屿数量
dfs思路: 首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的…...

如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源
文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&…...
Nginx反向代理详解
1. 什么是反向代理 反向代理是一种服务器代理的方式,它代理了客户端的请求并将请求转发给后端服务器,然后将后端服务器的响应返回给客户端。在这个过程中,客户端并不直接与后端服务器通信,而是通过反向代理服务器来实现请求转发和…...

【Android】 ClassLoader 知识点提炼
1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类 加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...

16. C++标准库
C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…...

JVM内存结构介绍
1. 什么是JVM 我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装。 Java 代码为什么可以在 Windows…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...