TriCore的CSA机制介绍

背景介绍

MCU在运行过程中,发生中断或异常时,需要现场保护后再去执行中断服务函数,并在处理完成后恢复现场,如《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors》的Exception Handling in Detail章节介绍了异常入栈和出栈的情况(如下图所示),异常发生时,入栈的寄存器依次是xPSR,PC,LR,R12,R3,R2,R1,R0,而异常处理完成后返回时,对应的出栈顺序刚好相反。
在这里插入图片描述

CSA (Context Save Area)介绍

相比于Cortex-M核使用栈来保护和恢复现场,TriCore内核为保护和恢复上下文环境(Context)设置了一套特殊的机制,有以下特点:

单独在RAM中为CSA开辟出一块空间;
CSA分为Upper CSA与Lower CSA两种. 其中Upper CSA为硬件自动保存, Lower CSA为程序员视情况需要而保存/恢复;
CSA大小为16 Word,也就是64 Byte;
硬件自动保存的Upper CSA的情况有:函数调用,中断或Trap触发;
在TriCore内核中,包含有32个通用寄存器,程序计数器(PC)及两个32位状态寄存器(PCXI,PSW),当发生上下文环境保护时,CSA内保存的寄存器如下图所示,其中Upper Context由硬件自动保存,Lower Context则需手动保存。
在这里插入图片描述
在这里插入图片描述

CSA数据结构

SA本质上就是个链表,包含有N个64个字节长度的节点,每个节点可以存储16个4字节长度的寄存器值,其中头4个字节相当于指针指向前一个结点,芯片Start-up过程中,Ifx_Ssw_initCSA函数初始化长度为128个节点的CSA链表结构,具体如下所示。

FCX(Free Context List):指向还未被使用的CSA节点;
LCX(Last Context List):指向倒数第三个CSA节点,用于预警CSA即将被耗尽;
在这里插入图片描述
在实际代码运行过程中,还需要PCXI寄存器指向运行程序的前一个CSA节点,这样的话,从当前程序切换回上一个环境,即可以通过这个寄存器找到上一个CSA节点,而且,当需要保存当前程序运行状态的时,PCXI就会被存储到一个CSA节点的头4个字节中。
在这里插入图片描述
Note: 上述三个寄存器虽然用于指向CSA节点,但并不存储真正的内存地址,而是需要做一个转换,转换关系如下所示,上面是寄存器中的值,下面是实际的内存地址,这是为了让寄存器可以包含跟更多的节点信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总体而言,对于习惯了Cortex-M入栈与出栈机制的小伙伴需要花一些时间理解CSA机制,后面我会结合代码实例详细介绍CSA的运行机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值