|
发表于 2024-3-25 20:26:49
|
显示全部楼层
本帖最后由 tzz1983 于 2024-3-25 20:32 编辑
我回翻了一下帖子,当时我是这么问的:
"内核是会在每次节拍的时候切换任务,但是如果我在别的中断中,激活了一个高优先级的任务(比如说xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );然后跟据igherPriorityTaskWoken的值来确定是否要进行任务切换,), 但是,在这里,如果我要切换任务, 却不知道应该怎么操作了,是调哪个函数呢?这是我的疑问.如果这里给了信号量,却没有主动切换任务, 就像您刚才说的那样, 只能等到时钟节拍时才能自动切换任务了, 但是这样并不实时,我想应该有一种方法可以退出中断以后马上做切换任务的动作"
答帖管理是zhp, 答:
"您好,关于您提出的问题,我提供一点个人的理解供您参考
FreeRTOS中提供的任务切换只有两种方式:抢占式和时间片轮询式
时间片轮询式:任务的切换会在主循环中的IDLE进程中进行切换,在当前任务放弃CPU控制权之前,其它任何高优先级的进程都无法抢占CPU
抢占式:每个时间片结束后,在节拍中断中选择优先级最高的任务进行切换,注意此时的任务是在中断中直接切换的,就像您所说中断没退出就切换到任务中去了
若要在其它中断中切换切换任务不能直接调用vPortYield或者taskYIELD,堆栈会乱掉。
如果您确实要在其它非节拍中断中强行切换任务,可参考范例中的vTimer0ISR中的代码"
答案关键字: "如果您确实要在其它非节拍中断中强行切换任务,可参考范例中的vTimer0ISR中的代码",可见,如果要这么做,需要我自己去实现.
原帖参考:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=581&page=1#pid3150
我在印象中,中断->调用OS服务激活一个任务(假设这个任务优先级比当前执行的任务高)-> 退出中断后,立即切换至高优先级任务. 这才是正常的实时切换.
但是: 现在是 中断->调用OS服务激活一个任务(假设这个任务优先级比当前执行的任务高)-> 退出中断后,等到时钟滴答到,时钟滴答找到最高优先就绪,并在退出中断时切换.还是有些区别,就是实时性相差一个时钟滴答,其它问题不大.
前年年底的时候,我也玩过几天FreeRTOS,自己做了一移植,并且也自己实现了即时切换任务,不过后续没有应用,也就凉在一旁了.
代码我也发出来过,就在杨老师的回帖里.
代码链接:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4506&page=1#pid30426
我最近没有计划重温FreeRTOS,并且对这个问题也不是很在意.我提出来,只是说有空的版主可以关注一下这个问题, 但是没有必要为我解决什么问题.
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+1
楼主威武~
|