MCU的寄存器与内存的基本数据结构

主要记录 CPU Core 的寄存器模式的通用知识点与特性知识点,主要基于ARMv7M的CortexM3,或者ARMv8架构的。CortexM3不支持ARM指令,只支持绝大部分的Thumb-2指令集。

记住:CPU CORE的 StackPointers 、 链表数据结构,都是内存相关的数据操作。栈操作“好像”比链表操作更加基础(或者原始prime)或者更加的必不可少,因为CPU CORE有专门的StackPointers寄存器,诚然!但是不代表链表更差,他们只是在不同的领域各有所长,只不过栈操作更加必不可少,链表通常用于数据的有机组织(比如OS操作系统里的操作系统core对象的组织管理),构建操作系统的一个基本工具,同样十分重要。栈内存数据结构对于计算机系统好比衣食住行对于个人;链表内存数据结构对于计算机好比互联网网络、手机信号对于个人,有了它才能做更大的事情,也是必不可少的部分!

通用知识点记录

Stack Pointer 栈指针寄存器 (基于CortexM3)

栈术语相关的特性:

栈是一种先进后出的逻辑数据结构;

STM32F103的R13 Stack Pointer是一个栈指针寄存器,指向内存的栈区;

不同的MCU架构,可能有不同SP寄存器硬件层次的设计,比如CortexM3就有两个Stack Pointers: Main_SP和Process_SP,但是在任意时刻,只有一个SP(R3)在工作; Armv8-M架构甚至有4个StackPointers.

栈空间是MCU中内存(RAM)中划分的一片物理内存区域;

RAM中的栈空间,用于存储数据,比如重要的中间数据(C语言的局部变量)、函数调用地址、当然也可以存储重要的全局变量(比如FreeRTOS Kernel V10.5.1中PendSV中的任务切换中的 pxCurrentTCB)等;这里多说一句,因此,FreeRTOS Kernel V10.5.1 的 PendSV 中涉及到了 Main_SP和Process_SP不同的R13的PUSH和POP,所以pxCurrentTCB是新任务的栈区地址。

RTOS或者OS的任务切换,会切换StackPointer等所有CPU-Core寄存器,也包括StackPointer指向的内存栈区数据的一整套任务的context switch。但是函数调用不存在SP寄存器的切换,它只是纵向的PUSH和POP。尽管两者都是PUSH-POP,还是有本质区别的!

R15, Program Counter (PC)

程序指令计数寄存器,指向下一条需要执行的指令代码;

一般“正常程序”中不存在修改PC寄存器;

OS/RTOS中任务切换,是存在切换刷新PC寄存器,且必须;

PC寄存器,可读,可写;

R14, Link Register (LR)

在子函数中,LR链接寄存器,用来专门保存主函数的指令运行的地址位置。

当子函数或者子过程快要结束时,将LR寄存器的值存入PC寄存器,恢复到主函数的指令执行位置,会恢复到主函数中继续运行。在子函数或者子过程结束后,LR的值也会自动从栈区更新。

当调用子函数时,需要保存主函数的指令运行位置到LR寄存器中,否则主函数执行位置数据会丢失。主主函数的指令运行位置(即主函数的LR)则在退出主函数之后和进入子函数之前,被PUSH压栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值