通过函数指针使程序的可读性更强。在开发外设较少而程序比较复杂的单片机时函数指针能给无论是开发者还是维护者一个比较清晰的思路。 以51单片机为例
#ifndef _MAIN_H_
#define _MAIN_H_
#define MAXTASK (10)
typedef unsigned
int uint;
typedef unsigned
int u32;
typedef unsigned
char uchar;
typedef unsigned
char u8;
typedef
struct
{
uint period;
uchar runMe;
void (*pTask)();
}Task;
void sysStop();
void sysRun();
void sysAddTask(
uint *p,
uint tPeriod);
#endif
#include<reg52.h>
#include"main.h"
void sysAddTask(
uint *p,
uint tPeriod);
void sysInit();
void sysStart();
void sysSleep();
void sysStop();
void sysRun();
void sysDsp();
Task task[MAXTASK];
void sysAddTask(
uint *p,
uint tPeriod)
{
uchar i=
0;
while(task[i].pTask !=
0) i++;
task[i].pTask = p;
task[i].period = tPeriod;
}
void sysInit()
{
uchar i;
for(i=
0;i<MAXTASK;i++)
{
task[i].pTask =
0;
task[i].period =
0;
task[i].runMe =
0;
}
T2CON=
0X04;
TMOD =
0x00;
TH2=
0XFC;
TL2=
0X18;
RCAP2H=
0XFC;
RCAP2L=
0X18;
ET2=
1;
TR2=
1;
}
void sysStart()
{
EA =
1;
}
void sysSleep()
{
PCON |=
0x01;
}
void sysStop()
{
TR2 =
0;
}
void sysRun()
{
TR2 =
1;
}
void sysDsp()
{
uchar i;
for(i=
0;i<MAXTASK;i++)
{
if(task[i].runMe==
1)
{
task[i].runMe =
0;
(*task[i].pTask)();
}
}
sysSleep();
}
void main()
{
sysInit();
sysStart();
while(
1)
{
sysDsp();
}
}
void sysUpdate() interrupt
5{
uchar i;
TF2=
0;
for(i=
0;i<MAXTASK;i++)
{
if(task[i].pTask)
if(task[i].period==
0) task[i].runMe =
1;
else
task[i].period -=
1;
}
}
是不是程序变得非常清晰呢?