首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino记忆类型,学术

Arduino记忆类型,学术
EN

Stack Overflow用户
提问于 2015-09-02 17:16:52
回答 1查看 95关注 0票数 0

亲爱的斯塔克溢出用户:

我有一个有趣的问题,我希望听到你的意见,也请纠正我的任何部分。

在普通PC中,内存累加分为3部分:堆栈、堆、全局(现在让我们忘记外围设备),所以如果我继续做一个错误的递归函数,用调用填充堆栈,OS将发送堆栈溢出的消息,如果我在其中使用一个新关键字进行无限循环,它将用垃圾数据填充堆,得到类似分段错误的信息,但是如果我在arduino项目中犯了这样的错误怎么办?

try / catch块不在游戏中,所以我尝试在循环()中实现错误处理,滥用预处理器的愚蠢性:

代码语言:javascript
复制
#define THROW(errval)       \
ERROR = errval;             \
loop()

#define TRY                 \
if(ERROR == 0)

#define CATCH(err)              \
else if(err == ERROR)

#define FINALLY                 \
if(ERROR != 0)

#define OUT_OF_MEMORY 1    

int ERROR = 0;

void random_routine() {
    if(/*something goes wrong*/) {
        THROW(OUT_OF_MEMORY);
    }
}

void start() { Serial.begin(9600); }
void loop() {
    TRY {
        random_routine();
    } CATCH(OUT_OF_MEMORY) {
        Serial.println("out of memory");
    } FINALLY {
        while(true);
    }
}

现在,您可能不会立即看到这里的诀窍,这就是您在预处理之后得到的结果:

代码语言:javascript
复制
void random_routine() {
     if(/*something goes wrong*/) {
          ERROR = 1;
          //this call is the body of my exception handling solution
          //and the question is about this as well
          loop();
     }
}
void start() { Serial.begin(9600); }
void loop() {
     ///TRY-s macro result
     if(ERROR == 0) {
         random_routine();
     ///chainable CATCH blocks
     } else if(ERROR == 1) {
         Serial.println("Out of memory");
     }
     ///FINALLY block
     if(ERROR != 0) {
         while(true);
     }
}

所以我的问题是,如果内存因为某种原因而满了,函数调用是否能够被执行呢?因为抛出宏总是调用循环(),所以我的想法是“逃离”当前上下文并进入无限循环。

抱歉,我的英语不好

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-02 22:43:57

因此,如果您想退出一个函数并返回到您来自的位置,您应该离开该函数,而不是调用原始函数!要么从函数返回,要么使用setjmplongjmp

而且在所有情况下,你也需要担心“如何清理数据”。换句话说,如果您分配内存,那么您需要在离开函数之前释放它,其中您已经打开了一个文件,您需要关闭它,等等。

这类东西是RAII原理非常有用的地方,但它假设您将函数放在编译器的知识之下,而不是仅仅跳回主循环而不进行清理。它迟早会引起问题。

还请注意,带有堆栈溢出的行为是未定义的行为--它可能会立即使程序崩溃,或者会导致堆溢出、格式化您的硬盘/SD卡,或者可能导致守护进程从您的鼻子上飞出。或者其他你能想象得到的东西然后一些。它是没有定义的,你不能依赖它来做任何事情--只是“你不应该这样做”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32359330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档