首先声明了一个如下类型的结构体类型_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];
//函数的参数
-
u8 runtimeflag;
//0,不统计函数执行时间;1,统计函数执行时间,注意:此功能必须在USMART_ENTIMX_SCAN使能的时候,才有用
-
u32 runtime;
//运行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
-
};
定义了类型为_m_usmart_dev的结构体usmart_dev并将其初始化。即usmart_dev.fun=usmart_nametab //该成员为结构体数组指针变 量,将结构体数组usmart_nametab的首地址
赋给了他
usmart_dev.Init=usmart_init //该成员为无返回值输入参数为u8类型的函数指针变 量,将函数usmart_init地址赋给它
usmart_dev.cmd_rec=usmart_cmd_rec //该成员为返回值和输入参数都为u8类型 的函数指针变量,将函 数usmart_cmd_rec地址赋给它
其他成员就不一一说啦
-
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初始化
-
};
usmart_nametab 是结构体数组其成员是类型为_m_usmart_nametab的结构体(该结构体成员func为函数指针变量,成员name为指向u8类型的指针变量)
-
struct _m_usmart_nametab //声明结构体类型
-
{
-
void* func;
//函数指针
-
const u8* name;
//函数名(查找串)
-
};
-
struct _m_usmart_nametab usmart_nametab[]=
-
{
-
-
#if USMART_USE_WRFUNS==1 //如果使能了读写操作
-
-
(
void*)read_addr,
"u32 read_addr(u32 addr)",
-
-
(
void*)write_addr,
"void write_addr(u32 addr,u32 val)",
-
-
#endif
-
-
(
void*)delay_ms,
"void delay_ms(u16 nms)",
-
-
(
void*)delay_us,
"void delay_us(u32 nus)",
-
-
(
void*)LCD_Clear,
"void LCD_Clear(u16 Color)",
-
-
(
void*)LCD_Fill,
"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",
-
-
(
void*)LCD_DrawLine,
"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)",
-
-
(
void*)LCD_DrawRectangle,
"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)",
-
-
(
void*)LCD_Draw_Circle,
"void Draw_Circle(u16 x0,u16 y0,u8 r)",
-
-
(
void*)LCD_ShowNum,
"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)",
-
-
(
void*)LCD_ShowString,
"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)",
-
-
(
void*)led_set,
"void led_set(u8 sta)",
-
-
(
void*)test_fun,
"void test_fun(void(*ledset)(u8),u8 sta)",
-
-
(
void*)LCD_ReadPoint,
"u16 LCD_ReadPoint(u16 x,u16 y)",
-
-
};
上面的代码是在定义并初始化usmart_nametab,也就是先定义结构体数组usmart_nametab再赋初值。
其中
usmart_nametab[0]={(void*)read_addr,"u32 read_addr(u32 addr)"}
usmart_nametab[1]={(void*)write_addr,"void write_addr(u32 addr,u32 val)"}
usmart_nametab[2]={(void*)delay_ms,"void delay_ms(u16 nms)"}
...............
与下面的代码是一个意思
-
struct student
//声明结构体
-
{
-
int num
-
char name
-
}
-
-
struct student student1[]=
//定义结构体数组并初始化
-
{
-
1,
"Li Ming",
-
2,
"Li Ergou",
-
3,
"Li Yifeng"
-
}