嵌入式STM32软件模块集
采用统一上层头文件来统一动态内存/时间/延时函数,并实现可视化参数配置
Important
主要是给stm32项目用的,部分模块依赖hal库
Note
标 * 的为自己写的模块,标 x 为非开源第三方库,其他修改自开源库,来源地址已列出
根目录文件 /
| 根目录文件 | 功能 |
|---|---|
| .clang-format | 格式化配置文件 |
| modules.h | 模块统一头文件 |
| tool.py | 模块配置工具 |
算法模块 /algorithm
| Algorithm | 算法 | src | 备注 | SHA |
|---|---|---|---|---|
| cmsis_dsp | CMSIS-DSP(Src) | link | 源码形式 | 03fa0e5 |
| libcrc | CRC计算库 | link | abe136a | |
| pid | 通用PID控制器 | * | ||
| quaternion | 四元数和IMU姿态估计 | link | 未测试 | bd77afd |
通信模块 /communication
| Communication | 通信 | src | 备注 | SHA |
|---|---|---|---|---|
| CherryUSB | Cherry USB | link | 9cb992b | |
| lwpkt | 轻量级数据包 | link | 6a82dab | |
| minmea | GPS NMEA解析器 | link | 450ad08 | |
| modbus | Modbus协议 | link | 0745519 | |
| TinyFrame | 另一个轻量级数据包 | link | a29167a | |
| xymodem | X/YMODEM协议 | link | f7b988d |
数据结构模块 /datastruct
| DataStruct | 数据结构 | src | 备注 | SHA |
|---|---|---|---|---|
| btree | B树 | link | c0cfc4e | |
| cstring | C字符串 | link | 88e021b | |
| ctl | 类型安全C模板容器库 | link | d314c08 | |
| dlist | 双向链表 | link | 23faa20 | |
| fifofast | 纯头文件快速FIFO | link | 196edda | |
| hashmap | 哈希表 | link | 1c13992 | |
| json | JSON解析 | link | 3d0e877 | |
| lfbb | 二分无锁缓冲区 | link | 8c24b34 | |
| lfifo | 通用环形缓冲区 | * | 比lwrb更高效 | |
| linux_list | Linux-like链表 | link | 452262e | |
| lwrb | 轻量环形缓冲区 | link | b32c645 | |
| pqueue | 优先队列 | link | 2bb5600 | |
| sds | 简单动态字符串 | link | a9a03bb | |
| struct2json | C结构体与JSON快速互转库 | link | 4f1fdc9 | |
| udict | 通用哈希字典 | * | 基于uthash | |
| ulist | 通用内存连续列表 | * | ||
| uthash | 基于宏的可嵌入哈希表 | link | 619fe95 |
调试模块 /debug
| Debug | 调试 | src | 备注 | SHA |
|---|---|---|---|---|
| benchmark | CoreMark基准测试 | link | d5fad6b | |
| cm_backtrace | hardfault堆栈回溯 | link | 6013293 | |
| RTT | Segger-RTT 调试模块 | link | ||
| log | 纯头文件日志库 | * | ||
| minctest | 简易单元测试 | link | 0ab5834 |
驱动模块 /driver
| Driver | 驱动 | src | 备注 | SHA |
|---|---|---|---|---|
| bq25890 | BQ2589x充电芯片 | link | ade0e3c | |
| ee24 | 24xx EEPROM库 | link | 92816a7 | |
| key | 通用按键驱动 | * | 支持多种事件 | |
| motor | 直流电机闭环驱动 | * | ||
| paj7620u2 | PAJ7620U2手势识别 | * | ||
| sc7a20 | SC7A20加速度计 | * | ||
| sh2 | SH2 Sensorhub协议 | link | b514b1e | |
| spif | SPI Flash通用驱动 | link | c0f3ba2 | |
| stepper | 步进电机驱动 | * | ||
| vl53l0x | VL53L0X激光测距 | link | 非官方库 | 04891c2 |
| ws2812_spi | WS2812灯带DMA-SPI驱动 | * |
图形模块 /graphics
| Graphics | 图形 | src | 备注 | SHA |
|---|---|---|---|---|
| easy_ui | 单色屏UI库 | link | 大幅魔改 | 691bdb4 |
| hagl | HAL图形库 | link | 8281a8a | |
| lvgl | LittlevGL图形库 | link | 3aac8cc | |
| lvgl_gaussian_blur | LVGL高斯模糊效果 | link | cpp->c | |
| lvgl_pm | LVGL页面管理器 | link | 825df21 | |
| u8g2 | U8g2图形库 | link | 3e86287 | |
| ugui | uGUI图形库 | link | ce0bccb | |
| virtual_lcd | 虚拟LCD | * | 包含上位机 |
外设模块 /peripheral
| Peripheral | 外设 | src | 备注 | SHA |
|---|---|---|---|---|
| board_i2c | 板级I2C包装层 | * | ||
| board_led | 板级LED包装层 | * | ||
| ee | 内置flash读写库 | link | 0b39520 | |
| i2c_salve | LL库I2C从机 | * | ||
| ll_i2c | LL库I2C | * | 包含中断/轮询 | |
| mr_library | 轻量级设备读写接口 | link | ||
| sw_i2c | 软件I2C | link | c595a39 | |
| sw_spi | 软件SPI | x | ||
| uni_io | 数据通信功能包 | * |
存储模块 /storage
| Storage | 存储 | src | 备注 | SHA |
|---|---|---|---|---|
| easyflash | 轻量级Flash数据库 | link | a67fffc | |
| littlefs | LittleFS | link | d01280e | |
| MiniFlashDB | 轻量级Flash数据库 | link | 魔改 | 99bf7aa |
系统模块 /system
| System | 系统 | src | 备注 | SHA |
|---|---|---|---|---|
| dalloc | 动态指针管理内存分配器 | link | da14f0f | |
| heap4 | FreeRTOS堆4 | link | ||
| klite | 基础实时内核 | link | 轻量高性能,推荐 | |
| lwmem | 轻量级内存管理 | link | 性能远不如heap4 | 2b08317 |
| rtthread_nano | RT-Thread Nano | link | 9177e3e | |
| s_task | 精简的协程实现 | link | 需要实现栈切换 | 609835c |
| scheduler | 多功能任务调度器 | * | 内有使用说明 | |
| scheduler_lite | 轻量级任务调度器 | * |
工具模块 /utility
| Utility | 工具 | src | 备注 | SHA |
|---|---|---|---|---|
| cot_menu | 轻量级菜单框架 | link | 抽象菜单 | |
| embedded_cli | 嵌入式命令行 | link | 魔改 | 8734a57 |
| lwprintf | 轻量级无缓冲区printf | link | 1d3ad53 | |
| perf_counter | PerfCounter性能统计/时基库 | link | 必备品 | 82a80d9 |
| ryu | 浮点数转字符串 | link | 5056abc | |
| term_table | 动态终端表格工具 | * | 仅debug使用 | |
| TimeLib | UNIX时间库 | link | 8bdf963 | |
| xv | 类JavaScript的字符串解析器 | link | b46851f | |
| tiny_regex | 简易正则解析器 | link | 无捕获组 | 9d5f5d8 |
| incbin.h | 二进制文件嵌入 | link | 6e576ca | |
| macro.h | 通用宏 | * |
Warning
可能会对自己编写的模块进行较大的API变动以满足个人需求, 不保证向后兼容
Kconfig- Kconfig配置文件, 用于配置代码的宏定义, 开关和设置各种功能, 遵循Linux内核的Kconfig规范Mconfig- 基于Kconfig的配置, 描述生成项目的模块文件夹时所需复制的模块文件, 如不存在则复制完整文件夹
Mconfig 语法
Mconfig文件实际上是一个python脚本, 继承完整的tool.py运行环境
其中有四个特殊变量和三个特殊函数:
CONFIG- 从Kconfig配置结果中解析的配置项目, 访问不存在的项目将返回FalseIGNORES- 复制该模块的文件时忽略的项目, 使用glob匹配DST_PATH- 本模块文件夹的目标路径SRC_PATH- 本模块文件夹的源路径def DEBUG(msg: str)- 输出调试信息 (--debug)def WARNING(msg: str)- 输出警告信息def ERROR(msg: str)- 输出错误信息并退出
下面是一个简单的例子:
if CONFIG.DISABLE_MODULE_A: # 也支持.get()方法来定义不存在时的默认返回值
IGNORES += "module_a.*"
if CONFIG.DISABLE_SUB_MODULES:
DEBUG(f"SUB_MODULES: {CONFIG.SUB_MODULES}")
if "B" in CONFIG.SUB_MODULES:
IGNORES += ["module_b1.*", "module_b2.*"]
IGNORES += "module_c*.*"
IGNORES += "test_*_module.*"配置工具 tool.py
Ellu@ELLU /home/ellu/git/EmbeddedModules master ≣ +0 ~0 -0
❯ python ./tool.py --help
usage: tool.py [-p PROJECT_DIR] [-m] [-s] [-n] [-u] [-d MODULE_DIRNAME] [--debug]
optional arguments:
-h, --help show this help message and exit
-p PROJECT_DIR, --project-dir PROJECT_DIR
Specify the directory for working project, default is current directory
-m, --menuconfig Run menuconfig in project dir
-g, --guiconfig Run menuconfig with GUI
-s, --sync Sync latest module files without menuconfig
-rs, --reverse-sync Sync newer files from project to module repo
-ns, --no-sync Skip syncing latest module files after menuconfig
-n, --newmodule Create a new module
-u, --update Pull the latest version of this toolset from github
-a, --analyze Analyze module dependencies
-c, --check Check for updates of modules
-d MODULE_DIRNAME, --module-dirname MODULE_DIRNAME
Specify the directory name for generated modules, default is 'Modules'
-fc, --force-copy Force copy files even if destination is newer
-gm, --gen-makefile Generate makefile for source files
--debug Enable debug output-
在命令行中配置并更新项目模块文件夹
python tool.py -p /path/to/project -m
-
在GUI中配置并更新项目模块文件夹 (需要Python环境支持tkinter)
python tool.py -p /path/to/project -g
-
使用已有配置从仓库同步最新模块文件
python tool.py -p /path/to/project -u -s
-
在仓库中创建新模块
python tool.py -n
-
列出所有模块的依赖关系 (可用于辅助编写Kconfig)
python tool.py -a
-
检查所有模块的更新情况 (比较本文件记录的SHA和仓库中最新提交的SHA)
python tool.py -c
-
冻结生成文件夹中的某个模块 (如针对项目修改了模块源码时)
在生成文件夹 (如
Modules) 的根目录创建一个.Mfreeze文件, 写入要冻结的模块文件夹名, 每行一个 -
有效的环境变量
MOD_PROJECT_DIR- 指定项目目录 (命令参数优先)MOD_MODULE_DIRNAME- 指定生成模块文件夹的目录名 (命令参数优先)
- 用kconfig替代modules_conf.template.h
- 配置工具自动复制模块文件夹
- 允许配置Mconfig来指定添加项目
- 为所有自己写的模块编写README
MIT (For self-written modules only)