器件型号: CC3551E
您好、
就可以在 CC35x1 LaunchPad 上的调试会话中看到 (Rev E3) 使用 SimpleLink Wi-Fi SDK (9_19_00_02_ea)、我无意中发现了“\simplelink_wifi_sdk_9_19_00_02_ea\kernel\freertos\exception\ExceptionArmV8m.c"中“中的中的异常解码 — 例如,exception_decodeBusFault:
/*
* ======== Exception_decodeBusFault ========
*/
static void Exception_decodeBusFault(Exception_ExceptionContext *exceptionContext)
{
uint8_t bfsr = (SCB->CFSR & SCB_CFSR_BUSFAULTSR_Msk) >> SCB_CFSR_BUSFAULTSR_Pos;
/* Decode BFSR to determinte what kind of MemFault it is. */
if (bfsr & SCB_CFSR_STKERR_Msk)
{
Log_printf(LogModule_Exception,
Log_ERROR,
"Exception_decodeBusFault: BusFault caused by stack push. (STKERR)");
}
BFSR 变量/值被很好地提取、被屏蔽并向下移动。 但下面的所有 if-else 子句都使用掩码、例如 SCB_CFSR_STKERR_MSK、其中包含应直接应用于 SCB->CFSR 寄存器的相同数量掩码和移位:
#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ #define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ #define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */
[simplelink_wifi_sdk_9_19_00_02_ea\source\ti\devices\cc35xx\cmsis\core\core_cm33.h]
也就是说、应完全删除“BFSR",“,if-else、if-else 子句应直接使用 SCB->CFSR:
/*
* ======== Exception_decodeBusFault ========
*/
static void Exception_decodeBusFault(Exception_ExceptionContext *exceptionContext)
{
/* Decode BFSR to determinte what kind of MemFault it is. */
if (SCB->CFSR & SCB_CFSR_STKERR_Msk)
{
Log_printf(LogModule_Exception,
Log_ERROR,
"Exception_decodeBusFault: BusFault caused by stack push. (STKERR)");
}
exception_decodeUsageFault () 也是如此。
(而且只是为了对称,也对于 exception_decodeMemFault(),但是移位为零,所以没有造成伤害。
对吗?