UCOSII如何实现微妙级别的延时,还有OSTimeDly();最小是多小秒

UCOSII如何实现微妙级别的延时,还有OSTimeDly();最小是多小秒,第1张

我先回答你后面的问题:OSTimeDly()最小延时多长?这个最小的延时准确来说是小于等于一个ucos的系统节拍。至于多少秒,需要看你的ucos工作的节拍时长是多长(参见宏OS_TICKS_PER_SEC,它的值意思就是1秒钟有多少个系统节拍,比如这个值是1000,那么你的系统节拍就是1/1000S);

如何实现微妙级别的延时?在ucos上基本是不可能实现这么高精度的延时的,如果你不介意高频率切换任务带来的cpu浪费,你当然可以把它的节拍调到微妙级别以下,然后通过OSTimeDly来获得这个延时。最可靠的实现方法是使用硬件定时器来获得这个高精度的延时。另外如果你真的考虑把时钟节拍调到微妙级来实现高精度延时,我建议你最好把节拍调到100ns,因为ucos的延时计算也有个精度问题,他的误差波动在1个时钟节拍内,也就是说你需要把节拍调到100ns后,其误差(≤0.1us)才会显得可以忽略掉(相对于1us)

我说的是UCOSII 的周期性执行任务,不是时间分片。

而周期性任务的结构如下:

void MyTask (void *pdata) //周期性执行的任务函数

{

进行准备工作的代码

for () //无限循环,也可用 while (1)

{

任务实体代码

OSTimeDly( )

}

}

有四个周期性执行的任务,任务A(优先级=0)、任务B(优先级=1)、任务C(优先级=2)、任务D(优先级=3)

如果每个任务的延时节拍时间OSTimeDly( )设置的不合理,可能会导致永远也执行不到“任务D”

有没有设置“延时节拍时间OSTimeDly( )”的一般方法呢?

首先你要开总中断EA

其次你才是开启五个小中断ET0 ET1 ES INT0 INT1

只要你对应中断的接口接受到有效电平它就启动

设置这些优先级

不过我的建议是 刚学习中断 基本是一个中断没什么优先级好说的 只有你对一个中断玩熟了 才慢慢设置多个中断


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11422544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存