中级会员
 
- 积分
- 440
- 金钱
- 440
- 注册时间
- 2012-3-6
- 在线时间
- 5 小时
|

楼主 |
发表于 2014-9-25 14:04:14
|
显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
void OSTimeDly (INT32U ticks) 这个吗?
与下面那个效果是不是一样的?
看下.
我用的原子的 那种方法.定义了.ucosIi自然就调用的是系统的延时不知道这个是不是.
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
//延时nus
//--------------------------------------------------------------------------------
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
tcnt=0;
OSSchedLock(); //阻止ucos调度,防止打断us延时
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出.
}
};
OSSchedUnlock(); //开启ucos调度
}
//----------------------------------------------------------------------------------------------------------------
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
if(OSRunning==TRUE)//如果os已经在跑了
{
if(nms>=fac_ms)//延时的时间大于ucos的最少时间周期
{
OSTimeDly(nms/fac_ms);//ucos延时
}
nms%=fac_ms; //ucos已经无法提供这么小的延时了,采用普通方式延时
}
delay_us((u32)(nms*1000)); //普通方式延时 这里有点不理解....上面延时以后出来以后,这里不又延时一次吗 是不是过了 OSTimeDly(nms/fac_ms);这里以后就跳出去了不会执行这个函数了?
} |
|