uc/os启动前的堆栈和uc/os启动后的堆栈
1、uc/os启动前所使用的堆栈
该堆栈为启动文件第一行指定的堆栈,在IAR中,由人工指定该堆栈的大小,标号为CSTACK。在keil中只好像没看到。其位置由编译器指定,一般是紧跟静态存储区的末尾。
在处理器的启动代码中,在向量表首部放置CSTACK指针
DCD sfe(CSTACK)
M3复位启动后第一件事就是从0x00000000处获得MSP的指针,此时MSP=sfe(CSTACK)即操作系统启动前没有利用从堆栈。
2、uc/os启动后的堆栈
1、任务堆栈(从堆栈)
没什么好说的,各个任务的独立堆栈。
2、异常堆栈(主堆栈)
操作系统启动后,MSP变为由操作系统定义的
OS_CPU_EXT OS_STK OS_CPU_ExceptStk[OS_CPU_EXCEPT_STK_SIZE];
而不是之前由编译器指定的那个区域了。这个堆栈的初始化是在OSInit()中的OSInitHookBegin()进行的。
突然一个问题想不通但又想通了。
既然中断进入的时候只保存r0-r3和人R12,SP,LR和xSPR,如果在中断进入前的程序使用了除上述保存之外的寄存器那不就乱了吗?其实,用于不用是由编译器决定的,如果中断程序是要用到这些寄存器,那么程序在编译的时候会事先将其压入堆栈,到了中断返回的时候再将其内容出栈。