FreeRTOS Cortex M3/4架构芯片——寄存器组与存储篇

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

1.存储器

(1).ROM 只读存储器,掉电不丢失
(2).RAM 临时存储器也称内存,掉电丢失
(3).堆区
·堆区用于存放程序运行中被动态分布的内存段,可增可减。
·有malloc函数分布的内存,必须用free进行内存开释,否则会造成内存走漏。
(4).栈区
·临时创建的局部变量存放在栈区。
·函数调用时,其入口参数存放在栈区。
·函数返回时,其返回值存放在栈区。
(5).全局区(静态区)
全局区有.bss段和.data段构成,可读可写。
.bss段
·未初始化的全局变量存放在.bss段。
·初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
·.bss段不占用可执行文件空间,其内容有操作体系初始化。
.data段
·已经初始化的全局变量存放在.data段/以及const界说的全局变量。
·已经初始化静态变量存放在.data段。
·.data段占用可执行文件空间,其内容有程序初始化。
(6).常量区
·存放常量
·字符串存放在常量区。
(7).代码区
·程序执行代码存放在代码区。

ROM用来存放代码区和常量区
RAM用来存放堆区、栈区、全局区

在Cortex M3架构的芯片运行时,根据ROM上电不丢失的特性,芯片利用它用来存储用户烧录的代码和代码中的常量,芯片上电后,芯片运行会自动加载全局变量、局部变量到RAM中。
2.寄存器组(R0-R15)

在cortex M3架构的芯片寄存器中主要有通用寄存器寄存、堆栈指针、连接寄存器、程序计数器,
(1).R0-R12:通用寄存器
R0‐R12 都是 32 位通用寄存器,用于数据操作。
作用:它的存在主要是存放入口参数、返回参数、局部变量、临时盘算结果

(2).SP堆栈指针:
Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时候只能利用其中的一个。
主堆栈指针( MSP):复位后缺省利用的堆栈指针,用于操作体系内核以及非常处置惩罚例程(包罗中断服务例程)
进程堆栈指针( PSP):由用户的应用程序代码利用。

作用:在内核刚启动时,OS处于hander mode(也就是操作体系常说的内核态),OS的内核函数(比方非常中断函数、其他中断函数等其他内核函数)利用的是MSP堆栈指针,当芯片启动乐成,且未产生任何非常,os自动切换为线程模式,堆栈值指针选为PSP。
Sp的属性选择靠什么实现呢?
那这里就必要引入控制寄存器(CONTROL)

SP的界说选择,主要是靠CONTROL寄存器实现,当该寄存器为1时,选择进程堆栈指针,当该寄存器为时,选择主堆栈指针。

那有人就会想了,显着它的存在就只是存储堆栈指针,无论是内核函数的堆栈指针还是线程模式下的堆栈指针,它不都是个指针吗,为什么必要用CONTROL寄存器去区分堆栈指针选择MSP和PSP?
首先保举一篇文章,这篇文章详细讲解了MSP\PSP\SP,之间的关系,以及区别。
RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态_arm sp msp psp-CSDN博客

        我这里想跟各人细细的理解一下这个主堆栈指针,体系启动时,MSP会指向内存中预界说的一段地区,通常由启动代码决定。这段地区用于处置惩罚体系启动、非常、中断等必要全局堆栈的场合。在RTOS启动之前,main()函数确实利用主堆栈(MSP)。在没有任务调度器运行时(即没有进入多任务调度阶段),所有代码,包罗main()函数及其调用的其他函数,都会利用主堆栈空间。只有 sp 属性选择为 MSP 是才能存这片堆栈, os程序、内核程序、ISR(中断服务程序)能够利用这片空间,,此时 sp 既可以指向主堆栈指针,又可以指向任务堆栈指针。而任务堆栈指针,只能指向任务堆栈。
       在RTOS中,有一片特定堆栈空间(也就上面的 main 堆栈)专为非常和中断而生,并且这片空间只能在特权级线程模式下能访问,也就是说当control寄存器为0时才能访问,为啥呢?由于这时SP属性选择为msp,此时的SP它能够访问此片空间,而当体系处于用户级线程模式下,也就是control寄存器为1时不能存取这片空间的地点,此时SP属性选择为PSP,他不能访问此片空间,他只能访问任务堆栈指针。那我们在转成界说就可以这样说,体系会限制用户直接访问体系资源。
(3).LR连接寄存器:
R14 是连接寄存器( LR)。主要用于存储子程序调用时的返回地点。当发生函数调用时,当前的程序计数器(PC)值会被生存到LR中,以便函数执行完成后能够正确返回调用点。
作用:
裸机中,当程序正在函数1时,此时调用到函数2,此时函数1会被装载在栈区,函数2会从ROM装载进寄存器中运行,装载时函数1的堆栈地点会储存在寄存器LR中,这样函数2运行结束时就能通过访问LR寄存器的指针,返回到函数1继承运行。
在操作体系(OS)中,除了包罗上述作用,LR在任务切换和非常处置惩罚等场景中也起着紧张作用:
任务切换:当操作体系切换任务时,它必要生存当前任务的上下文信息(包罗LR寄存器的值),以便稍后能够恢复任务的执行。LR生存了任务在切换前的返回地点,当任务被重新调度时,通过恢复LR的值,任务可以从中断点继承执行。
非常处置惩罚:当发生中断或非常时,Cortex-M3会自动生存上下文,包罗PC和LR的值。LR在此时用于标记非常返回范例,具体表现为LR生存特别的返回值(如0xFFFFFFF9或0xFFFFFFFD),用于指示在非常处置惩罚完成后,体系应该返回到哪种堆栈(主堆栈MSP还是进程堆栈PSP)以及恢复到特权模式或用户模式。
   0xFFFFFFF9:返回到特权模式,利用MSP。
   0xFFFFFFFD:返回到用户模式,利用PSP。
非常返回:当非常处置惩罚结束时,体系根据LR的值决定如何返回原任务。不同的LR值会影响体系返回时恢复哪种上下文(如用户模式或特权模式),并决定是否利用MSP或PSP。

(4).PC程序计数器:
R15 是程序计数器,在汇编代码中你也可以利用名字“PC”来访问它。
作用:通过它,我们可知道一个函数调用一个函数,被调用的函数结束时,这个函数运行在哪一条指令流(代码对应的二进制指令)。

该文章只是我学习上的一些总结,希望各人有自己的理解。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表