微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于KeyStone 器件建立鲁棒性系统

基于KeyStone 器件建立鲁棒性系统

时间:10-29 来源:互联网 点击:

de(SPRUGW0)”中“中断控制器”章节。

5.1 异常事件路由

所有源自或由CorePac 触发的错误事件均直接路由到CorePac 的中断控制器。常被当作异常处理的错误如下表所示。

一些其他非致命的错误事件,如可纠正的LL2 EDC 错误,应该被路由到中断而非异常。

源自或者由器件中共享模块触发的错误事件被路由到CIC。CIC 基本信息参考“KeyStone Architecture Chip Interrupt Controller(CIC) User Guide(SPRUGW4)”。

CIC 事件中常被当作异常处理的事件如下表所示。

每种这样的异常事件只能路由到一个CorePac。通常所有的这些事件被路由到一个CorePac。 下图描述DSP core 内部控制异常处理的开关。

一旦软件置位TSR.GEE 及IER.NMIE,不能再由软件清除,只能在复位后被清除。

TSR.XEN 可以由软件置位并清除。XEN 可以在进入异常服务函数中由硬件自动清除,并在退出异常服务函数时自动恢复原来的状态。

因此,默认情况下,在中断服务函数中,TSR.GEE=1,IER.NMIE=1 及TSR.XEN=0.

5.2 异常服务函数

异常函数中应该记录或上报异常原因及相关信息,用于故障分析。

关键的记录信息是NRP。NRP 是异常返回指针,通常用于确定异常触发的位置。

实际上,非法操作与NRP 捕获之间的时延大概在10~100 个DSP Core cycles 之间,具体的时延取决于很多因素,如操作类型,产生异常事件的模块等等。例如对于向一个被MPU 保护的寄存器执行写操作,其时延包括:从DSP core 到寄存器的写指令时延;错误事件从MPU 到CIC 然后 到CorePac 异常模块的路由时延。因此,当我们获得NRP 后,应从NRP 指向的位置向后搜索大概10~100cycles 来找有问题的操作。

不过,某些异常NRP 是没有意义的,例如,对于指令获取异常及非法操作码异常。这通常发生在当程序跳转到一个非法的地址时,这时NRP 也指向一个非法的地址。我们真正想知道的是在程序跳转到非法地址前到底发生了什么,但是这并不能从NRP 推导出来。在这种情况下,寄存器B3,A4,B4,B14 及B15 也许会有所帮助。B3 可能还保存着上次函数调用的返回指针;A4 及B4 也许保存着上次函数调用的参数;B15 是栈指针;B14 是指向某些全局变量的数据指针。更多的细节可以参考“TMS320C6000 Optimizing Compiler User Guide(SPRUG187)” 中“7.4 函数结构及调用约定”章节。根据这些信息,我们也许可以推导出在程序跳转到非法地址前发生了什么。注意,B3,A4,B4 可能在异常发生前已经被修改用于保存其它信息,所以它们也许不是有用的。实际上,B3,A4,B4 包含有价值信息的概率还是很高的,所以这些寄存器是值得记录并分析的。

通用寄存器的值不能用C 代码记录,而必须用汇编代码来记录。下面的例子是将B3,A4,B4,B14,B15 寄存器记录在“exception_record”中,然后调用 “Exception_service_routine”。

其它需要记录的基本信息有:EFR,IERR,NTSR,TSCL/TSCH. EFR 用于判决异常类型:内部、外部或是NMI。对于内部异常,内部异常的原因记录在IERR。NTSR 记录异常发生时的DSP core状态。记录的TSCL/TSCH 用于确定异常发生前器件运行的时长。

对于外部异常,通过检查INTC 及CIC 标志寄存器来决定异常原因。对应一个特定的异常,往往有特定的状态寄存器可以检查、记录或上报。例如对应内存保护异常,需要记录的关键信息是故障地址。参考各模块的用户指南了解相关状态或标志的更多细节。

通常,异常服务函数将这些异常信息保存在一个类似如下的数据结构中。

可以在异常服务函数中将这些数据结构中的信息传递给主机,或者将其导出来进行错误分析。

通常异常服务函数处理的错误是致命的,用户不应该期望从异常服务函数中返回。另外,软件也不总是能从异常服务函数中安全返回,阻止从异常中安全返回的条件有:

1. 被异常终止的SPLOOPs 不能正确地重新开始。在返回前应该核实NTSR 中的SPLX 比特数值为0.

2. 中断被堵塞时发生的异常不能正确地重新开始。在返回前应该核实NTSR 中的IB 比特数值为0.

3. 在不能被安全中断的代码处(如一个保护多个赋值的紧凑循环)发生的异常不能正确地返回。编译器通常会在代码中的这些地方关闭中断;查看NTSR 中的GIE 比特值为1 来验证满足这个条件。

4. NRP 不是一个合法的地址。

所以通常异常服务函数以一个while(1)循环作为结束。

默认情况下在异常服务程序中,TSR.GEE=1,IER.NMIE=1 及TSR.XEN=0.即在异常服务程序中NMI 及内部异常是使能的。

当一个使能的异常发生在第一个异常服务程序中时,复

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top