[Kinetis] 【经验笔记】Cortex-M4寄存器组介绍

[复制链接]
2052|9
 楼主| vigous1 发表于 2015-3-25 20:17 | 显示全部楼层 |阅读模式

介绍了这么多飞思卡尔的Kinetis但一直没有专门介绍过它的内核——Cortex-M4。因为如果你想深入研究一款片子,了解其内核是必要的,所以本篇就先拿出内核的基本——寄存器组作为敲门砖开启我们研究内核的大门,呵呵,说的有点大了,不过以后我肯定还会陆续写一些内核的东西,从深处挖掘知识的应用。下面不多说了,进入正题(部分资料参考了Cortex-M3内核):

    如上图,R0~R12为32位通用寄存器,通用寄存器又分为高组和低组,至于通用寄存器的作用(可以回去看看51内核的R0~R7)可能有人会说我们用C编程的时候不会考虑它们,只有汇编才会用到,但是实际上无论是在启动代码部分还是操作系统移植的时候都会接触到它们,甚至到以后考虑程序优化的时候也会用到的,所以重要性不言而喻,这也是我为什么最开始就介绍它的理由之一。下面就分别介绍下这几个寄存器(参考了CM3权威指南部分资料,因为在寄存器组方面CM4和CM3是一样的):


 楼主| vigous1 发表于 2015-3-25 20:18 | 显示全部楼层

(1)通用寄存器R0~R7:为低组寄存器,所有指令都可以访问,大小为32位,复位后初始值不定;

(2)通用寄存器R8~R12:为高组寄存器,只有部分的16位Thumb指令可以访问,32位Thumb-2指令不受限制,大小为32位,复位后初始值仍然不定;

(3)R13为堆栈指针(即SP,这个应该都知道了),CM4内核和CM3内核是一样的,有两个堆栈指针(注意都是共用R13,只不过不能同时访问罢了,引用R13即引用当前使用的指针(MSP or PSP))。其中MSP(主堆栈指针)即默认的堆栈指针,一般由OS内核、异常服务例程以及所有需要特权访问的应用程序代码使用;而PSP(进程堆栈指针)用于常规的应用代码(即不处于异常服务例程中时)。

(4)R14为连接寄存器(即LR),主要作用就是保存子程序的返回地址,以便在执行完子程序时恢复现场;

(5)R15为程序计数器(即PC,这个如果不知道可以放弃编程了,哈哈),可以在程序里直接插入PC以跳转到相应的地址(不过不更新LR),所以功能大大滴有用。另外由于CortexM系列采用指令流水线技术,所以如果读PC返回值的话应该是当前指令的地址+4的,这个需要注意一下。


 楼主| vigous1 发表于 2015-3-25 20:19 | 显示全部楼层

另外除了通用寄存器之外,CM4的内核还包括三组寄存器即程序状态寄存器组(PSRs)、中断屏蔽寄存器组(PRIMASK、FAULTMASK以及BASEPRI)和控制寄存器(Control):

    呼呼,写到这总算是把寄存器组介绍完毕了


598330983 发表于 2015-3-27 21:56 来自手机 | 显示全部楼层
谢谢分享,楼主好样的
598330983 发表于 2015-3-27 21:56 来自手机 | 显示全部楼层
楼主学习中遇到问题就记下来
598330983 发表于 2015-3-27 21:56 来自手机 | 显示全部楼层
是好样的,而且分享给大家,无私奉献
FSL_TICS_ZJJ 发表于 2015-4-10 15:40 | 显示全部楼层
非常感谢你关于Kinetis的经验分享 !
后会无期1 发表于 2015-4-16 20:35 | 显示全部楼层
飞思卡尔的Kinetis的内核——Cortex-M4
我是MT 发表于 2015-4-16 20:43 | 显示全部楼层
寄存器组作为敲门砖开启我们研究内核的大门
longzhigu 发表于 2015-4-17 09:06 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

427

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部