【问题标题】:How are runtime errors handled in embedded C?嵌入式 C 中如何处理运行时错误?
【发布时间】:2021-08-06 15:44:44
【问题描述】:

就像 C 中变量的“除以 0”错误。

int x = 0;
int y;
y = 12/x;

【问题讨论】:

  • 问题不清楚。它过于宽泛(运行时错误很多!)。
  • 这取决于运行错误程序的嵌入式系统。它因系统而异。不过,其中任何一个的结果都不太可能是好的。
  • 对我来说似乎相当清楚 - 当然可以回答 - 我已经准备好了答案。希望 SO 将允许发布正在进行的答案 :-( - 令人沮丧的打字。无论如何,简短的版本:C 没有定义运行时错误处理,执行环境可能会为硬件检测到的问题提供异常处理程序,例如 div-by-zero,支持错误对齐、无效地址等。通常在嵌入式系统中,您负责提供合适的处理程序,默认值通常只是等待看门狗重置的无限​​循环。
  • @Clifford 我和你一样感到沮丧。有时我会故意发布一个不完整的答案,只是为了发布它,然后在一系列编辑中完成它。我必须权衡读者看到不完整答案的困惑,以及如果我不这样做,我自己就无法完成它的挫败感。 (从理论上讲,这是我的不良行为:如果我知道问题即将结束,可以说我根本不应该回答。)
  • 另外,“嵌入式 C”这个问题太宽泛了。固件支持的能力与硬件一样千差万别。 8 针 ATtiny 和双核 ARM 部件之间的巨大差异。

标签: c embedded microcontroller


【解决方案1】:

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 )
    {
    }
}

【讨论】:

  • 谢谢!!很有帮助
【解决方案2】:

C 编程不支持运行时错误检查

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2015-12-06
    • 2016-03-31
    • 2019-06-23
    相关资源
    最近更新 更多