嵌入式 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 编程不支持运行时错误检查