在编写代码时,我经常检查是否发生错误。一个例子是:
char *x = malloc( some_bytes );
if( x == NULL ){
fprintf( stderr, "Malloc failed.\n" );
exit(EXIT_FAILURE);
}
我过去也使用过 strerror( errno )
。
我只写过小型桌面应用程序,在出现错误的情况下程序exit()
ed 并不重要。
但是,现在我正在为嵌入式系统 (Arduino) 编写 C 代码,我不希望系统在出现错误时退出。我希望它进入一个特定的状态/功能,它可以关闭系统、发送错误报告和安全空闲。
我可以简单地调用一个 error_handler()
函数,但我可能处于堆栈深处并且内存非常低,导致 error_handler()
无法运行。
相反,我希望执行能够有效地折叠堆栈,释放大量内存并开始整理掉电和错误报告。如果系统不能安全关闭电源,则存在严重的火灾风险。
是否有在低内存嵌入式系统中实现安全错误处理的标准方法?
编辑 1:
我将限制在嵌入式系统中使用 malloc()
。在这种特殊情况下,如果文件格式不正确,则在读取文件时会发生错误。
最佳答案
也许你在等待圣洁setjmp
/longjmp
,那个来拯救他们所有渴望内存的罪孽的人?
#include <setjmp.h>
jmp_buf jumpToMeOnAnError;
void someUpperFunctionOnTheStack() {
if(setjmp(jumpToMeOnAnError) != 0) {
// Error handling code goes here
// Return, abort(), while(1) {}, or whatever here...
}
// Do routinary stuff
}
void someLowerFunctionOnTheStack() {
if(theWorldIsOver)
longjmp(jumpToMeOnAnError, -1);
}
编辑:出于与您所说相同的原因,最好不要在嵌入式系统上执行malloc()
/free()
。简直拿不准。除非您使用大量 返回码/setjmp()
来释放堆栈中的所有内存...
关于c - 出现错误时安全退出到特定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537230/