void Main(void)
{
Target_Init();
……
}
void Target_Init(void)
{……
Isr_Init();
Port_Init();
VIRQ_Relate_Task_Init();
Timer1INT_Init();
}
/*
*************************************************************************************************************
- 函数名称 : VIRQ_Relate_task_Init(void)
- 函数说明 : 和任务调度相关的向量中断的初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void VIRQ_Relate_Task_Init(void)
{
pISR_TIMER1 = (INT32U)UCOS_IRQHandler; // 在OS_CPU_A.S中定义,在OS_CPU.H中声明
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1INT_Init(void)
- 函数说明 : 定时器中断初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Timer1INT_Init(void) //定时器接口使能
{
if ((rINTPND & BIT_TIMER1))
{
rSRCPND |= BIT_TIMER1;
}
rINTMSK &= ~(BIT_TIMER1); //开中断;
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1_Tick_ISR(void)
- 函数说明 : 系统时钟节拍中断服务子程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Timer1_Tick_ISR(void)
{
OSTimeTick();
ClearPending(BIT_TIMER1);
//清除节拍中断
}
/*
*************************************************************************************************************
- 函数名称 : C_IRQHandler(void)
- 函数说明 : 切进UCOS中的处理IRQ的被调程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void C_IRQHandler(void)
{
INT32U reg;
reg = rINTPND;
switch (reg)
{
case BIT_TIMER1:
Timer1_Tick_ISR(); // 脉跳时钟节拍中断服务子程序
break;
default :
break;
}
}
总的来说,在板子初始化的时候,要为ucos的OSTimeDly,OSTimeHSMS等延时函数,关联到硬件设备的定时器上,上面是代码是:用TIMER1实现UCOS的延时,或者说时钟节拍。对TIMER1的中断向量的初始化,中断服务程序的指定。中断服务程序Timer1_Tick_ISR()里一定要调用OSTimeTick(),这样就把UCOS的时钟节拍与硬件关联起来了。