基于KeyStone 器件建立鲁棒性系统
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 及内部异常是使能的。
当一个使能的异常发生在第一个异常服务程序中时,复
- HyperLink编程和性能考量(01-15)
- 在KeyStone 器件实现IEEE1588 时钟方案(10-15)
- 基于多核处理器的弹载嵌入式系统设计研究(02-18)
- Navigator Runtime 最大限度提高多内核效率(05-08)
- 基于KeyStone DSP的多核视频处理技术(09-15)
- KeyStone多核SoC工具套件: 单个平台满足所有需求(09-07)