硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5335|回复: 5
收起左侧

[有问必答] OS_OPT_TIME_PERIODIC 和OS_OPT_TIME_DLY区别

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2015-11-11 23:48:24 | 显示全部楼层 |阅读模式
环境是ucosiii
我做了两个任务,任务一点亮led1一秒,灭一秒,任务二点亮led2一秒,灭一样。
两个代码除了操作的io口不一样,其他完全一致。
当我用OS_OPT_TIME_PERIODIC 做延时函数的参数时,肉眼观察到两个led同时点亮同时灭
当我用OS_OPT_TIME_DLY做延时函数的参数时,肉眼能明星观察到两个led点亮熄灭有时差
当我用了OS_OPT_TIME_PERIODIC 和OS_OPT_TIME_DLY分别做两个任务的延时参数,肉眼观察到led同时点亮同时熄灭
另外,这两个函数是同等级的,用了时间片,时间片参数相等。
请问为什么会出现这样的情况?
OS_OPT_TIME_PERIODIC 和OS_OPT_TIME_DLY区别是什么?能详细地说明吗?我只知道说一个是周期性,一个是相对。

另外,两个任务同等级,同时间片,如果一个任务没有延时,CPU会被一直占用,好像时间片并没有什么用。。。按照教程设置了OSSchedRoundRobinCfg(DEF_ENABLED, 1,     &err);    和两个任务的时间片。
是我还有什么地方疏忽了吗?

有延时的话,不是延时交出去了CPU使用权吗?

没有延时,CPU使用权被一直占用,那不就是时间片不起作用了吗?

E:\STM32-V4开发板\V4光盘B_配套资料\02.配套例程\07.uCOS-III操作系统(26个例子)\V4-613_uCOS-III实验_时间片调度

用了这个例程,把同等级的两个任务的延时函数注释掉,也发生其中一个任务始终得不到CPU使用权。

有对以上两个问题有比较深了解的吗?麻烦解答一下哈~~~谢谢鸟~~~~    ^_^
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2015-11-12 09:18:25 | 显示全部楼层
OS_OPT_TIME_PERIODIC 和OS_OPT_TIME_DLY区别就在这里,
比如
1. 我们有一个key_process函数,这个函数处理时间大概耗时2ms。
2. 有两个任务,一个任务Task1是用的OS_OPT_TIME_DLY延迟,延迟10ms
    另一个任务Task2是用的OS_OPT_TIME_PERIODIC延迟,延迟10ms
=====================
Task1:
  key_process +  OS_OPT_TIME_DLY  ---> key_process +  OS_OPT_TIME_DLY
  |----2ms + 10ms 为一个周期------|             |----2ms + 10ms 为一个周期------|
这个就是相对性的含义

Task2:
  key_process +  OS_OPT_TIME_PERIODIC--------------> key_process +  OS_OPT_TIME_PERIODIC
  |----10ms 为一个周期(2ms是包含在10ms内的)------|    |----10ms 为一个周期------|
这就是周期性的含义。


我这么说应该楼主就理解了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-11-12 18:00:44 | 显示全部楼层
假如这个key_process处理的时间超过10ms,也就是大于周期定时的时长,会发生什么情况?
谢谢你的回答鸟^_^
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2015-11-12 18:09:16 | 显示全部楼层

回 liudijiang 的帖子

liudijiang:假如这个key_process处理的时间超过10ms,也就是大于周期定时的时长,会发生什么情况?
谢谢你的回答鸟^_^ (2015-11-12 18:00) 
所以不要大于,大于的话这个就没有意义了。
超时的话,估计是继续执行下次的周期延迟。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-11-13 10:47:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:所以不要大于,大于的话这个就没有意义了。
超时的话,估计是继续执行下次的周期延迟。 (2015-11-12 18:09) 
soga,谢谢了哈~~~
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2017-2-5 13:00:12 | 显示全部楼层
OS_OPT_TIME_PERIODIC
每经过N个完整的ticktime,使任务从pend状态切换为ready状态;
该状态下,任务每隔N个ticktime就会周期性的被唤醒,其周期为N*ticktime。他的计数和tick的发生同步(开始计时的时刻和tick发生时刻同步)且独立于任务执行(任务执行过程中他也在计数,TickCtrPrev中记录了开始计数的时刻)
如果出现其他高优先级任务超载导致N个ticktime内该任务没有被执行,则对该任务而言这一周期丢失。
如果该任务在N个ticktime计数结束时正在运行,那么对该任务而言下一周期丢失,因为该任务在下一周期执行的是上一周期没执行完的任务。
OS_OPT_TIME_DLY
经过N个ticks后,使任务从pend状态切换为ready状态;
该状态下,任务每隔N个ticks就会被唤醒。他的计数和tick的发生异步(开始计时的时刻不和tick发生时刻同步,这也导致其时间的不准确性)且不独立于任务执行(任务执行过程中他不在计数)。
如果出现其他高优先级任务超载导致经过N个ticks该任务没有被执行,则对该任务而言这一周期将延长
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 22:43 , Processed in 0.260914 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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