堆和栈是两种数据存储方式,其中栈是一种后进先出(LIFO)的存储方式,而堆是一种不受顺序限制的存储方式。在stm32中,栈是指存储CPU在处理中断、函数调用时所用的数据。
当CPU要执行函数时,需要将函数的返回地址压入栈中,以保证函数执行完后能返回到正确的地址。另外,在函数中定义的局部变量也会存入栈中,函数执行完后,这些局部变量占用的栈空间也会被释放。
stm32的内部SRAM分为两部分,一部分用作系统堆栈空间,另一部分用作C库的堆空间(malloc等函数使用)。其中系统堆栈空间大小是由启动文件(startup.s)中指定的,一般为512字节或1024字节。如果堆栈空间大小不够用,会导致数据溢出,从而引发系统错误或异常。
为了确保堆栈空间的充足,可以通过以下两种方式进行优化:
1、在启动文件中增加堆栈空间的大小
2、尽量避免在中断处理程序中申请大量的局部变量,同时合理使用全局变量与静态变量
在stm32中,有两个堆栈指针寄存器:MSP(主堆栈指针)和PSP(进程堆栈指针)。其中MSP是专门用于存储系统堆栈空间的指针,而PSP则是用于存储任务堆栈空间的指针。
在stm32使用中,一般情况下系统默认使用MSP作为堆栈指针,但是在多任务环境下,也可以通过切换PSP来实现任务之间的堆栈切换。在任务切换时,PSP的值会被保存到系统堆栈空间中,然后再从系统堆栈空间中取出新任务的PSP值,进行堆栈切换。
堆栈异常是指在堆栈操作中出现的错误或意外情况。由于堆栈空间是用于存储函数返回地址和局部变量等数据,所以一旦出现堆栈异常,很可能导致程序的崩溃或异常。
在stm32中,堆栈异常一般包括以下几种情况:
1、堆栈指针溢出:当堆栈指针超过指定的堆栈空间范围时,会导致数据溢出,从而引发堆栈异常。
2、堆栈指针错误:当堆栈指针赋值错误时,也会导致堆栈异常。
3、栈帧结构错误:栈帧结构出现错误也会导致堆栈异常。
为了避免堆栈异常的发生,需要合理利用系统堆栈空间,避免栈空间溢出;同时,也需要正确处理任务之间的堆栈切换,并确保堆栈指针的正确性。