调试组件USMART的学习
1. 简述
USMART 是由 ALIENTEK 开发的一个灵巧的串口调试互交组件,通过它你可以通过串口
助手调用程序里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字 ( 10/16进制, 支持负数)、字符串、函数入口地址等作为参数),单个函数最多支持 10 个输入参数,并支持函数返回值显示。
2. USMART功能简述
USMART 的功能类似 linux 的shell( RTT的finsh 也属于此类)。它最主要的功能就是通过串口调用单片机里面的函数,并执行,可以帮助我们调试代码。对其进行简易改动,也可以设计成单片机系统的指令系统。
USMART主要功能有:
l 可以调用绝大部分用户直接编写的函数。
l 支持参数类型多(数字(包含10/16进制)、字符串、函数指针等)。
l 支持函数返回值显示。
l 支持参数及返回值格式设置。
l 支持函数执行时间计算。
3. 实现机制
USMART组件主要包括五部分:一是输入和输出接口,主要是串口进行交互和信息转存;二是信息的解析,在转存信息提炼出函数和参数,并按格式贮存;三是函数执行,即执行输入的函数;四是控制USMART运行的机制;五是单片机内的函数列表信息,作为比对使用。
USMART运行的机制实现1.何时获得信息;2.获得必要信息;3,何时按信息执行,如何转到信息执行的函数中去。
何时获取信息:使用定时扫描的方式,使用一个定时器,在定时中断时扫描缓存空间;
获得必要信息:在串口接收中,将上位机输入的信息存到缓存空间,此时得到原始信息;在定时扫描时,将缓存空间中原始信息解析成需要的具体信息;
何时按信息执行:在解析完成后,将具体信息与函数列表信息进行比对,得到需要执行的函数及参数,采用函数指针调用的方式调用相应的执行函数。
4. 数据结构
4.1 USMART控制管理数据结构
根据功能要求,要实现USMART控制管理,需要设计一个结构来控制usmart的执行。其变量包含信息应包括:
(1) 组件执行的必要函数,如组件初始化、信息解析、信息比对、函数执行等;
(2) 调试函数的名称、参数数量、参数类型;
(3) 其他辅助变量;
(4) 附加功能,如运行时间统计等。
usmart控制管理器定义的结构如下:
struct_m_usmart_dev
{
struct _m_usmart_nametab *funs; //函数名指针
void (*init)(u8); //初始化
u8 (*cmd_rec)(u8*str); //识别函数名及参数
void (*exe)(void); //执行
void (*scan)(void); //扫描
u8 fnum; //函数数量
u8 pnum; //参数数量
u8 id; //函数id
u8 sptype; //参数显示类型(非字符串参数):0,10进制;1,16进制;
u16 parmtype; //参数的类型
u8 plentbl[MAX_PARM]; //每个参数的长度暂存表
u8 parm[PARM_LEN]; //函数的参数
u8 runtimeflag; //0,不统计函数执行时间;1,统计函数执行时间,注意:此功能必须在USMART_ENTIMX_SCAN使能的时候,才有用
u32 runtime; //运行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
};
其在头文件中即初始化。
//函数控制管理器初始化
//得到各个受控函数的名字
//得到函数总数量
struct_m_usmart_dev usmart_dev=
{
usmart_nametab, //指向执行函数列表。。。。
usmart_init,
usmart_cmd_rec,
usmart_exe,
usmart_scan,
sizeof(usmart_nametab)/sizeof(struct_m_usmart_nametab),//函数数量
0, //参数数量
0, //函数ID
1, //参数显示类型,0,10进制;1,16进制
0, //参数类型.bitx:,0,数字;1,字符串
0, //每个参数的长度暂存表,需要MAX_PARM个0初始化
0, //函数的参数,需要PARM_LEN个0初始化
};
4.2 执行函数列表
单片机内的作为比对函数列表信息的贮存,设计一个列表。每项包括两个要素,一是函数的指针变量,指向函数的执行;一是函数名,用来与信息进行比对。
struct_m_usmart_nametab
{
void* func; //函数指针
const u8* name; //函数名(查找串)
};
在结构数组里将需要调试的函数的两类信息。
struct_m_usmart_nametab usmart_nametab[];
数组中初始化如:
struct_m_usmart_nametab usmart_nametab[]=
{
…………….
(void*)LCD_Clear,"voidLCD_Clear(u16 Color)",
…………….
};
5.补充:
使用USMART 调用的函数,必须将文件添加到usmart_config.c:
只要把函数所在头文件添加进来,并把函数名按上图所示的方,增加即可。
最后,要在串口助手里通过usmart组件调试函数,
(1)id,该指令用于获取各个函数的入口地址;
(2)?和 help,这两个指令的功能是一样的。发送该指令后,串口将打印 usmart 使用的帮助信
息;
(3)hex 和 dec,这两个指令可以带参数,也可以不带参数。当不带参数的时候, hex 和 dec 分
别用于设置串口显示数据格式为 16 进制/10 进制。当带参数的时候, hex 和 dec 就执行进制转换,
比如输入: hex 1234,串口将打印: HEX:0X4D2,也就是将 1234 转换为 16 进制打印出来。又比如
输入: dec 0X1234,串口将打印: DEC:4660,就是将 0X1234 转换为 10 进制打印出来。
(4)list,该命令用于打印所有 usmart 可调用函数。执行时间统计功能;发送: runtime 0,可以关闭函数执行时间统计功能。函数执行时间统计功
能,默认是关闭的。