关于函数指针在单片机上的应用

xiaoxiao2021-02-28  226

通过函数指针使程序的可读性更强。在开发外设较少而程序比较复杂的单片机时函数指针能给无论是开发者还是维护者一个比较清晰的思路。 以51单片机为例 /*************************************** main.h ***************************************/ #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 /*************************************** main.c ***************************************/ #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()//12mhz@1ms@定时器2自动重装 { 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(); // sysAddTask(led,1000); 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; } }

是不是程序变得非常清晰呢?

转载请注明原文地址: https://www.6miu.com/read-22564.html

最新回复(0)