章节列表

芯片内核简介

2018-05-29 03:39:42 +0000 李述铜

Hi,同学,很遗憾地通知你进入这门课程中最枯燥、最无趣的课时!

虽然我很想将这个课时砍掉,但是显然是不可能的。任何代码都是运行于特定的硬件平台之上,更何况RTOS这种更接近硬件的代码。RTOS要正常工作,必须要使用到CPU的某些特性,所以部分硬件相关的内容是必须了解的。

为了方便学习,我们选取了目前最常用的一种CPU类型Cortex-M3,并且只选择其中与RTOS相关的知识点介绍。尽可能地节省你的学习时间和成本!

注意,以下内容你第一次看可能并不一定能明白。建议在后面学习《内核编程实践》、《任务切换的实现》课时时,再同步观看此部分。

主要内容

本课程主要介绍与RTOS实现相关的Cortex-M3内核知识。由于此部分涉及硬件,所以相对而言比较枯燥。

课程内容不会涉及到具体CPU芯片或者开发板的知识,因为这部分与RTOS的实现关系并不是那么重要。且cortex-M3设计的比较合理,在其中提供了RTOS任务切换、系统时钟节拍所有相关资源,使得我们无需再关注具体的芯片就能够设计出能够运行与所有以Cortex-M3内核为基础的MCU。

以下结合后面讲到的RTOS设计,对该部分内容重新做一下梳理。

存储映射

无论什么程序总是要运行于存储器中,下图给出的是Cortex-M的存储布局规范图。

注意,这里指的是规范,实际厂家并不一定完全按照这个规范做

在学习中,简单了解即可,并不需要关心。因为在后面课时创建工程时,Keil软件已经自动帮你配置好,不用处理。

工作模式及权限级别分类

硬件开始工作后,CPU会进入特定的工作模式。此小节主要介绍CPU的工作模式及相应模式下的特权级,课程中我们用了一幅图展示如下:

如果你在学习过程中发现自己不能很好的理解这幅图,没有关系。结合我们在后面的设计中,可以简单地理解为:

  • 默认运行在Thread Mode下;当发生异常/中断发生时,硬件自动切换到Handler Mode模式,执行完相应的异常/中断处理程序后,再切换回线程模式;
  • 我们在课程中只使用了特权级,没有使用到用户级。即设计的RTOS中并没有借助特权级/用户级的划分实现对一些资源/指令的访问控制。

总而言之,在我们的设计中,异常/中断运行于Handler Mode,各个任务的代码运行于Thread Mode,这个过程由硬件自动切换。无论是异常/中断/任务,均运行于特权级下(硬件启动后的缺省级别)。

寄存器组

想必你知道,任务在执行他的代码时,必须要用到这些内核寄存器做一些算术、逻辑等运算处理,这部分寄存器相当于任务运行状态的一部分。在进行任务切换时,我们需要在切换代码中将这部分寄存器的值保存/恢复。

例如,这些寄存器中:

  • R15指明了当前任务执行的指令位置
  • R13指明当前任务所用的堆栈位置
  • R0~R3主要用于程序调用时,参数的传递;执行程序时局部变量的存储

对于上图,除了简单了解其有R0~R15外,还要特别注意双堆栈寄存器R13,用于实现中断/异常所用的栈与任务所用的栈相分离,互不干扰。简单来说,在我们的设计中,异常/中断发生时,硬件自动切换到MSP指向的堆栈来配合执行相应的处理程序,而退出后,自动切换到PSP指向的堆栈空间再执行任务代码。

无论是哪种堆栈,其均使用下面这幅图的增长模式:每次压栈,堆栈地址递减。且堆栈指针SP(MSP/PSP)。特别注意:SP总是指向最后压栈的单元,不是下一个空闲的堆栈单元。

至于xPSR寄存器,只需要了解PRIMASK位即可,在后面讲实现关中断时,有借助指令操作这个位。

PendSVC异常

在执行具体的任务切换时,我们在设计中是通过向PendSVC异常发起请求,然后在PendSVC异常处理程序中具体执行任务切换的操作。

异常处理流程比较复杂,我们只需要记往以下几点:

进入异常

刚进入异常时,硬件自动会将以下寄存器压入当前堆栈(我们当前用的是PSP)。压入哪些内容以及他们的次序非常重要!

之后硬件自动跳转到PendSVC异常处理程序中运行。

退出异常

退出异常时,硬件会自动出栈,这个次序与进入异常时压栈的顺序刚好相反。可以理解为进入异常时保存了部分寄存器状态,退出时正好恢复。

此外,在退出异常时,我们还会用到EXC_RETURN,其中只用到了0xFFFF_FFFD(即返回异常时进入线程模式,使用PSP堆栈)。

注意,进入异常和退出异常时自动的出入栈会在后面的课时中视为任务部分状态的保存。

汇编指令

在PendSVC中实现任务切换时,必须要用到一些汇编指令进行状态保存。课程中只介绍了用到的部分指令。

在学习时可先简单了解,待后面用到时,再回过头来翻看,这样效果会更好。

课程附带的资料中有完整的指令集参考文档,但我认为并没有必要仔细阅读。

重点难点

该课时的难点在于内容比较枯燥,难于学习。建议先整体了解,待后面学到相应章节时,再回顾。

如需了解更多关于Cortex-M3内核的知识,请查看课程资料手册《Cortex-M3权威指南.pdf》,或者在网易云课堂上搜索“Cortex-M”的视频课程。

注意事项

本课程选用的是Cortex-M3内核,其特性和ARM的Cortex-M0/M1/M4/M7非常相近,略有差别。如果你熟悉这些内核,可以更好地学习这门课程中的内容。

常见问题