前言
在《【OS】AUTOSAR Os是如何启动第一个Task的》一文和《【OS】AUTOSAR OS如何实现Task抢占》一文中都涉及了Task的切换过程,但是对于Task切换时的具体细节没有讲清楚,比如:
问题1:不同的Task使用独立的栈,Task切换的时候是如何进行不同Task的栈切换的了?
问题2:CSA存储上下文信息,栈存储的也是上下文的信息,二者有啥关系?
在《英飞凌Aurix2G TC3XX 芯片内核详解(二)——TriCore上下文切换及CSA机制》一文中我们介绍了TriCore上下文切换及CSA机制,核心内容如下:
1)一个核上只有一个Task任务在Running时,函数调用、中断处理程序、异常处理程序会涉及到上下文的切换。
2)一个核上只有一个Task任务在Running时,函数调用、中断处理程序、异常处理程序的上下文的切换都又硬件实现,不用用户写代码去控制上下文切换。
3)一个核上只有一个Task任务在Running时,函数调用会对应汇编语言的”call”指令,call指令会让硬件自动保存upper context. 也就是说,Tricore的FCX寄存器指向的Free Context List的一个CSA会用来保存upper context, 然后这个CSA会逻辑上挂载到PCX寄存器指向的Previous Context List上,也就是从下图1切换到下图2.进入中断处理程序和异常处理程序会由硬件自动保存upper context, 同样产生下图1切换到下图2的CSA切换.
图1:Call指令调用前
图2:Call指令调用后
4)一个核上只有一个Task任务在Running时,函数调用退出时会对应汇编语言的”RET”指令,中断和异常(Trap)退出对应”RFE”指令,RET和RFE指令都会让硬件恢复(Restore)upper context. 也就是从上图2恢复到上图1.
5)一个核上只有一个Task任务在Running时,对于Tricore用户而言只要在startup中完成CSA的初始化即可(所有CSA逻辑上挂载到Previous Context List和Free Context List),上下文的切换都有硬件自动实现。
那么问题来了,Autosar OS中涉及到多Task,每个Task都有自己的函数调用栈,Task之间还有切换及抢占的问题,CSA还能全部由自动自动实现管理吗?显然是不可能的,那就需要Os来实现CSA的管理。
不过,说来惭愧,Autosar OS对于CSA的管理实在过于复杂,其CSA的动态管理逻辑通过调试也无法总结出来。这里仅介绍OS Task初始化是关于CSA的核心操作及Task切换时关于CSA的核心操作,明白OS如何通过底层指令实现软件切换上下文,(至于CSA的动态管理逻辑,感兴趣的可以自己去研究下)。
目录
环境
AUTOSAR工具链:Vector
Hardware Platform: Infineon Tricore
Build Tools: GHS
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
1.OS管理CSA依赖的底层指令
1.1. SVLCX指令
执行SVLCX指令后,硬件会将lower context内容保存到FCX寄存器指向的CSA内存区,然后这块CSA会在逻辑上从FCX寄存器的Free Context List中剔除,挂载到PCXI寄存器指向的Previous Context List.
值得注意的是,Autosar OS会利用SVLCX指令从Free Context List中拿到一块CSA内存(里面保存了Lower Context, 被挂载到Previous Context List中),然后Autosar OS会把当前Task的Upper Context写入到这块CSA中(覆盖原来的Lower Context)。
1.2. RFE指令
RFE指令用于从中断处理函数和异常处理函数中返回,执行RFE指令后回先后执行以下两个动作:
1)第一步:中断/异常返回到此刻A [11] 寄存器(Lr寄存器)保存的地址处(PC指针指向A[11]寄存器指向的地址)。
1)第二步:恢复PCXI寄存器指向的CSA的upper context内容,也就是把PCXI指向的CSA中保存的A11, A10, PSW等寄存器内容写回到All, A10, PSW寄存器。
注意:这个地方一定要理解的是,执行RFE指令后,先返回(return)到此刻A[11]寄存器指向的地址处,再恢复upper context. 因为恢复upper context的时候回把CSA保存的A[11]寄存器值写回到A[11]寄存器,如果顺序理解错了,那返回的地址就错了。
Autosar OS最后也是使用RFE指令切换Task.
原文始发于微信公众号(汽车电子嵌入式):AUTOSAR OsTask切换原理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论