Arduino内存类型,学术
Arduino memory types, academic
亲爱的Stackoverflow用户,
我有一个有趣的问题,我希望听到你的意见,也请纠正我的任何部分。
在正常的PC中,内存地址分成3部分,堆栈,堆,全局,(现在让我们忘记外设),所以如果我继续做一个坏的递归函数,用调用填充堆栈,操作系统会发送stackoverflow的消息,也如果我用一个新的关键字做一个无限循环,它会用垃圾数据填充堆,并得到类似段错误的东西,但如果我在arduino项目中犯这样的错误呢?
try/catch块不在游戏中,所以我试图在loop()中实现自己的错误处理,滥用预处理器的愚蠢:
#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);
}
}
现在你可能不会立即看到这里的技巧所以这是你在预处理后得到的:
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);
}
}
所以我的问题是,如果内存因为某种原因而满了,函数调用能够被执行吗?因为THROW宏总是调用loop(),所以我的想法是从当前上下文中"逃脱"并进入无限循环
对不起,我的英语不好
所以,如果你想退出一个函数并回到你来的地方,你应该离开这个函数,而不是调用原来的函数!要么从函数返回,要么使用setjmp
和longjmp
。
在所有情况下,您还需要担心"如何清理数据"。换句话说,如果你分配内存,那么你需要在离开函数之前释放它,如果你打开了一个文件,你需要关闭它,等等。
这类事情是RAII原则非常有用的地方,但它假设您将函数置于编译器的知识之下,而不是不进行清理就跳转回主循环。它迟早会引起问题。
还请注意,堆栈溢出的行为是未定义的行为-它可能会立即使程序崩溃,或者它可能会导致堆被覆盖,格式化您的硬盘/SD卡,或者它可能会导致守护进程飞出您的鼻子。或者任何你能想到的东西。它是未定义的,你不能指望它做任何特别的事情-只是"你不应该这样做"。
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 类型总是使用其大小存储在内存中吗
- 使用模板类的自定义列表类型中的内存泄漏
- 具有 STL 向量类型成员的类的复制内存
- 内存中的长长类型表示形式
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 为模板参数类型中的新对象分配内存
- 如何创建非 POD 类型的连续内存池?
- 内存效率:模板与基本数据类型
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 避免在禁用复制的 POD 类型的内存上使用"-Wclass-memaccess"
- 为什么 vkGetPhysicalDeviceMemoryProperties 返回多个相同的内存类型?
- 为什么 XOCDE STL 源内存类型定义有 |象征
- 有没有办法区分对象实例使用的内存类型
- 提升共享内存类型
- c++中等效的内存类型是什么?
- Arduino内存类型,学术
- 在内核调用(计算1.1或1.2)期间,仅用于设备计算的CUDA内存(类型)