您当前的位置:五五电子网电子知识电子知识资料计算机应用基于KeyStone器件建立鲁棒性系统分析 正文
基于KeyStone器件建立鲁棒性系统分析

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

点击数:7468 次   录入时间:03-04 12:03:42   整理:http://www.55dianzi.com   计算机应用

    关于基本的EDMA TC 错误信息可以参考“KeyStone Architecture Enhanced Direct Memory Access(EDMA3) Controller User Guide(SPRUGS5)”中的“错误产生”章节。



www.55dianzi.com

    所有的EDMA 错误事件可作为异常被路由到 CorePAC。

    事件丢失错误是一种最常见的EDMA CC 错误,意味着EDMA 不能按要求及时完成数据的传输,或者错误的事件触发了不应该的EDMA 传输。

    总线错误是一种最常见的EDMA TC 错误,通常意味着EDMA 访问了错误的地址(如预留地址或受保护的地址)。

    4.3 中断丢失检测

    中断丢失或遗漏是实时系统中常见也是常被忽略的问题。中断丢失检测是一种用于捕捉这种异常的有效方法。对基本的中断丢失检测信息参考“TMS320C66x DSP CorePac User Guide(SPRUGW0)”中“中断错误事件”章节。

     

    软件系统应该对路由到DSP core 且有对应软件服务的中断使能中断丢失检测。在所有中断配置完毕后可以添加如下代码使能中断丢失检测:

    注意,当使能中断丢失检测并在CCS/Emulator 下使用断点或单步进行调测时,由于在仿真停止时中断没有被响应,所有此时中断丢失错误上报的概率很高。如果想忽略它,可以在调测时暂时对某些或全部中断关闭中断丢失检测,但是注意不要忘记在正式发布的程序中重新使能该功能。

    5 异常处理

    关于异常处理的基本信息参考“TMS320C66x DSP CPU and Instruction Set Reference Guide(SPRUGH7)”中“CPU 异常”一节。

    关于中断或异常事件路由的基本信息参考“TMS320C66x DSP CorePac User Guide(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 标志寄存器来决定异常原因。对应一个特定的异常,往往有特定的状态寄存器可以检查、记录或上报。例如对应内存保护异常,需要记录的关键信息是故障地址。参考各模块的用户指南了解相关状态或标志的更多细节。

     

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



www.55dianzi.com

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

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

    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 及内部异常是使能的。

    当一个使能的异常发生在第一个异常服务程序中时,复位向量指向的程序会被执行。这时NTSR和NRP 不会发生改变。TSR 复制到ITSR,此时的PC 复制到IRP。此时为了避免其他外部异常,硬件将TSR 设置为默认的异常处理值,NMIE 中的IER 比特被清零。

    通常中断服务表中的复位向量是跳转到程序起始位置如_c_int00,这样,嵌套异常会重启程序。然而这并非大部分用户所期望的,我们通常期望的是异常发生时在异常服务程序执行完后结束程序。为了避免嵌套异常导致程序重启,可以给嵌套异常添加一个额外的异常服务程序,用户可以修改复位向量跳转到嵌套异常服务程序。在KeyStone 器件中,加载程序不依赖于复位向量启动程序,所以修改复位向量不会影响程序的加载。

    6 例程

    本文相关的例程可以在TCI6614 EVM, C6670 EVM 及C6678 EVM 上跑通。例程可以从以下链接下载:

上一页  [1] [2] [3] [4] [5]  下一页


本文关键字:暂无联系方式计算机应用电子知识资料 - 计算机应用