完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在左工PDF中和视频中有看到的?FreeRTOS 任务切换场合
1.可以执行一个系统调用 2.系统滴答定时器(Systick)中断。[size=13.3333px] 问题一,执行一个系统调用,可以理解为等待信号量,延时函数之类的, 但是我直接加一句portYIELD();或者加一句taskYIELD();没有发现任务会发送切换呀, 还是继续执行原来的那个任务,之所以问这个问题就是不使用信号量延时时可以让任务直接调度。 问题二,第二个是不是可以理解如果节拍为1ms,不管有没有遇到阻塞函数1ms中断到就会去检查有没有任务需要调度? 类似于时间片调度就是这样?? |
|
相关推荐
6个回答
|
|
portYIELD进行任务切换是切换到就绪列表中处于就就绪态的优先级最高的任务,如果你当前任务就是就绪列表中优先级最高的肯定还是会执行这个任务的!或者你关闭了任务调度器!导致没法进行任务切换
|
|
|
|
我有点晕了,portYIELD如果切换到最高优先级任务的话,我刚刚上传了一个图片,说portYIELD可以放弃剩余时间片,那么不就会切换到最高优先级的任务去了?
|
|
|
|
楼主还是没有还是没有理解透FreeRTOS,想搞明白就得先理解时间片的产生,其是有Tick中断产生,至于Tick中断的优先级比较低,(主要是考虑到时时性的问题,方便高优先级中断执行,若不考虑时时性问题,可以自定义调整),这里在不考虑发生其他中断的情况分析FreeRTOS任务调度(考虑中断太复杂,很难理解):
|
|
|
|
这附图中有点错误,一般来说每个任务执行一次的时间有长有短,有些任务执行一次不到一个时间片的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使用了这么一个方法来执行高优先级抢占低优先级任务:每当有任务加入到就绪表,就会检测当前最高优先级是不是变化了,若变化,立即找到最高优先级任务的队列中的第一个任务执行。 |
|
|
|
|
|
|
|
大哥,请教您一下:
您说的“FreeRTOS使用了这么一个方法来执行高优先级抢占低优先级任务:每当有任务加入到就绪表,就会检测当前最高优先级是不是变化了,若变化,立即找到最高优先级任务的队列中的第一个任务执行。”这个在FreeRTOS的源码体现在哪里?小弟刚学,不是很理解, |
|
|
|
只有小组成员才能发言,加入小组>>
772 浏览 0 评论
1148 浏览 1 评论
2527 浏览 5 评论
2858 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1065浏览 3评论
190浏览 2评论
453浏览 2评论
366浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 00:28 , Processed in 1.092983 second(s), Total 91, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191