其实本篇内容早就想写出来,毕竟介绍了这么多飞思卡尔的Kinetis但一直没有专门介绍过它的内核——Cortex-M4。因为如果你想深入研究一款片子,了解其内核是必要的,所以本篇就先拿出内核的基本——寄存器组作为敲门砖开启我们研究内核的大门,呵呵,说的有点大了,不过以后我肯定还会陆续写一些内核的东西,从深处挖掘知识的应用。下面不多说了,进入正题(部分资料参考了Cortex-M3内核):
如上图,R0~R12为32位通用寄存器,通用寄存器又分为高组和低组,至于通用寄存器的作用(可以回去看看51内核的R0~R7)可能有人会说我们用C编程的时候不会考虑它们,只有汇编才会用到,但是实际上无论是在启动代码部分还是操作系统移植的时候都会接触到它们,甚至到以后考虑程序优化的时候也会用到的,所以重要性不言而喻,这也是我为什么最开始就介绍它的理由之一。下面就分别介绍下这几个寄存器(参考了CM3权威指南部分资料,因为在寄存器组方面CM4和CM3是一样的):
(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的,这个需要注意一下。
另外除了通用寄存器之外,CM4的内核还包括三组寄存器即程序状态寄存器组(PSRs)、中断屏蔽寄存器组(PRIMASK、FAULTMASK以及BASEPRI)和控制寄存器(Control):
呼呼,写到这总算是把寄存器组介绍完毕了,其实大部分是我从CM3的资料里移植过来的,因为CM3和CM4内核没差多少,尤其是寄存器组这块更是没有变
|