原创 正点原子的USMART学习心得

2013-10-6 16:10 7018 14 16 分类: MCU/ 嵌入式
   首先感谢正点原子的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语言指针操作。





文章评论2条评论)

登录后参与讨论

用户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

不错,若有个简单的电路图就更好了!
相关推荐阅读
用户1603652 2015-01-22 12:33
efm32的leuart和dma的使用-2
3)完全采用DMA来实现从串口收数据,把DMA配置成使能回调函数,在回调函数中进行串口数据的分析。具体的配置如下: void LeuartConfig(void) {        L...
用户1603652 2015-01-22 12:32
efm32的leuart和dma的使用-1
EFM32的DMA的DMA回调的使用。 当我们需要从串口接收大量的数据时, 1)如果我们接收的数据具有固定的帧格式,则可以把LEUART配置成特殊帧触发中断的方式。当收到某个具体的帧后,触发中断,...
用户1603652 2015-01-21 09:34
处理hardfault问题
在debug时经常会出现程序莫名其妙的掉到hardfault的中断中,起初完全不知道是从哪里查找问题,后来有遇到过几次,通过网络资料以及自己的调试,对于解决这样的问题有一些体会,我分析给大家,希望...
用户1603652 2014-09-21 21:15
评论:@davay 博客中提到的“PADS2007中的层类型(plane type)简介”
PADS中层的概念...
用户1603652 2014-03-06 10:47
IIC器件的地址解说
  图1:IIC接口的文字描述 图2:IIC的时序 问题描述: 我在使用标准IIC协议来驱动该芯片时,按照图1中的描述,把该器件的地址当成0x60 ,但是就是不能和MC...
用户1603652 2013-10-15 15:26
cpu大小端问题
我们使用的PC和一般的MCU的体系结构不同。这里有一个大小端的问题。 我自己对大小端的记忆是只记住小端模型:低字节存在低位置;高字节存在高位置。 这里要考虑的是内存地址的增长方式:假如有段...
我要评论
2
14
关闭 站长推荐上一条 /2 下一条