TriCore处理器的上下文切换原理
01
上下文切换介绍
我们通常说的上下文又叫CPU上下文,是CPU运行任何任务前,必须依赖的环境,包括CPU 寄存器和程序计数器。
上下文切换:就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
02
TriCore 硬件上下文处理机制
2.1 TriCore 硬件上下文介绍
TriCore 与以往嵌入式处理器不同,TriCore提供了一种硬件的上下文机制,这种机制是专为嵌入式实时操作系统设计的。
TriCore上下文类型分为2种:
上层上下文:由上地址寄存器A[10]到A[15]和上数据寄存器D[8]到D[15]组成。上层上下文还包括PCXI和PSW。为了进行函数调用,这些寄存器被指定为非易失性(它们的内容在调用之间保存)。
下层上下文:由较低的地址寄存器A[2]到A[7],较低的数据寄存器D[0]到D[7],A[11](返回地址)和PCXI组成。
上层上下文与下层上下文分布框图如下图1所示
▲图 1
上层上下文:外部中断;陷阱;函数调用;会自动保存恢复上下文。
下层上下文:如果要改变内容,需要显式的使用代码指令去读写寄存器。
下层上下文寄存器类似于全局寄存器。在外部中断;陷阱;函数调用;中对这些寄存器做修改后,事件返回后值仍然会存在。
2.2 TriCore 上下文保护区CSAs
TriCore上下文保存到内存时,会占用16个字的存储块,称为上下文保存区域(CSAs)。该体系结构使用固定大小的上下文保存区域的链接表。CSA是16个字对齐的内存存储器。每个CSA只包含一个上层上下文或一个下层上下文。CSAS通过一个LinkWord连接在一起。LinkWord包括两个字段,它们将给定的CSA链接到链中的下一个字段。这些字段是一个4位的线段和一个16位的偏移量。段号和偏移量用于生成链接CSA的有效地址(EA)。将指针偏移值增加1,总是使EA增加到比前一个位置高16个字的地址。详见下图2。
▲图2
2.3 TriCore CSAs访问
TriCore 内核有三个寄存器用来操作访问 CSA 的信息:
1. FCX: 这个寄存器的值用来指向全局的空闲的 CSA 列表头指针地址信息。(总是指向可用的 CSA 列表头指针)
2. PCX:这个寄存器的值用来保存前一个任务的 CSA 列表头指针地址信息。PCX 同时也是 PCXI 寄存器的一部分。
3. LCX: 如果 LCX 寄存器的值与 PCX 的值一致,那么就会触发一个 FCD 陷阱。(FCD:空闲上下文空间消耗殆尽的异常)
上下层上下文保存在上下文保存区域(CSA)中。未使用的CSA在空闲上下文列表(FCX)中链接在一起。包含保存的上下层上下文的CSA在上一个上下文列表(PCX)中链接在一起。下图3显示了两个上下文列表中的CSAs的简单配置。
▲图3
03
TriCore 仿真芯片模型
由迪捷软件自主研发的SkyEye全数字实时仿真软件,是基于可视化建模的硬件行为级仿真平台,利用拖拽的方式快速搭建任意的虚拟硬件平台,保证虚拟嵌入式系统的可靠性和实时性,进行嵌入式软件的开发和调试。SkyEye目前支持主流的嵌入式硬件平台,可以运行主流的操作系统,此外还能适配国内自主研发的操作系统天脉。通过利用基于LLVM的动态二进制翻译技术,使虚拟处理器在典型的桌面计算机上运行速度可以达到2000MIPS以上。对标产品为美国风河公司的Simics。
在SkyEye 实时仿真软件中实现了TriCore CPU内部所有寄存器在内的数据结构,内存访问接口和内存设备。在SkyEye中,通过将寄存器PCXI,寄存器PSW等上层上下文内容存入FCX寄存器所指向的CSA区域,仿真TriCore真实硬件保存上层上下文操作。通过访问PCXI寄存器所对应的CSA区域获取之前存储在内存中的上层上下文内容来仿真TriCore真实硬件恢复上层上下文操作。
SkyEye中 TriCore 简单模块实现gp模型图,如下图所示: