UCOS_III(原子战舰STM32)学习笔记一

5 篇文章 0 订阅
2 篇文章 0 订阅

1、UCOS_III主要使用系统的滴答定时器(倒计时计数器)来做高精度延迟;滴答定时器的中断优先级最低(优先级为15);
2、`void delay_init()
{

if SYSTEM_SUPPORT_OS //如果使用了OS

u32 reload;

endif

①SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部晶振  HCLK/8
②fac_us=SystemCoreClock/8000000;    为系统时钟的1/8

if SYSTEM_SUPPORT_OS //如果使用了OS

③reload=SystemCoreClock/8000000;    //每us计数的次数,单位为K,如果为72M,则计数为9K          
④reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间

⑤fac_ms=1000/delay_ostickspersec; //代表OS最小延迟单位        

SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;    
SysTick->LOAD=reload; //重装载计数器,装入初值                 
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   

else

fac_ms=(u16)fac_us*1000;                

endif

} `
上面的代码是原子缩写的delay.c里面的函数,用来对延迟进行初始化的。
①设置滴答定时器时钟源,F103为72M,72M/8=9M;
②用当前时钟源9M,9M/S=9/us;故1us计数器跳动9次;
③同②;
④根据delay_ostickspersec设置溢出时间,在默认值下,delay_ostickspersec=200;
reload在后边将会当做计数初值,放入重装载计数器,故它为溢出所需的计数次数;
reload=1/200*1000000*9;
溢出时间为1/200s,在乘以1000000,变为us级别,再乘以1us跳动次数;
(一秒钟跳200次(设定计时);每次0.005s,即5ms;0.005s有多少个us,即0.005*1000000=5000个;1us跳9次,故在乘以9,等于45000次,装入SysTick->LOAD这个寄存器;
说白了就是:滴答定时器1us跳9次,你将45000次放入SysTick->LOAD这个寄存器,它就开始倒计时,滴答定时器进入它的中断的时间是1/200s=5ms,也是45000/9us=5000us=5ms,也就是5ms进一次中断。
⑤最小延迟单位,T=1/delay_ostickspersec;

3、void delay_ms(u16 nms) //OS毫秒级延迟
{
if(delay_osrunning&&delay_osintnesting==0)
{
if(nms>=fac_ms) //如果延迟时间大于最小延迟单位
{
delay_ostimedly(nms/fac_ms); //OS延迟
}
nms%=fac_ms; // 这里用的是%,就是说小于最小延迟单位的毫秒数,用下面的普通延迟 ;比如现在延迟7ms,若当前最小延迟单位为5ms,nms/fac_ms =7/5=1,故用OS延迟一个5ms,nms%fac_ms=7%5=2,用普通的OS的delay_us延迟,延迟2ms;
}
delay_us((u32)(nms*1000)); //普通延迟(OS的delay_us延迟)
}

调用OS的delay_ms的时候,为啥延迟的ms数小于最小延迟单位,T=1/delay_ostickspersec,无法引起任务调度?
原因很简单,系统定时器T=1/delay_ostickspersec长时间才会进一次中断,即void SysTick_Handler(void)函数,任务调度发生在这个函数里面,因为你定时的时间小于进入中断的时间,所以当延迟完成的时候,中断还没有到来。

OS的delay_us函数无法引起任务调度;

4、UCOS_III的五个系统任务

优先级0:中断服务管理任务 OS_IntQTask()
优先级1:时钟节拍任务 OS_TickTask()
优先级2:定时任务 OS_TmrTask()
优先级OS_CFG_PRIO_MAX-2:统计任务OS_StatTask()
优先级OS_CFG_PRIO_MAX-1:空闲任务OS_IdleTask()

时钟节拍任务和空闲任务系统默认开启,其他手动开启,系统任务所占的优先级,用户任务不能占用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋山刀名鱼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值