AutoSarOS Task切换过程

本文介绍 MICROSAR OS中Task切换过程

在MICROSAR OS任务调度中,任务切换主要由函数Os_TaskSwitch()完成。本文主要介绍运行Tricore内核中MICROSAR OS如何通过Os_TaskSwitch()函数执行任务切换,并回答以下几个问题:

  1. Task切换过程中执行了哪些操作?
  2. Os 在什么情况下会通过Os_TaskSwitch 进行任务切换?

Task切换过程中执行了哪些操作?

Os_TaskSwitch 切换流程如下图所示:

Created with Raphaël 2.3.0 Os_TaskSwitch() Os_TaskCallPostTaskHook() Os_SchedulerInternalSchedule() Os_TaskGetThread() Os_TraceThreadSwitch() Os_ThreadSwitch() END

上图中,Os_TaskSwitch()函数首先执行PostHook函数。该函数为用户提供了接口,可用于实现Task运行时间、资源使用统计等功能。紧接着调用函数Os_SchedulerInternalSchedule()从调度表中查找NextTask和NextThread,并通知Trace模块进行跟踪监控。然后通过函数Os_TaskGetThread() 用于获取当前线程,最后通过调用Os_ThreadSwitch()实现任务切换。

Os_ThreadSwitch()执行过程如下:

Created with Raphaël 2.3.0 Os_TaskSwitch() Os_StackOverflowCheck() Os_ThreadStoreFpuContext() timing protection module to switch Os_MpSwitch() Os_CoreSetThread() Os_ThreadCallPreThreadHook() Os_ThreadRestoreFpuContext() Os_CoreSetCurrentStack() Os_Hal_ContextSetUserMsrBits() Os_Hal_ContextSwitch() END

在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_Application()
Os_TaskSwitch()
Os_Task()
........
Os_Event()
Os_ApiIncrementCounter()

上图展示了Os_TaskSwitch()的部分用户函数,这些函数均能调用 Os_TaskSwitch()实现任务切换。

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值