OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7013|回复: 5

uCOSII,为什么OSStatInit()第一句就是延迟2个时钟周期??

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-1-3
在线时间
0 小时
发表于 2013-4-8 18:04:29 | 显示全部楼层 |阅读模式
打印 上一主题 下一主题

uCOSII,为什么OSStatInit()第一句就是延迟2个时钟周期??

如何理解呢??

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-8 19:48:54 | 显示全部楼层
该函数代码如下:
void  OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    OSTimeDly(2u);                               /* Synchronize with clock tick                        */
    OS_ENTER_CRITICAL();
    OSIdleCtr    = 0uL;                          /* Clear idle counter                                 */
    OS_EXIT_CRITICAL();
    OSTimeDly(OS_TICKS_PER_SEC / 10u);           /* Determine MAX. idle counter value for 1/10 second  */
    OS_ENTER_CRITICAL();
    OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1/10 second    */
    OSStatRdy    = OS_TRUE;
    OS_EXIT_CRITICAL();
}
我觉得应该这么理解:
假设你设置系统时钟节拍为10ms一次,也就是每秒钟100个节拍。
那么进入该函数的时候,系统时钟的计数器,是不可预知的,比如可能在2ms,3ms,5ms,都不定。如果此时不等待时钟同步,就开始统计,那么OSIdleCtr第一次计数,可能就会很快到来,比如原来是10ms,OSIdleCtr才加1,这样你不同步,进入OSStatInit 函数的时候,系统时钟已经跑了8ms了,那么在2ms之后,OSIdleCtr就会加1.显然,这会导致统计结果不正确。
那么最好的办法,就是一开始就延时一下,等待时钟节拍同步了,才开始统计,这样结果就准确了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-1-3
在线时间
0 小时
 楼主| 发表于 2013-4-9 11:43:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
受教了。。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-3-21
在线时间
3 小时
发表于 2014-3-21 14:20:49 | 显示全部楼层
回复【2楼】brain:
---------------------------------
我和原子哥想的一样,但是按照这么说,延时一个时钟周期也可以啊,就算系统时钟已经跑了8ms也没事,只要进一次滴答中断同步了不就OK了吗,为啥延时2个时钟周期呢
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-3-21
在线时间
3 小时
发表于 2014-3-21 14:22:35 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我和原子哥想的一样,但是按照这么说,延时一个时钟周期也可以啊,就算系统时钟已经跑了8ms也没事,只要进一次滴答中断同步了不就OK了吗,为啥延时2个时钟周期呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-21 14:48:07 | 显示全部楼层
回复【5楼】xuetudou:
---------------------------------
你试试改为1.测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 15:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表