STM32-USMART
一、为什么需要 USMART
嵌入式开发中,很多函数需要在不同参数下反复验证,例如:
修改 PWM 占空比。
读取传感器数据。
设置阈值参数。
执行 Flash 擦写或读取。
查询外设状态。
调整控制算法参数。
如果每次修改参数都通过代码重新编译、烧录和查看结果,调试成本会很高。
USMART 将串口交互和函数调用结合起来,使开发者可以在串口工具中直接输入函数名和参数,快速调用目标函数。它的定位可以理解为一个轻量级的嵌入式命令行调试组件。
二、USMART 的特点
USMART 的主要特点如下:
| 特点 | 说明 |
|---|---|
| 占用资源少 | 最小约占用 4 KB Flash 和 72 B SRAM |
| 调用普通函数 | 可管理绝大多数用户直接编写的函数 |
| 参数类型丰富 | 支持十进制/十六进制整数、字符串、函数指针等参数 |
| 支持返回值显示 | 可以显示函数执行后的返回结果,并设置显示格式 |
| 支持运行时间统计 | 可测量目标函数的执行时间 |
| 串口交互方便 | 输入命令后即可完成函数调用和结果查看 |
需要注意,USMART 适合调试阶段使用。正式产品中应根据安全性和资源占用情况决定是否保留。
三、USMART 的工作原理
USMART 的核心流程是“字符串解析 + 函数匹配 + 函数指针调用”。
串口接收用户输入 | v 解析函数名和参数 | v 在函数表中匹配函数名 | +-- 未匹配 -> 丢弃输入并输出错误信息 | v 通过函数指针调用目标函数 | v 输出函数返回值和执行结果例如,用户在串口工具中输入一个符合规则的函数调用表达式:
目标函数名(参数1, 参数2)USMART 会解析输入字符串,检查函数名是否已经注册,并将参数转换为对应类型。匹配成功后,组件通过函数指针执行目标函数。
这种机制的关键在于:串口输入本质上是字符串,USMART 需要完成字符串比较、参数分割、类型转换和函数分发。
四、USMART 组件组成
USMART 通常由以下文件组成:
| 文件 | 作用 |
|---|---|
usmart.c/.h | 核心文件,负责命令处理和与外部模块交互 |
usmart_config.c | 函数管理文件,用于添加需要由 USMART 调用的用户函数 |
usmart_port.c/.h | 移植文件,用于适配串口、定时器等硬件资源 |
usmart_str.c/.h | 字符串处理文件,负责字符串转换和参数获取 |
1. 核心扫描函数
USMART 的核心扫描函数为:
void usmart_scan(void);该函数用于检查并解析串口接收的数据,完成函数调用和系统命令处理。
通常需要在主循环、任务循环或专门的命令处理任务中周期性调用usmart_scan()。
while (1) { usmart_scan(); /* 其他应用任务 */ }如果没有调用扫描函数,即使串口已经收到数据,USMART 也不会执行命令。
五、USMART 移植步骤
将 USMART 移植到自己的工程中,可按以下流程进行。
1. 获取并添加组件文件
将 USMART 的全部组件文件添加到工程中,并配置好头文件搜索路径。
通常需要添加:
usmart.c/.h usmart_config.c usmart_port.c/.h usmart_str.c/.h2. 适配调试串口
USMART 依赖串口完成命令输入和结果输出,因此需要先保证调试串口工作正常。
适配时重点检查:
串口波特率是否与上位机一致。
串口接收是否能获得完整的一行命令。
串口发送函数是否可正常输出字符串。
回车换行符是否能正确识别。
3. 适配定时器
如果需要使用函数运行时间统计功能,还需要适配定时器。
定时器用于记录函数执行前后的计数值,再计算时间差。选择计时定时器时,应注意:
定时器时钟频率要明确。
计数周期应覆盖待测函数的最长执行时间。
需要考虑计数器溢出。
中断频繁或系统调度会影响测量结果。
4. 添加需要执行的函数
在usmart_config.c中添加需要由 USMART 管理的函数。
建议优先注册这类函数:
读取状态或传感器数据的查询函数。
用于设置参数的接口函数。
自检和诊断函数。
外设初始化或重新配置函数。
便于定位问题的测试函数。
不建议直接注册高风险函数,例如复位系统、擦除整片 Flash、修改关键时钟配置等。即使需要调试,也应增加额外确认机制。
5. 烧录并通过串口交互
完成移植后,打开串口工具,按照函数定义中的格式输入函数名和参数,并以回车结束命令。
USMART 解析成功后会执行函数并输出返回结果;输入格式错误、函数不存在或参数不匹配时,则会输出错误信息。
六、USMART 系统命令
USMART 内置常用系统命令,便于查看帮助信息、函数列表、参数格式和运行时间。
| 命令 | 作用 |
|---|---|
? | 获取帮助信息 |
help | 获取帮助信息 |
list | 查看可调用的函数列表 |
id | 查看可用函数的 ID 列表 |
hex 数字 | 将参数按十六进制显示 |
dec 数字 | 将参数按十进制显示 |
runtime 1 | 开启函数运行时间统计 |
runtime 0 | 关闭函数运行时间统计 |
常见使用顺序:
help list runtime 1 目标函数名(参数) runtime 0其中,list适合在忘记函数名称时查看可用接口,runtime 1适合分析某个函数是否耗时过长。
