嵌入式 C 中如何处理运行时错误?
How are runtime errors handled in embedded C?
就像 C 中变量的 'Divide by 0' 错误。
int x = 0;
int y;
y = 12/x;
C 语言没有定义运行时错误处理。关于语言,它会导致未定义的行为。这并不意味着执行环境不能定义特定的行为或处理。
除以零、无效地址、无效对齐等通常由运行时环境作为异常处理程序处理(在处理器支持任何此类异常的情况下)。
在嵌入式系统中,您通常负责提供合适的异常处理程序,因为默认的运行时代码将是通用的,并且不知道特定系统对出现此类错误有什么支持。如果它是带有供应商提供的 BSP 的 COTS 板,您可能会得到更多,如果您是 运行 任何类型的 RTOS,不仅仅是简单的调度内核,它可能会提供支持。
例如,在使用 CMSIS 的 ARM Cortex-M 上,您通常有一个 startup_xxxx_.s 文件(其中 xxxx 是目标设备名称),例如:
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
请注意,它们都有“弱链接”,这意味着如果您定义了一个具有相同名称的处理程序(并且在 Cortex-M 上可以是 C 函数),它将覆盖默认值。所以你可能有:
void HardFault_Handler(void)
{
volatile int stop = 1 ;
// Emit status registers and stack dump (for example),
// or just a message.
...
// If debugger is connected, halt program here
if (CoreDebug->DHCSR & 1) {
__breakpoint(0);
}
// infinite loop, allow debugger
// to force return by clearing `stop`.
while( stop )
{
}
}
C 编程不支持运行时错误检查
就像 C 中变量的 'Divide by 0' 错误。
int x = 0;
int y;
y = 12/x;
C 语言没有定义运行时错误处理。关于语言,它会导致未定义的行为。这并不意味着执行环境不能定义特定的行为或处理。
除以零、无效地址、无效对齐等通常由运行时环境作为异常处理程序处理(在处理器支持任何此类异常的情况下)。
在嵌入式系统中,您通常负责提供合适的异常处理程序,因为默认的运行时代码将是通用的,并且不知道特定系统对出现此类错误有什么支持。如果它是带有供应商提供的 BSP 的 COTS 板,您可能会得到更多,如果您是 运行 任何类型的 RTOS,不仅仅是简单的调度内核,它可能会提供支持。
例如,在使用 CMSIS 的 ARM Cortex-M 上,您通常有一个 startup_xxxx_.s 文件(其中 xxxx 是目标设备名称),例如:
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
请注意,它们都有“弱链接”,这意味着如果您定义了一个具有相同名称的处理程序(并且在 Cortex-M 上可以是 C 函数),它将覆盖默认值。所以你可能有:
void HardFault_Handler(void)
{
volatile int stop = 1 ;
// Emit status registers and stack dump (for example),
// or just a message.
...
// If debugger is connected, halt program here
if (CoreDebug->DHCSR & 1) {
__breakpoint(0);
}
// infinite loop, allow debugger
// to force return by clearing `stop`.
while( stop )
{
}
}
C 编程不支持运行时错误检查