OpenEdv-开源电子网

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

关于RTOS系统调用和任务切换的疑问???

[复制链接]

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
发表于 2018-5-15 19:10:31 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 dscx05 于 2018-5-16 09:30 编辑

在左工PDF中和视频中有看到的?FreeRTOS 任务切换场合
1.可以执行一个系统调用
2.系统滴答定时器(SysTick)中断。
[size=13.3333px]
问题一,执行一个系统调用,可以理解为等待信号量,延时函数之类的,
但是我直接加一句portYIELD();或者加一句taskYIELD();没有发现任务会发送切换呀,
还是继续执行原来的那个任务,之所以问这个问题就是不使用信号量延时时可以让任务直接调度。




问题二,第二个是不是可以理解如果节拍为1ms,不管有没有遇到阻塞函数1ms中断到就会去检查有没有任务需要调度?
类似于时间片调度就是这样??



0000.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-5-15 22:51:33 | 显示全部楼层
portYIELD进行任务切换是切换到就绪列表中处于就就绪态的优先级最高的任务,如果你当前任务就是就绪列表中优先级最高的肯定还是会执行这个任务的!或者你关闭了任务调度器!导致没法进行任务切换
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-5-16 09:32:47 | 显示全部楼层
zuozhongkai 发表于 2018-5-15 22:51
portYIELD进行任务切换是切换到就绪列表中处于就就绪态的优先级最高的任务,如果你当前任务就是就绪列表中 ...

我有点晕了,portYIELD如果切换到最高优先级任务的话,我刚刚上传了一个图片,说portYIELD可以放弃剩余时间片,那么不就会切换到最高优先级的任务去了?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-5-17
在线时间
0 小时
发表于 2018-5-18 10:21:18 | 显示全部楼层

     楼主还是没有还是没有理解透FreeRTOS,想搞明白就得先理解时间片的产生,其是有Tick中断产生,至于Tick中断的优先级比较低,(主要是考虑到时时性的问题,方便高优先级中断执行,若不考虑时时性问题,可以自定义调整),这里在不考虑发生其他中断的情况分析FreeRTOS任务调度(考虑中断太复杂,很难理解):

     

回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-5-17
在线时间
0 小时
发表于 2018-5-18 10:23:05 | 显示全部楼层
本帖最后由 FreeRTOSSTM32 于 2018-5-18 10:29 编辑

这附图中有点错误,一般来说每个任务执行一次的时间有长有短,有些任务执行一次不到一个时间片的1/4(假设),而有些任务可能需要好几个时间片执行,这里task3开始执行时可能是从Tick中断中进行了任务切换,切到了task3,也可能是有其他任务执行完了,把剩余的时间片让给了task3,假设是其他任务把时间片让给了task3,另外注意这里不考虑中断发生,所以时间片长度固定,不会被其他中断打断

    显然task3执行到一半,被时间片Tick中断打断,任务调度器发现有其他就绪任务task1,task1的优先级要么高于task3,要么同优先级,同优先级的情况下task3被放到了任务队列末尾(这里会有人问若task3只执行了0.0001*时间片呢,而不是图中1/2时间片,那task3不是相当于没执行,没办法任务调度就是这样的,所以设计任务时要注意)
    若task1任务为高优先级,从图中可以看出其刚好执行了一个时间片,告诉你这不合理,实际大部分任务都不能刚刚好执行一个时间片结束,显然是task1没执行完,不然的话task1会在
Tick中断前或者后一点点时间偏差里执行了任务切换,这里没有,显然是没有执行完(也就意味着task1需要执行好几个时间片才能执行完一次任务计算),接下来时间片被task2执行,显然task2和task1为同优先级,不然的话由于task1并未执行完毕,其还是就绪态,接下来的时间片应该还是task1执行,这里反而task1执行后下一个时间片为task2。
     接下来task2执行了约1/2时间片调用了任务切换函数,把时间片让给了task3,显然task3和task2为同优先级,不然的话就绪任务中还有task1要执行呢!应该让给task1才对,若task3优先级低,那么task2应该把时间片让给task1,因此前面假设是错误的,task1,task2,task3均为同优先级。
    那么高优先级任务怎么才能时时抢占低优先级任务?确实,上述只是同优先级任务轮转,高优先级任务抢占问题又是一个复杂问题,这里先问一个问题,当前执行的任务肯定是最高优先级任务,那么为什么会有更高优先级的任务发生了就绪呢?这个问题要搞明白才能清除抢占式是怎么实现的,以下情况,会发生比当前运行任务更高优先级的任务就绪的情况:
    1、当前运行任务创建了比自己优先级高的任务,并且加入到就绪表
    2、有任务延迟时间到了,加入到就绪表,且此任务的优先级高于当前运行任务
    3、有任务被事件唤醒,加入到就绪表,且
此任务的优先级高于当前运行任务
    4、有任务的优先级被改变,且该变后优先级高于当前任务,并且加入到就绪表
     .............
    以上情况均应执行抢占当前任务的时间片操作,让自己运行,管你当前任务是谁,都要抢占,反正我的优先级高。
   FreeRTOS使用了这么一个方法来执行高优先级抢占低优先级任务:每当有任务加入到就绪表,就会检测当前最高优先级是不是变化了,若变化,立即找到最高优先级任务的队列中的第一个任务执行。

回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-5-21 17:59:22 | 显示全部楼层
FreeRTOSSTM32 发表于 2018-5-18 10:23
这附图中有点错误,一般来说每个任务执行一次的时间有长有短,有些任务执行一次不到一个时间片的1/4(假设 ...

哪里看的呢,看的云里雾里。
我发的图片是时间片调度,同优先级的任务。
回复

使用道具 举报

26

主题

1538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6379
金钱
6379
注册时间
2015-8-25
在线时间
1004 小时
发表于 2018-5-22 08:48:46 | 显示全部楼层
FreeRTOSSTM32 发表于 2018-5-18 10:23
这附图中有点错误,一般来说每个任务执行一次的时间有长有短,有些任务执行一次不到一个时间片的1/4(假设 ...

大哥,请教您一下:
您说的“FreeRTOS使用了这么一个方法来执行高优先级抢占低优先级任务:每当有任务加入到就绪表,就会检测当前最高优先级是不是变化了,若变化,立即找到最高优先级任务的队列中的第一个任务执行。”这个在FreeRTOS的源码体现在哪里?小弟刚学,不是很理解,
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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