在执行一个函数的时候,这个函数所需的堆栈空间在一开始就全部分配了,另外还有额外的LR也要被压栈
遇到寄存器压栈SP-4,其它的SP每次分配8的倍数个单元,但是优先要补充因为压入寄存器导致的不是8的倍数。也就是说,每次(寄存器压栈个数+局部变量压栈个数)总是8的倍数,如果遇到临界情况(也就是数据刚好是8的倍数个),则为保险起见多分配8个空间(少的时候多分配,多了就不再多分配了,24个为临界:如果刚好是24个,则多分配8个;多于24个的8的倍数,不多分配--IAR)
IAR堆栈的分配原则:
①在刚一跳转到函数时,这个函数所需要的堆栈空间就全部一次被分配完成了;
②这个函数需要分配堆栈的内容有要保存的寄存器(如LR)和函数内部用到的全部局部变量;
③以上堆栈分配的总和是8的倍数,例如即使总和是9,也要分配16个,总和在9~15之间的都是分配16个。如果要分配的堆栈字节数小于等于24并且刚好是8的倍数,则额外多分配8个字节;大于24则不再多分配。也就是说如果函数需要的堆总栈字节数(要保存的寄存器+函数内部的局部变量)是8、16、24,则实际分配了16、24、32个空间
******************************
问题:在Cortex-M3及以后的处理器中,如果使用者只运行在特权模式下,那么IAR 分散描述文件中的CSTACK 分配的RAM大小没什么实际用处了。因为在中断向量表中已经指定了SP的初始地址是在整个RAM的顶端,并不是在CSTACK里面(当然如果指定到CSTACK里面也可以,这时候就有用处了),所有的异常是在现有MSP中处理的,也不涉及到CSACK中的“堆栈”空间。
阅读(3850) | 评论(0) | 转发(0) |