当前位置:网站首页>1292_FreeROS中vTaskResume()以及xTaskResumeFromISR()的实现分析

1292_FreeROS中vTaskResume()以及xTaskResumeFromISR()的实现分析

2022-07-06 13:26:00 grey_csdn

全部学习汇总: GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. (github.com)

今天看一个比较简单的接口实现,vTaskResume()的实现。可能是前面分析的接口已经有一些沉淀了,这次看这个接口实现的时候的确是不难,毕竟里面涉及到的接口实现之前都分析过了。

软件中很多接口在我现在的配置中其实是没有奏效的,因此剩余的代码本身就不是很多。

接口最开始,断言的方式判断了任务句柄的有效性。其实,有了这个,下面的判断中的一个条件的状态就已经是确认的了,后面的判断如果在断言开启的状态下多少是有一点冗余的判断了。最基础的判断是先看挂起的任务句柄是否是当前任务的句柄,如果是,这个操作也是没有意义的。因为当前的任务正在运行,不会是挂起的状态,

处理的基本前提条件具备了,接下来就是进行挂起任务的恢复。当然,首先得确认任务是挂起状态。如果是,从挂起任务链表中移除,之后加入到就绪任务链表之中。这样,基本的处理就差不多了。

如果调度器是抢占的,这个时候还得看看被恢复的任务的优先级是否高于现在正在运行的任务优先级。如果是,那么意味着需要进行一次任务切换。

这就是这个接口的实现,比较简单。

再看中断安全版本的API,首先判断了句柄的有效性,其次看了中断优先级的有效性。这里不需要判断与当前执行的Task的关系,因为在ISR中,调度是否运行都尚未可知。

接下来,整体的处理方式跟vTaskResume()差异不大,唯一有差异的地方在于调度器挂起的时候的处理。vTaskResume()执行是在OS的调度代码之中运行的,因此调度器一定是没有挂起的。但是在ISR中,这个则不一定,调度器的状态可能有所不同。因此,多了一个调度器挂起的处理。

原网站

版权声明
本文为[grey_csdn]所创,转载请带上原文链接,感谢
https://greyzhang.blog.csdn.net/article/details/125631775