diff --git a/Demo-Build/RISC-V32/readme.txt b/Demo-Build/RISC-V32/readme.txt index d132a0d6..fd3a5a1f 100644 --- a/Demo-Build/RISC-V32/readme.txt +++ b/Demo-Build/RISC-V32/readme.txt @@ -169,3 +169,36 @@ MPIE:进中断前中断使能状态 MIE: 机器模式中断使能 */ +-------------------------------------------------------------------------------- + +补充说明-硬件压栈可靠性测试 + +决定硬件压栈技术是否稳定可靠的关键因素,在于 port_rv32_HWS.S 中的最后三句代码。 +简单来说,内核解锁后,最后两句代码(断点1、断点2)已不在服务层临界区的保护之中。 +如果在内核解锁前,系统中断(SysTick、PendSV)已经被触发,要保证在内核解锁之后, +在最后两句代码(断点1、断点2)执行完之前,不会响应系统中断。否则说明硬件压栈技 +术是不可靠的,不能使用。 + +为此,特提供两种测试方法给自己和用户,以方便验证硬件压栈技术的可靠性。 + +方法一 +在 port_rv32_HWS.S 中,通过自行 #define __TEST_PENDSV 来开启测试。 +该测试已在内核解锁之前触发 PendSV,在内核解锁之后,如果由 断点1 或 断点2 再入 +PendSV,当由 PendSV 直接返回后将跳转至 test_pendsv_fault_handler。 +用户可在该处理函数中通过 打印 或 点灯 等方式,来报告异常发生。 +/* 示例 */ +void test_pendsv_fault_handler(void) +{ + printf("hardware stack test error\r\n"); + while(1); +} + +方法二 +在 pendsv_hook 中打印 mepc,持续一定时间后数据统计,如果 mepc 出现过 断点1 +或 断点2 的地址,判定异常发生。 +/* 示例 */ +__WEAK void pendsv_hook(void) MCUCFG_OSIT_ATTRIBUTE +{ + printf("mepc: %#x\r\n", __get_MEPC()); +} +