在嵌入式编程中,栈是一个很重要的概念,不管是裸机编程还是基于RTOS编程。函数形参、局部变量、函数调用现场的保护及返回地址、中断函数执行前线程保护及中断嵌套的现场的保护都依赖于栈空间。栈空间不足,程序执行过程中栈溢出,极大可能的影响程序、系统的稳定,严重时会造成程序、系统的崩溃,所以堆栈溢出检测十分重要且必要。
什么是堆,什么是栈
堆和栈都是指预先分配的空间,有大小限制,两者通常是相邻的两个内存区域(RTOS中任务的堆和栈可能不相邻),供程序使用,堆和栈的最大差异是,堆空间通过xxmalloc接口动态使用。
堆栈大小的定义
在裸机编程时,栈大小在启动文件中定义;在基于RTOS编程时,RTOS自身的栈大小在启动文件中定义,任务/线程的栈由RTOS进行定义。通常在RTOS中我们采用动态方式创建任务/线程,这时任务的栈空间实际上在堆中,大小由输入参数决定;如果采用静态方式创建任务/线程,通常是创建静态数组作为任务/线程的栈空间。
管理堆栈的堆栈指针
不同的内核对于堆栈的定义、管理都有差异,