调试组件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 可调用函数。
(5)runtime 指令,用于函数执行时间统计功能的开启和关闭,发送: runtime 1,可以开启函数
执行时间统计功能;发送: runtime 0,可以关闭函数执行时间统计功能。函数执行时间统计功
能,默认是关闭的。



发布了294 篇原创文章 · 获赞 381 · 访问量 142万+

猜你喜欢

转载自blog.csdn.net/sinat_20265495/article/details/79522011