首页 > 其他分享 >1531_AURIX_TriCore内核架构_任务以及函数

1531_AURIX_TriCore内核架构_任务以及函数

时间:2022-11-26 12:06:45浏览次数:68  
标签:TriCore 1531 中断 CSA 信息 trap AURIX 寄存器 上下文


全部学习汇总: ​​GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com)​

继续前面的内核架构学习,这次看一下任务以及函数的描述。

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式

1. 在嵌入式系统中,内核以及函数的设计其实是有一定的模型或者说是模式的。通常来说这个模型有一定的相似之处,都是让中断服务子程序或者是操作系统的任务运行在自己的虚拟MCU上,感觉自己拥有一切MCU的资源。如何实现这样环境的虚拟呢?很大程度是依赖于RTOS对于上下文信息的管理。

2. 在TriCore的内核上,这样的操作系统实现的时候是非常容易的,可以做到非常轻量化。因为,很多上下文的切换工作会由硬件直接处理掉。

3. 这里再次说了一下,上下文CSA其实是16个字节,主要是寄存器的信息。

1531_AURIX_TriCore内核架构_任务以及函数_TC275_02

这张图可以很清楚看到上下文,不管是高区还是低区的内容。其中,A11还有PCXI在两个模块中都有。A11是返回地址寄存器,而PXCI是链接字寄存器,后面可以理解这个链接字的作用其实是指明一块CSA的地址。

1531_AURIX_TriCore内核架构_任务以及函数_AURIX_03

1. 链接字的功能作用是把不同的CSA连接起来。至于如何形成关联,后面会有更进一步的描述。

2. 上下文的上区保存是硬件自动完成的,下去通过指令来处理。

1531_AURIX_TriCore内核架构_任务以及函数_TriCore_04

1. 感觉这里的描述有点让我糊涂,我自己理解了一下感觉这样的描述不见得是靠纯字面的信息去理解。可能,拆分一下会有更为清晰的理解。首先需要明确,为什么上下文的低区需要保存,这是因为每一个运行的任务使用的这部分信息都是不同的。这些信息可能是函数的传递参数,也可能是函数的返回值。如果要保证这样的一致性,那么中断或者trap在执行处理结束之后就得考虑对这边付恩信息的恢复和实现。

2. 不同的任务或者中断处理程序之间的寄存器不具备信息的继承性,这个也是前面描述的模型的一点体现。每一个任务的中断后的恢复,都应该有自己完整的继承性。这样,每一个任务以及ISR都可能感觉自己独占了一个MCU。

3. 高区的上下文寄存器在没有写入之前久长时去读取,其行为是未定义的。

4. 这个表格给出来了上下文切换的一些条件。

1531_AURIX_TriCore内核架构_任务以及函数_TC275_05

1. 链接字在功能上来说可能会是一个偏移,只要是基地址确定就可以。但是是地址的话,处理或许会更方便。

2. FCX在第一次读取的时候会给出一个全新的数值。

3. 从中间的额信息描述看,如果堆栈耗尽CSA没法继续分配,应该会报一个trap。

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_06

上面提到的上下文切换的trap信息,在这里能够看到很好的解释。

4. Trap的处理行为取决于软件实现,可能是reset,也可能扩充CSA区域。至于扩充的方法,可能是分配新的内存,也可能是杀死task来释放内存。

1531_AURIX_TriCore内核架构_任务以及函数_TC275_07

1. 函数调用的时候,RA是返回地址。

2. 如果是同步的trap,RA中是触发trap的指令PC。

3. 如果是异步的trap或者中断,RA中会是接下来要执行的指令的PC。

4. 我曾经怀疑过这个调用的层级是否会影响递归的层级,现在看到了解释,这个是故意如此设计的,这样的设计是为了避免软件出现失控的递归。

5. 剩余的信息,之前看过一次了。此外,介绍了中断管理系统管理的内容。

1531_AURIX_TriCore内核架构_任务以及函数_AURIX_08

1. 中断优先级等信息不在上下文切换的内容当中。

2. 中断中的上下文处理,一定程度上可以看出中断嵌套功能的实现。

3. 如果中断ISR用到的寄存器少,上下文的切换处理可以硬件直接实现。如果使用的寄存器很多,可能处理的过程中是一个软硬结合的过程。

1531_AURIX_TriCore内核架构_任务以及函数_TriCore_09

指令之中有一个函数的快速调用以及快速返回的功能,这两条指令虽然是触发了函数调用,但是不会进行上下文的切换。

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_10

1531_AURIX_TriCore内核架构_任务以及函数_TC275_11

1531_AURIX_TriCore内核架构_任务以及函数_单片机_12

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_13

这几张图结合在一块儿,可以比较清晰地看出来CSA空间的分配以及回收过程。

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_14

几个概念强化理解下:

1. FCX,这个是CSA空间中还可以继续用的部分相应的指针。

2. PCX,这个是已经用掉的CSA的部分相应的指针。

3. LCX,这个是CSA存储的大小限制。

1531_AURIX_TriCore内核架构_任务以及函数_单片机_15

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_16

这两个寄存器,本质上来说是一个指针信息。

1531_AURIX_TriCore内核架构_任务以及函数_嵌入式_17

既然是一个限制值,那么肯定是可以设置并且读取进行判断的。这个信息来自于存储分配的结果,而这个分配是软件指定的,因此内核硬件本身判断不出来。

1531_AURIX_TriCore内核架构_任务以及函数_TriCore_18

1. 内核设计的时候,可能会考虑硬件上的加速手段增强性能。因此,为了保证CSA的一致性,在CSA存储访问之前强制使用DSYNC来进行同步。

2. CSA不能是虚拟地址,因此从安全考虑,如果用了外置的存储尽量也用作通用RAM,不要考虑用在CSA的空间。

标签:TriCore,1531,中断,CSA,信息,trap,AURIX,寄存器,上下文
From: https://blog.51cto.com/greyzhang/5888789

相关文章