初级会员
- 积分
- 149
- 金钱
- 149
- 注册时间
- 2015-10-28
- 在线时间
- 13 小时
|
1金钱
最近学习了原子的UCOS_III视频,我用的F103,里面有几点不懂的,想要请教下各位。
1.[mw_shl_code=c,true]void delay_init()
{
#if SYSTEM_SUPPORT_OS
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SystemCoreClock/8000000; //这里原子的视频给出的解释是,利用滴答定时器,计数器1us跳9次;
#if SYSTEM_SUPPORT_OS
reload=SystemCoreClock/8000000; //可是到了这里给的注释是:每秒钟跳动次数,单位为K,这里我就想不懂了,如果每秒钟的话,单位不应该为M;求解释一下;
reload*=1000000/delay_ostickspersec;
fac_ms=1000/delay_ostickspersec; //这里解释的是OS可以延迟的最小单位,如果这个delay_ostickspersec=200的话,最小延迟单位就是5ms,那就是如果我想延迟1ms的话,就要把delay_ostickspersec改为1000,是吧!
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;
SysTick->LOAD=reload;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
#else
fac_ms=(u16)fac_us*1000;
#endif
} [/mw_shl_code]
2.[mw_shl_code=c,true]void delay_ms(u16 nms)
{
if(delay_osrunning&&delay_osintnesting==0)
{
if(nms>=fac_ms) //延迟大于设置的最小延迟
{
delay_ostimedly(nms/fac_ms); //如果延迟大于了设置的最小延迟,就能执行到这里。我有问题,①这个函数可以直接跳出这个delay函数吗?②如果跳不出去的话,岂不是连下边普通延迟也一并执行了?
}
nms%=fac_ms; //这个给出的解释是,OS已经无法提供这么小的延迟了,采用普通延迟。
}
delay_us((u32)(nms*1000)); //这个就是普通延迟吧?
}[/mw_shl_code]
上面就是我自己的问题,希望大家帮忙指点下!
|
最佳答案
查看完整内容[请看2#楼]
1,reload=SystemCoreClock/8000000; 和
fac_us=SystemCoreClock/8000000;是一样的东西来的。
都是9.
2,1ms是1000
3,当然会,但是你nms%=fac_ms;就把nms搞成if之后的剩余量了,是必须要延时的部分(不够if延时的)
|