嵌入式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配置结果中解析的配置项目, 访问不存在的项目将返回False
IGNORES
- 复制该模块的文件时忽略的项目, 使用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)