使用uc/os开发要明确的几个堆栈
2015-09-19 11:11
671 查看
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,如果在中断进入前的程序使用了除上述保存之外的寄存器那不就乱了吗?其实,用于不用是由编译器决定的,如果中断程序是要用到这些寄存器,那么程序在编译的时候会事先将其压入堆栈,到了中断返回的时候再将其内容出栈。
相关文章推荐
- 天声人語 20150919
- 风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS
- ESP8266 Linux开发环境搭建
- javascript DOM技术常用操作
- 关于xcode不同版本打开相同工程问题
- AngularJs学习之ng-repeat
- LintCode --number-of-airplanes-in-the-sky(数飞机)
- IOS类与类之间的传值
- jstorm 环境搭建
- matlab批量读取文件
- HDU 1010.Tempter of the Bone【DFS+奇偶性剪枝】9月19
- ZOJ - 3623 Battle Ships(完全背包或者BFS)
- XOR Linked List – A Memory Efficient Doubly Linked List
- PHP基础------GD库绘制验证码
- 另一种斐波那契数列
- ThinkPHP 双重循环遍历输出
- 字符串的应用
- hdoj 1212Big Number(大数取模)
- Android任意处代码跳转固定activity 的思路
- ftp的get命令