【问题标题】:Can we use exit() function in C while working with embedded systems [closed]在使用嵌入式系统时,我们可以在 C 中使用 exit() 函数吗?
【发布时间】:2020-05-14 11:59:53
【问题描述】:

我正在从事一个与嵌入式系统相关的项目,想知道在您的程序中使用函数 exit(0) 是否是一种好习惯。

        if (Req[0] == '0')
        {
            puts("Emergency stop button operated\n");
            **exit(0);**
        }

【问题讨论】:

  • 这个问题的答案取决于您的系统和项目。当然exit 是标准C 函数,这意味着它可用于标准C 实现。它是否在您的 C 实现中可用,使用它是否适合满足您项目的目标和要求,以及它将在系统中产生什么影响,取决于您的 C 实现、您的项目和那些系统。如果您不知道,您应该询问指定项目要求的人员。
  • 一般来说,当您的目标是一个裸机环境(没有操作系统)时,您通常从不终止您的应用程序。那是因为,如果没有操作系统,除了首先调用 main 的启动代码之外,您实际上无法返回 *to* 。如果 main 返回时,启动代码的行为完全取决于平台(它可能会在无限循环中停止,它可能会执行软重置,谁知道)
  • @EricPostpischil 符合标准的独立实现不需要提供 stdlib.h。见 C17 4/6。
  • 另外,由于您的代码 sn-p 提到了紧急停止按钮,我很确定您的应用程序应该以适当的方式处理此类事件,我无法想象只是终止应用将是适当的。例如,想象一个控制重型机械的伺服控制器。如果用户猛踩紧急停止,那么伺服控制器必须对 1) 尽快和 2) 以明确定义的方式做出反应。在这种情况下,终止应用程序相当于说“哎呀,我不知道该怎么办”,并且很可能会为此付出生命的代价。
  • 当您在嵌入式系统上调用 exit 时会发生什么?

标签: c embedded coding-style exit


【解决方案1】:

exit,以及从main() 返回,仅在有操作系统可返回的托管系统中才有意义。大多数嵌入式系统没有这些,而是​​所谓的“独立”系统:“裸机”或 RTOS 微控制器应用程序。此类系统的编译器不需要提供stdlib.h,因此函数exit 甚至可能不可用。

在此类系统中处理错误的常规方法是实现自定义错误处理程序,该处理程序可以记录或打印错误。从那里开始,如果出现严重错误,您通常会引发看门狗重置,从而导致完整的系统重新启动。这是因为嵌入式系统中的错误通常与硬件有关,看门狗复位不仅将软件恢复为默认值,还包括所有 MCU 寄存器和连接到 MCU 的外围硬件。

在高度完整性的嵌入式系统中,例如那些实际上具有真正紧急停止功能的系统,保持程序运行但将其恢复到安全状态是很常见的。 MCU 继续运行,但所有危险输出等都被禁用,以允许系统以受控方式关闭,或者“跛行回家”并继续运行,以及它仍然有能力。为这样的系统编写软件本身就是一个很大的话题。

【讨论】:

    【解决方案2】:

    简短的回答,正如@Felix G 在评论中所说:如果您使用操作系统,exit(0); 是相关的,如果您使用裸机应用程序,则不。

    更多详情请参考@Felix G 评论。

    顺便说一句,**exit(0);** 不是 C 语言中的正确语句。您可能指的是 exit(0);/*exit(0);*/

    【讨论】:

    • ** 的内容可能只是为了强调 SO 网站的 bold (**bold**) 格式。它在代码格式中不起作用。
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2010-09-20
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多