欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 嵌入式堆栈、ARM寄存器

嵌入式堆栈、ARM寄存器

2024/11/30 18:35:21 来源:https://blog.csdn.net/qq_44049422/article/details/141384559  浏览:    关键词:嵌入式堆栈、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] 决定,bits[1:0] 未定义( 所以指令不能 halfword/byte对齐 )
在 16位 Thumb 状态下,执行半字对齐的Thumb指令。
在 Thumb 状态下,程序计数器 PC (Program Counter) 使用位[1]选择另一个半字。

汇编语句:

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

HardFault:结合寄存器保留的值,可以去map表查找是什么变量,以及结合SP查看代码运行到哪里
找到MSP指向的地址的上一个函数。

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com