栈的概念及作用

1.栈:

栈也是一块内存空间,CPU的SP寄存器会指向当前栈的存储位置,它可以用于函数调用局部变量,多任务系统保存现场。

1.1函数调用在栈中是怎样的过程?

程序从main()函数开始运行。

我们假设这么一个场景main函数调用a函数,a函数调用b函数和c函数。

BL指令是用来调用函数的,在调用时lr保存返回地址,pc来跳转下一条语句地址。

1.1.1函数在调用时lr被覆盖怎么办?

有三个过程:

1、在进入函数时根据PUSH指令在栈中划出自己的栈

2、在进入函数时用PUSH指令保存LR的值以及必要的寄存器入栈(必要的寄存器包含lr寄存器)

这里涉及一个概念,当我们不使用 volatile语句时程序会自行优化,因为读寄存器特别快,程序会优先将数据放到寄存器中,寄存器满了。会将新数据存在寄存器旧数据会存在栈里。如果使用volatile语句时,程序会将数据先存放在寄存器不管寄存器满不满它都会将数据放在栈里。

3、保存局部变量

将函数的局部变量放入栈进行保存。

1.1.2局部变量在栈中分配,如何分配?

根据PUSH指令先划出自己的栈(用寄存器来占位(函数栈的基础大小),lr寄存器的值放在栈顶)。根据指令一直存到调用下一个函数,那该函数当前栈就是从存储lr的位置到调用时用栈空间的大小。

如果没有再调用别的函数,函数的栈就是从存储lr的位置到当前函数执行完成后所占栈的大小,函数执行完成后它在栈中的空间会被释放掉。

1.2.3为何RTOS任务都有自己的栈?

rtos会依靠滴答定时中断来切换任务,在切换时需要保护被切换任务的现场(所有寄存器的值),恢复下一个任务的现场。

保存现场

在任务a的结构体里记录SP(SP指向被切换任务的寄存器(包括PC)中的变量保存在栈中的哪个位置,有了这个位置我们就可以恢复切换时所有寄存器的状态,从而恢复任务。),并保存所有寄存器的值入栈。

恢复现场

找到任务a的结构体,再从结构体里找到SP,再根据SP将所有保存寄存器的值恢复到CPU,要先恢复寄存器,最后再恢复PC

提问:为什么有时候恢复任务后不能将寄存器的数据完全恢复?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值