// ============================================================================= // 函数功能:__GPTimer_Free // 释放定时器 // 输入参数:timer,分配的定时器 // 输出参数: // 返回值 :true成功false失败 // 说明 : // ============================================================================= bool_t __GPTimer_Free(ptu32_t timerhandle) { u8 timerno; u8 irqline; atom_low_t timeratom; //保护公用资源 struct tagGPTimerHandle *timer; timer = (struct tagGPTimerHandle *)timerhandle; if(timer->timerstate & CN_TIMER_ENUSE) { timerno = timer->timerno; irqline = timer->irqline; if(timerno < CN_GP_TIMER_NUM )//还有空闲的,则设置标志位 { //修改全局标志一定是原子性的 timeratom = Int_LowAtomStart(); //解除掉中断所关联的内容 timer->timerstate = 0; Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_LowAtomEnd(timeratom); //原子操作完毕 return true; } else//没有的话直接返回就可以了,用不着再啰嗦了 { return false; } } else { return false; } }
// ============================================================================= // 函数功能:__GPTimer_Alloc // 分配定时器 // 输入参数:cycle,定时器周期 // timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __GPTimer_Alloc(u32 cycle,fnTimerIsr timerisr) { u8 timerno; u8 i=0; u8 irqline; struct tagGPTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); timer=&s_tGPTimerHandle[0]; if(!timer->timerstate) { timerno=timer->timerno; } else { timer=&s_tGPTimerHandle[1]; if(!timer->timerstate) { timerno=timer->timerno; } else //没有的话直接返回就可以了,用不着再啰嗦了 { return NULL; } } Int_LowAtomEnd(timeratom); //原子操作完毕 irqline = sgHaltimerIrq[timerno]; timer = &s_tGPTimerHandle[timerno]; timer->cycle = cycle; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 //__P1020PicTimer_PauseCount(timer); __GPTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }
// ============================================================================= // 函数功能:__AtTimer_Alloc // 分配定时器 // 输入参数:timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __AtTimer_Alloc(fntTimerIsr timerisr) { u8 timerno; u8 irqline; struct AtTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); //寻找空闲的timer timerno = __AtTimer_GetFirstZeroBit(gs_dwAtTimerBitmap); if(timerno < CN_ATTIMER_NUM)//还有空闲的,则设置标志位 { gs_dwAtTimerBitmap = gs_dwAtTimerBitmap | (CN_ATTIMER_BITMAP_MSK<< timerno); Int_LowAtomEnd(timeratom); //原子操作完毕 } else//没有的话直接返回就可以了,用不着再啰嗦了 { Int_LowAtomEnd(timeratom); //原子操作完毕 return NULL; } PMC_EnablePeripheral(CN_PERI_ID_TC0 + timerno); irqline = sgHaltimerIrq[timerno]; timer = &stgTimerHandle[timerno]; timer->cycle = 0; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 __AtTimer_PauseCount(timer); // __AtTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_Register(irqline); Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }
// ============================================================================= // 函数功能:__P1020PicTimer_Alloc // 分配定时器 // 输入参数:cycle,定时器周期 // timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __P1020PicTimer_Alloc(u32 cycle,fnTimerIsr timerisr) { u8 timerno; u8 irqline; struct tagP1020PicTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); //寻找空闲的timer timerno = __P1020PicTimer_GetFirstZeroBit(gs_dwP1020PicTimerBitmap); if(timerno < CN_P1020PICTIMER_NUM)//还有空闲的,则设置标志位 { gs_dwP1020PicTimerBitmap = gs_dwP1020PicTimerBitmap | (CN_P1020PICTIMER_BITMAP_MSK<< timerno); Int_LowAtomEnd(timeratom); //原子操作完毕 } else//没有的话直接返回就可以了,用不着再啰嗦了 { Int_LowAtomEnd(timeratom); //原子操作完毕 return NULL; } irqline = sgHaltimerIrq[timerno]; timer = &stgP1020TimerHandle[timerno]; timer->cycle = cycle; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 __P1020PicTimer_PauseCount(timer); __P1020PicTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_SetClearType(irqline,CN_INT_CLEAR_PRE); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }