OpenEdv-开源电子网

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

【求助】新手学习UCOS_III的问题(滴答定时器)

[复制链接]

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2015-10-28
在线时间
13 小时
发表于 2017-7-21 20:26:51 | 显示全部楼层 |阅读模式
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延时的)
编程领域的半吊子http://blog.csdn.net/qq_26039331
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2017-7-21 20:26:52 | 显示全部楼层
1,reload=SystemCoreClock/8000000;  和
fac_us=SystemCoreClock/8000000;是一样的东西来的。
都是9.
2,1ms是1000
3,当然会,但是你nms%=fac_ms;就把nms搞成if之后的剩余量了,是必须要延时的部分(不够if延时的)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2015-10-28
在线时间
13 小时
 楼主| 发表于 2017-7-21 22:07:30 | 显示全部楼层
正点原子 发表于 2017-7-21 20:26
1,reload=SystemCoreClock/8000000;  和
fac_us=SystemCoreClock/8000000;是一样的东西来的。
都是9.

谢谢原子大哥的解答,2,3我明白了,对第一个问题还有有点不理解,代码里面注释写的是每秒钟跳动次数,单位为K,但是我觉得单位应该为M啊
编程领域的半吊子http://blog.csdn.net/qq_26039331
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 02:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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