本文介绍 MICROSAR OS中Task切换过程
在MICROSAR OS任务调度中,任务切换主要由函数Os_TaskSwitch()完成。本文主要介绍运行Tricore内核中MICROSAR OS如何通过Os_TaskSwitch()函数执行任务切换,并回答以下几个问题:
- Task切换过程中执行了哪些操作?
- Os 在什么情况下会通过Os_TaskSwitch 进行任务切换?
Task切换过程中执行了哪些操作?
Os_TaskSwitch 切换流程如下图所示:
上图中,Os_TaskSwitch()函数首先执行PostHook函数。该函数为用户提供了接口,可用于实现Task运行时间、资源使用统计等功能。紧接着调用函数Os_SchedulerInternalSchedule()从调度表中查找NextTask和NextThread,并通知Trace模块进行跟踪监控。然后通过函数Os_TaskGetThread() 用于获取当前线程,最后通过调用Os_ThreadSwitch()实现任务切换。
Os_ThreadSwitch()执行过程如下:
在Os_ThreadSwitch()函数中,首先会对当前的Stack Overflow和time protection进行检查,切换内存保护权限,将当前Thread和Stack分别指向NextThread和NextThread的Stack,最后,调用Os_Hal_ContextSwitch()来完成上下文切换。
Os_Hal_ContextSwitch()函数的首要任务是调用Os_Hal_ContextIntSave()以储存当前环境,然后通过Os_Hal_ContextIntRestore()来实现环境切换。
在Tricore中,函数Os_Hal_ContextIntRestore()会先将函数入口地址写入返回寄存器A[11],将函数参数写入寄存器A[4],并将上文信息写入PCXI寄存器。最后,通过Os_Hal_Rfe()函数来实现任务切换。
更多福利介绍详见https://mp.csdn.net/mp_blog/manage/traffic
Os 在什么情况下会通过Os_TaskSwitch 进行任务切换?
函数Os_TaskSwitch 的用户:
上图展示了Os_TaskSwitch()的部分用户函数,这些函数均能调用 Os_TaskSwitch()实现任务切换。