大疆嵌入式凉经
全部评论
细说一下:是问我RTOS里怎么避免和检测任务栈溢出;问我RTOS里用堆(malloc)和全局数组做任务栈有什么区别。
以FreeRTOS为例。
有两种栈溢出检测办法。
第一种方法是在任务切换的时候检测栈指针是否越界(比较任务控制块TCB中的指向栈尾的指针和指向当前栈的指针),如果越界会触发栈溢出钩子函数vApplicationStackOverflowHook。这个方法速度比较快,但是不能检测所有栈溢出(比如任务执行过程中,在任务切换前发生了栈溢出,但在切换前又恢复正常,这无法检测)。
第二种方法在任务创建的时候将任务栈初始化为0XA5,任务切换的时候检查栈末尾16个字节是否为0xa5,假如不是,说明发生栈溢出 然后调用上面那个钩子函数。
通过宏taskCHECK_FOR_STACK_OVERFLOW 来选择方法1还是方法2。
配置为1则选择方法1,配置大于1则为方法2。
RT-Thread的检测貌似也是在任务发生调度切换的时候判断,方法主要是通过判断栈末尾是不是#来判断栈是不是溢出。
相关推荐
10-30 16:54
华南师范大学 C++ 点赞 评论 收藏
分享