与上次不同的是,代码暂不在日志里分析,只是告诉大家,对于一个多任务系统(注:非操作系统中的多任务),它们之间又有着很多共同之处,例如它们都有任务号、都有命令字、都要执行某个或某些函数等,那么现在如何使用最简洁的代码完成任务呢?答案当然是使用指针函数了。下面贴出代码:
unsigned char TASK_ID; //任务ID号
unsigned char CMD; //命令字
void (*Cur_Fun)(); //指针函数声明
typedef struct //功能函数结构体
{
unsigned char TASK_ID; //任务ID
unsigned char PIC_ID; //显示界面的ID号
void (*EXE)(); //需要执行的函数
}FUNCTION;
void FUN0(void)
{
CMD = 1; //返回命令字1
}
void FUN1(void)
{
CMD = 2; //返回命令字2
}
FUNCTION code FUN_LIST[2]=
{
{0,4,(*FUN0)}, //任务ID为0,页面ID为4,执行函数FUN0()
{1,6,(*FUN1)} //任务ID为1,页面ID为6,执行函数FUN0()
};
void main()
{
TASK_ID = 1;
Cur_Fun = FUN_LIST[TASK_ID].EXE; //指针指向相应的函数
(*Cur_Fun)(); //执行指针指向的函数
while(1);
}
把上面的代码复制到KEIL中编译即可,通过软件仿真可以发现,最后的命令字CMD是2,因为TASK_ID为1,那么对应执行的函数为FUN1() 。在主函数里,我直接给TASK_ID赋值1,看起来只执行一个任务,大家可以用开关语句获取多任务的任务ID,然后用指针指向对应需要执行的函数,然后执行那个函数即可,是不是很妙?当然,这也是基础。需要说明的是,大家要注意局部变量和全局变量,结构体中也定义了一个局部变量TASK_ID,此TASK_ID与彼TASK_ID是不一样的,这样写也是提醒大家一定注意局部变量和全局变量,不然有时候出了问题你都不知道到哪里找BUG,变量的命名一定要规范。
大家从代码中可以看到有一个空指针函数,那么空指针有什么作用呢?想好了请给我答案!
如有问题,可以留言提问,发表这篇日志就该回去休息了,晚安!
|