首先感谢正点原子的STM32单片机的教程把我带入到STM32的世界。在学习的过程也得到原子大侠的多次指点,再次对原子表示谢谢。今天学习了USMART调试组件。USMART是一个调试用的组件,可以增强我们的串口调试助手的威力。它主要是能够调用单片机内的函数,并根据你给的参数进行执行。
该组件的执行过程是,通过一个定时器,定时一个时间间隔,每一次时间到时就就调用串口扫描函数,看是否有命令或函数发送过来。
1,调用usmart_scan(void)。在函数中对发送来的死函数,还是系统命令进行判断。
2,如果是函数,活的相关信息后就调用usmart_exe()执行。
3,如果是命令,根据不同的命令调用usmart_sys_cmd_exe()命令处理函数进行处理。
以上三步就是该组件的流程。在该流程中充斥着很多C语言的语法,指的我学习。下面就举例说明:
第一:
usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum,&rval);//得到本地函数名,及参数个数 ;他的第一个参数就是一个三级结构体,这里我依次分解:
这里usmart_dev是一个结构体定义为:struct _m_usmart_dev usmart_dev={};
struct _m_usmart_dev的具体定义是:
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]; //函数的参数
};
其中usmart_dev.funs正是该结构体的首个成员。通过查看该成员的类型发现,它依然是个结构体,具体定义为:
struct _m_usmart_nametab
{
void* func; //函数指针
const u8* name; //函数名(查找串)
};
接下来:usmart_dev.funs[id]这就定义一个结构体数组,数组中成员类型是struct _m_usmart_nametab。该结构体的第二个成员刚好是name,就对应usmart_dev.funs[id].name。
最后,这个表达式就是找到函数的函数名。
第二:
结构体的定义和结构体变量的初始化
定义一个结构体变量
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]; //函数的参数
};记住各个成员之间是分号。
有这个结构体定义一个变量并对其初始化如下:
struct _m_usmart_dev usmart_dev= //_m_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初始化
};
注意这种在一个大括号中队结构体变量的所有成员初始化的操作,一般我们都是逐个对成员进行初始化的,初始化时,要用逗号。
第三
该组件中的很多字符串函数写到很好,可以用来学习c语言指针操作。
用户1858945 2015-10-22 08:02
用户377235 2015-1-7 21:40
你比原子跳频,原子只给函数,不讲解
chen_zs2012_704941858 2013-4-21 13:08
用户395944 2013-1-15 19:27
用户1646592 2012-10-16 09:37
用户377235 2012-10-16 08:27