使用uc/os开发要明确的几个堆栈

uc/os启动前的堆栈和uc/os启动后的堆栈

1、uc/os启动前所使用的堆栈

该堆栈为启动文件第一行指定的堆栈,在IAR中,由人工指定该堆栈的大小,标号为CSTACK。在keil中只好像没看到。其位置由编译器指定,一般是紧跟静态存储区的末尾。

在处理器的启动代码中,在向量表首部放置CSTACK指针

DCD     sfe(CSTACK)
 
 
  • 1
  • 1

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];
 
 
  • 1
  • 1

而不是之前由编译器指定的那个区域了。这个堆栈的初始化是在OSInit()中的OSInitHookBegin()进行的。 
突然一个问题想不通但又想通了。 
既然中断进入的时候只保存r0-r3和人R12,SP,LR和xSPR,如果在中断进入前的程序使用了除上述保存之外的寄存器那不就乱了吗?其实,用不用是由编译器决定的,如果中断程序是要用到这些寄存器,那么程序在编译的时候会事先将其压入堆栈,到了中断返回的时候再将其内容出栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值