嵌入式堆栈、ARM寄存器

栈里面存放的内容:局部变量和系统信息,函数调用链路也是系统信息的一环

ARM寄存器
LR :程序跳转的时候,返回到的地址就保存到此处
PC :程序计数器,pc 要执行的下一条指令地址 ,就存放在此处,每次指令执行完,就自动+4

SP{MSP、PSP}:

MSP的含义是Main_Stack_Pointer,即主栈

PSP的含义是 Process_Stack_Pointer,即任务栈

**堆和栈 相向生长,**最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化!!
主堆栈指针(MSP) ,或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程 以及所有需要特权访问的应用程序代码来使用.
进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服用例 程中时)

在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是PSP

MDK Debug方法:

ARM运行模式




ARM指令和Trumb指令:

在debug查找链路时,要是偶数地址,如果SP指向的地址,栈里面的地址是奇数,一般是减1.

在 32 位 ARM 状态下执行 字对齐的 ARM 指令,

当处理器执行在ARM状态:

1)所有指令32bits宽

2)所有指令必须 word 对齐

3)所有 pc 值由 31:2 决定,bits1:0 未定义( 所以指令不能 halfword/byte对齐 )

在 16位 Thumb 状态下,执行半字对齐的Thumb指令。

在 Thumb 状态下,程序计数器 PC (Program Counter) 使用位1选择另一个半字。

汇编语句:

PUSH: 把寄存器的地址往堆栈里面压,堆栈的地址从高到低使用,一个寄存器就占4个字节。

HardFault:结合寄存器保留的值,可以去map表查找是什么变量,以及结合SP查看代码运行到哪里

找到MSP指向的地址的上一个函数。

RTOS查看任务目前运行到哪个地方:

用TCB_t去看

通过pxTopOfStack 可以看目前任务运行的地方,可以通过pcTaskName 来确定目前任务是哪个

相关推荐
szxinmai主板定制专家9 小时前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
女神下凡9 小时前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范
abc light9 小时前
ARM 裸机开发(1)——ARM 体系结构
c语言·arm开发
abc light11 小时前
ARM 裸机开发(2)——ARM 汇编与启动代码
汇编·arm开发
女神下凡1 天前
芯参谋(77):裸机(无 OS)存储驱动开发指南
arm开发·单片机·嵌入式硬件·设计规范·1024程序员节
女神下凡1 天前
芯参谋(76):电源监控复位芯片电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
陌上花开缓缓归以1 天前
liteos 内存分布
arm开发
u0109053592 天前
(永久免费)树莓派 / 香橙派等开发板,安装神卓互联巴比达内网穿透安装教程(Linux ARM 版 V9.4.1)
linux·运维·arm开发
打工仔折腾 AI2 天前
后端部署避坑:吃透IPv4地址、网络接口与CIDR前缀的实际应用
arm开发·人工智能·后端·python·性能优化
工控存储研习3 天前
嵌入式设备启动时间优化:从上电到应用就绪,每一毫秒怎么抠
arm开发