本帖最后由 dj狂人 于 2015-1-13 18:04 编辑
ADuc7026学习-Time2
今天拿定时器开撸,开撸之前同样先预热下。
1、void (* tyVctHndlr) (void);
上面定义了一个名为“tyVctHndlr”的函数指针变量,再看下面这个。
2、typedef void (* tyVctHndlr) (void);
首先这里定义了一个名为“tyVctHndlr”的函数指针变量,然后经“typedef”之后“tyVctHndlr”已经是一个类型符号了,如同int 是个整型符一样。 他们不同之处在于,第一条语句定义的“tyVctHndlr”只是一个函数指针
变量,我们可以把一个函数的地址赋给它,但却不能用他来定义新的和他同类型的变量。如void fun (void);void (* tyVctHndlr) (void); tyVctHndlr = fun;//正确的用法tyVctHndlr tun; //错误的用法
而第二条语句中定义的“tyVctHndlr”经过 typedef 之后他变成了一个类型符,所以我们可以用他来定义函数指针变量。用法如下
tyVctHndlr IRQ = (tyVctHndlr)0x0;//定义一个函数指针变量并赋初值
那么下面我们再来看ADI公司在keil中提供的的一些关于中断函数的定义就很容易理解是什么意思了
typedef void (* tyVctHndlr)(void);//定义一个名为“tyVctHndlr”的类型符
tyVctHndlr IRQ =(tyVctHndlr)0x0;/*定义一个名为“IRQ”的函数指针并赋初值,以下同理*/
tyVctHndlr SWI = (tyVctHndlr)0x0;
tyVctHndlr FIQ = (tyVctHndlr)0x0;
tyVctHndlr UNDEF = (tyVctHndlr)0x0;
tyVctHndlr PABORT = (tyVctHndlr)0x0;
tyVctHndlr DABORT = (tyVctHndlr)0x0;
void IRQ_Handler (void) __irq;/*声明一个名为“IRQ_Handler”的函数,__irq是一个关键字,用来声明IRQ中断服务程序,如果用__irq来声明一个函数,那么该函数表示一个IRQ中断服务程序,编译器会自动在该函数内部增加中断现场保护的代码,下同*/
void SWI_Handler (void) __irq;
void FIQ_Handler (void) __irq;
void Undef_Handler (void) __irq;
void PAbt_Handler (void) __irq;
void DAbt_Handler (void) __irq;
/*下面是编写IRQ_Handler函数*/
void IRQ_Handler(void)__irq
{
if ( *IRQ !=0x00)//判断IRQ函数指针是否使用
{
IRQ();//若使用,通过IRQ中保存的函数地址调用该函数
}
}
…………
ADuc7026在使能某个中断(比如定时器中断)在触发中断进入中断服务程序,然后通过一个函数指针变量调用一个函数,这个函数由我们编写,比如我们编写好定时器的中断服务函数后,把这个函数的地址赋值给IRQ就可以了。当然,我们可以直接在void IRQ_Handler(void) __irq 中编写中断服务程序。这里我只是想把我所理解的东西说一下。好下面进入今天的主题