OpenEdv-开源电子网

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

如果信号量在被占用,任务进入等待状态后,是不是每次节拍中断都会查询一次?

[复制链接]

32

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2014-10-9
在线时间
46 小时
发表于 2015-6-9 12:12:16 | 显示全部楼层 |阅读模式
5金钱
问题二:如果系统的节拍是5ms一次,那么延迟1ms,2ms,3ms,4ms,都会有什么效果呢?
我记得在别的地方看过,如果小于二分之一节拍,比如延迟6ms,就会被看做只延迟一个节拍,对吗?
但是在原子哥的第52个实验里,我将main任务的延迟设置为了1ms,按理说这个任务应该没有延迟,这个任务会被看做跟空闲任务一样一只跑,只能被其他高优先级的打断,那么CPU利用率应该到100%吧,但是实际修改后,CPU的利用率依旧很低,为什么

谢谢大神了

最佳答案

查看完整内容[请看2#楼]

是这样的,每次任务调前都要查询一次,我之前自已写个基于51的多任务,这是用这用方法,因为CPU在执行任务函数时并不知道你的时间或信号量之类的标志是否已到或更新了,只有在下一次的时间到了或中断任务调度进行一下次的任务切换期间去做这些事情,不管多任务或单任务我们的CPU还是只有一个,同一时间CPU只能做一件事情,我没有读多什么书,搞软是为了生存下去,我这样说不知你是否明白。高手别见笑!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2015-6-9 12:12:17 | 显示全部楼层
是这样的,每次任务调前都要查询一次,我之前自已写个基于51的多任务,这是用这用方法,因为CPU在执行任务函数时并不知道你的时间或信号量之类的标志是否已到或更新了,只有在下一次的时间到了或中断任务调度进行一下次的任务切换期间去做这些事情,不管多任务或单任务我们的CPU还是只有一个,同一时间CPU只能做一件事情,我没有读多什么书,搞软是为了生存下去,我这样说不知你是否明白。高手别见笑!
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2015-6-9 12:12:17 | 显示全部楼层
关于问题1:
如果系统的节拍是5ms一次,那么延迟1ms,2ms,3ms,4ms,会按照原子哥的延时函数延时相应时间,本任务一直占有CPU控制权。
如果延迟6ms,就会被看做延迟一个节拍(延时5ms,本任务释放CPU控制权),再按照原子哥的延时函数延时1ms(本任务占有CPU控制权)。

关于问题2:
如果你将main任务的延迟设置为了1ms,本任务会按照原子哥的延时函数延时1ms,本任务会一直占有CPU,只能被其他高优先级的任务打断。所以你看到的CPU的利用率依旧很低是统计任务之前计算的数值,该数值未得到更新,因为空闲任务和统计任务根本没有得到运行机会。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-9 23:12:35 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

32

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2014-10-9
在线时间
46 小时
 楼主| 发表于 2015-6-11 16:47:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥~
回复

使用道具 举报

32

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2014-10-9
在线时间
46 小时
 楼主| 发表于 2015-6-11 16:53:44 | 显示全部楼层
回复【3楼】likunxue:
---------------------------------
您的意思我能理解,我也认为这样比较合理。而且根据您说的,我又读了一遍timetick函数,果然是这个样子。
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-28
在线时间
1 小时
发表于 2015-6-26 08:40:41 | 显示全部楼层
回复【5楼】isky:
---------------------------------
    让我们看到函数OSTimeDlyHMSM()中的这一行:

    ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
          + OS_TICKS_PER_SEC * ((INT32U)ms + 500L / OS_TICKS_PER_SEC) / 1000L;


    根据你的问题,我们重点关注这部分:

    OS_TICKS_PER_SEC * ((INT32U)ms + 500L / OS_TICKS_PER_SEC) / 1000L    .................(1)

    我们约定: 用k代表 OS_TICKS_PER_SEC , 用 x 表示ms ,则式(1)等价为:

    k*(x + 500/k)/1000;

    当系统节拍为5ms时,OS_TICKS_PER_SEC = 200, 上式等价为:

    200*(x + 2)/1000;

    因为 x 是 INT16U 类型, 所以:

    当 x < 3 时, ticks  = 0 , 无延时;

    当 x = 3 时, ticks  = 1, 5ms;

    当 x = 4 时, ticks  = 1, 5ms;

    当 x = 6时,  ticks  = 1, 5ms;

    ...

    其他条件下,也可以用同样的方法类推,希望对你有帮助!
回复

使用道具 举报

32

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2014-10-9
在线时间
46 小时
 楼主| 发表于 2015-7-22 12:45:55 | 显示全部楼层
回复【6楼】lrl:
---------------------------------
出差好久,十分感谢!
回复

使用道具 举报

32

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2014-10-9
在线时间
46 小时
 楼主| 发表于 2015-8-3 14:00:42 | 显示全部楼层
回复【8楼】jnfxt95:
---------------------------------
理解太深刻了,谢谢谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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