// ============================================================================= // 函数功能:__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; } }
// ============================================================================= // 函数功能:__P1020PicTimer_DisInt // 禁止定时器中断 // 输入参数:timer,待操作的定时器 // 输出参数: // 返回值 :true成功false失败 // 说明 : // ============================================================================= bool_t __P1020PicTimer_DisInt(struct tagP1020PicTimerHandle *timer) { if(timer->timerstate & CN_TIMER_ENUSE) { timer->timerstate = (timer->timerstate)&(~CN_TIMER_ENINT); return Int_CutLine(timer->irqline); } 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; }
//----直接禁止实时中断线------------------------------------------------------- //功能:本函数是int_enable_real_line()的姊妹函数,调用本函数使中断线的使能计数器 // 置位,并掐断中断线 //参数:ufl_line //返回:无 //------------------------------------------------------------------------------ bool_t Int_DisableRealLine(ufast_t ufl_line) { if( (ufl_line > CN_INT_LINE_LAST) || (tg_pIntLineTable[ufl_line] == NULL) ) return false; if(tg_pIntLineTable[ufl_line]->int_type == CN_ASYN_SIGNAL) return false; Int_CutLine(ufl_line); tg_pIntLineTable[ufl_line]->en_counter = 1; tg_int_global.enable_bitmap[ufl_line/CN_CPU_BITS] &= ~(1<<(ufl_line % CN_CPU_BITS)); return true; }
// ============================================================================= // 函数功能:__AtTimer_DisInt // 禁止定时器中断 // 输入参数:timer,待操作的定时器 // 输出参数: // 返回值 :true成功false失败 // 说明 : // ============================================================================= bool_t __AtTimer_DisInt(struct AtTimerHandle *timer) { u8 timerno; timerno = timer->timerno; if(timer->timerstate & CN_TIMER_ENUSE) { timer->timerstate = (timer->timerstate)&(~CN_TIMER_ENINT); return Int_CutLine(timer->irqline); } else { return false; } }
//----保存当前状态并禁止异步信号中断线----------------------------------------- //功能:本函数是int_restore_real_line()的姊妹函数,调用本函数使禁止次数增加,调 // 用一次int_restore_real_line是禁止次数减少。 // 若当前次数为0,增加为1并禁止中断线,不为0时简单地增1 //参数:ufl_line //返回:无 //------------------------------------------------------------------------------ bool_t Int_SaveRealLine(ufast_t ufl_line) { if( (ufl_line > CN_INT_LINE_LAST) || (tg_pIntLineTable[ufl_line] == NULL) ) return false; if(tg_pIntLineTable[ufl_line]->int_type == CN_ASYN_SIGNAL) return false; Int_CutLine(ufl_line); if(tg_pIntLineTable[ufl_line]->en_counter!=CN_LIMIT_UCPU)//达上限后再加会回绕到0 tg_pIntLineTable[ufl_line]->en_counter++; //原算法是从0->1的过程中才进入,但如果在en_counter != 0的状态下 //因故障使中断关闭,将使用户后续调用的en_counter起不到作用 tg_int_global.enable_bitmap[ufl_line/CN_CPU_BITS] &= ~(1<<(ufl_line % CN_CPU_BITS)); return true; }
// ============================================================================= // 函数功能:__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; }