当前位置: 首页 > news >正文

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&#xff08;可选&#xff09;2.3 替换 CMake 模板&#xff08;可选&#xff09;2.4 创建 progen 项目 3 总结 1 progen 资源 0&#xff09;简介&#xff1a;progen&#xff08;project-generator&#xff0c;项目生成…...

C语言 —— 图形打印

题目1&#xff1a; 思路&#xff1a; 如果我们要打印一个实心正方形&#xff0c;其实就是一个二维数组&#xff0c;i控制行&#xff0c;j控制列&#xff0c;行列不需要控制&#xff0c;arr[i][j]直接打印星号即可。 对于空心正方形&#xff0c;我们只需要控制行和列的条件&…...

Python基础学习(11)常用模块

文章目录 一、time二、random三、os四、sys五、json补充1&#xff1a;JSON字符串补充2&#xff1a;JSON字符串和字典的区别 六、hashlib Python基础学习(1)基本知识 Python基础学习(2)序列类型方法与数据类型转换 Python基础学习(3)进阶字符串(格式化输出) Python基础学习(4)散…...

嵌入式学习37-TCP并发模型

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

C语言字符函数和字符串函数

前言 今天这篇博客咱们一起来认识一些特殊的函数&#xff0c;在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便字符和字符串&#xff0c;C语言提供了一些库函数&#xff0c;让我们一起看看这些函数都有什么功能吧&#xff01;&#xff01;&#xff0…...

Go语言必知必会100问题-22 空切片与nil切片有区别吗?

空切片与nil切片有区别吗&#xff1f; 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil&#xff0c;而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片…...

【C++进阶】C++多态概念详解

C多态概念详解 一&#xff0c;多态概念二&#xff0c;多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写&#xff08;覆盖&#xff09;和重定义&#xff08;隐藏&#xff09;的区别 三&#xff0c;抽象…...

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…...

前端精准测试调用链路分析

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

Objective-C blocks 概要

1.block的使用 1.1什么是block&#xff1f; Blocks是C语言的扩充功能&#xff1a;带有自动变量&#xff08;局部变量&#xff09;的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块&#xff0c;封装了函数调用及调用…...

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用&#xff08;不推荐&#xff09; 先下载到本地&#xff0c;以.rpm文件名结尾&#xff0c;下载完成后&#xff0c;再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …...

DevOps实战:Docker、Kubernetes与Jenkins的完美融合

DevOps与容器化技术&#xff1a;Docker、Kubernetes和Jenkins 引言 在软件开发领域&#xff0c;DevOps文化和容器化技术已经成为当今最热门的话题之一。DevOps的目标是缩短开发和运维之间的距离&#xff0c;提高软件交付的速度和质量。而容器化技术&#xff0c;如Docker和Kub…...

Python面向对象——程序架构

需求 创建图形管理器 -记录多种图形(圆形、矩形.) --提供计算总面积的方法&#xff0c; 要求:增加新图形&#xff0c;不影响图形管理器 测试: 创建图形管理器&#xff0c;存储多个图形对象。 通过图形管理器&#xff0c;调用计算总面积方法 思路 ​​​​​​​ 代码 # ------…...

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思路&#xff1a; 首先通过两层for循环遍历每一个点&#xff0c;如果这个点为0或者2&#xff08;这个2是什么呢&#xff1f;是在遍历该点以及该点连成的这一片区域中&#xff0c;因为通过深度优先搜索&#xff0c;遍历该点就等于遍历这一片区域&#xff0c;遍历这篇区域中的…...

如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&…...

Nginx反向代理详解

1. 什么是反向代理 反向代理是一种服务器代理的方式&#xff0c;它代理了客户端的请求并将请求转发给后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。在这个过程中&#xff0c;客户端并不直接与后端服务器通信&#xff0c;而是通过反向代理服务器来实现请求转发和…...

【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型&#xff0c;即系统类加载器和自定义类加载器。其中系统类 加载器包括3种&#xff0c;分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...

16. C++标准库

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

JVM内存结构介绍

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

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

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

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;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&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 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日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

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