Tricore1.6内核CSA学习--Apple的学习笔记

一,前言

昨天工作中分析了一个CSA trap的异常中断,不过昨天分析的时候对CSA了解的一知半解,如何才是正确的,如何才是错误的并不清楚,所以今天把tricore1.6内核手册的第4章节都看完,结合之前的调试基本上都理解了,今天做个备忘小结。

二,提问

  1. CSA范围是怎么定义的?
    答:link文件中定义的。最大为4M。因为linkword的offset为16bit。

  2. CSA的保存和恢复是代码实现还是芯片硬件自动实现?
    答:upper csa对象是硬件自动的。lower csa对象是代码实现的。

  3. 手册中FCX和PCX是什么概念?
    答:看到有画指针的,其实他们都是寄存器,寄存器的内容是地址,而这个地址的含义是这个链表的下一个链表的地址。另外地址不是直接地址,专业名词为linkword,linkword和地址是有转换关系的。

  4. LCX是空闲的csa的最后一个吗?
    答:这个LCX是代表用户定义的最后一个csa地址,它也是个寄存器,内容就是链表地址,代表空闲的最后一个,初始化csa的时候一般需要设置FCX和LCX寄存器,另外,最后一个csa的地址要设置为null,这些设置是为了芯片可以执行自动切换csa的时候找到链表的头,设置链表尾是为了安全报trap使用的,比如LCX=FCX,代表空闲的csa耗尽了。

  5. call depth和CSA区间大小的关系?
    答:PSW.CDC的call depth最大能设置63个,是否意味着从CSA的头开始存,最大也只会占用63个?实际不是的,带有os的调用,每次的call调用是看不到最开头的,中间应该通过类似freertos的汇编语言自己可以去切换的。所以就算CDC没超过63,说不定空闲CSA也满了。

  6. CSA对象的增长方法是芯片固定好的吗?
    答:这个csa区域都是自定义的,所以链表的增长方向也是自定义的,一般就在初始化函数中设置的。

三,手册中CSA相关备忘

  1. lower csa的内容类似global寄存器。从函数或trap或中断返回值不会变,也不会从RTE(Return From Call)或RF(Return From Exception)E命令返回后自动回复。所以lower csa中寄存器的用途就是可以类似在多个function中传参。同时也要保证退出function的时候要保持值不变。

  2. upper context registers都是类似临时变量,在每个function中都有自己私有的值,不会被继承。只有A10, A11, PSW, PCXI and (in the case of a trap) D[15] registers在进入函数或trap或中断中已经定于好了值。其它的upper context register都没有定义值,若在写入前先读取则会报undefined operation。

  3. 最后一个空闲的CSA在第一次使用前,需要设置为NULL,用来支持FCU trap。第一次使用CSA前,PCX寄存器需要设置为NULL,来支持CSU trap。

  4. LCX寄存器需要设置为预期的最后一个空闲的csa,来支持FCD trap。

  5. 关于A11地址的理解
    对应调用函数,A11为返回函数返回地址。
    对应同步trap,A11保存的是trap触发时候的PC地址。
    对应SYSCALL或asynchronous trap或interrup,A11报错的地址是PC的下一条指令。

  6. PSW.CDC的7个bit包括2个区域; A call depth counter和mask最大溢出的有效宽度。若大于最大调用深度则会报trap class3 tin2。

  7. 中断和trap中的上下文切换
    若发生了,则PSW.IS bit一开始为0,代表不是用的中断stack,Stack Pointer先赋值为当前的Interrupt Stack Pointer,然后PSW.IS bit置1,开始执行中断栈。因为在Tricore中,栈分为USTACK和ISTACK, 他们的使用由PSW.IS位来决定,默认配置PSW.IS=0,即在线程中的函数调用时,会用USTACK(A11)部分作为CPU的栈,而在中断函数中会用ISTACK(ISP)作为CPU的栈。USTACK和ISTACK大小和位置是在Link文件中配置的。
    Interrupt Control Register (ICR)保存了当前的中断和之前的一个中断。ICR.CCPN代表当前的中断号,ICR.IE代表当前的中断是否使能,和被打断的中断优先级号ICR.PIPN。PCXI.PCPN和PCXI.PIE是之前的。每次进入中断或trap,然后upper csa中自动保存当前的中断号和使用位到PCXI,用于之后恢复。

  8. 进入函数调用,是硬件自动保存的upper csa。

四,mcal代码中csa初始化的理解

mcal代码的csa增长方向是向下的,高地址为尾部,低地址为头部。技巧就是看FCX(空闲csa的开始地址)和LCX(自定义的结尾地址)


image.png

五,小结

从理论到看代码,到最后调试,基本上tricore1.6内核的csa算基本明白了。

你可能感兴趣的:(Tricore1.6内核CSA学习--Apple的学习笔记)