1909_Arm Cortex-M3编程模型
全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com)
编程模型的部分除了单独的核心寄存器描述之外,它还包含有关处理器模式和软件执行和堆栈的特权级别的信息。
处理器有两种模式,分别是线程模式和Handler模式;软件有两种权限级别,分别是非特权级别和特权级别。
两种处理器模式种,线程模式主要是用来执行应用软件。当处理器从复位状态中出来之后会进入到线程模式。Handler模式是用来处理各种异常的,处理器在完成异常处理之后依然会回到线程模式。
只有特权软件才能写入CONTROL寄存器以更改线程模式下软件执行的特权级别。非特权软件可以使用SVC指令进行主管调用,将控制权转移给特权软件。这样,如果是在线程模式下,如果已经具有了特权可以直接切换到非特权。否则得做一次SVC调用。
内核使用递减的堆栈模型,而且实现了2个堆栈,分别为main stack和process stack。
这个表格是对上面信息很好的一个总结,当我看完前面的信息之后看到这个表格的时候我觉得,可能以后回看前面的内容是没有太大必要的,这个表格基本上就可以给我大部分关键的信息。
这是内核相关的寄存器,其中,通用寄存器中有几个是作为专用功能寄存器来用的,分别是R13、R14、R15,代表SP、LR和PC。这部分在看AAPCS的时候也已经看过了。
SP寄存器究竟代表什么含义,这个是有CONTROL寄存器来决定的。
在复位时,处理器用复位向量的值加载PC,该值位于地址0x00000004。
这几个寄存器中可以获取进位、大小判断、是否为0等多种信息,看到这些信息后觉得很有大学时代的场景代入感。不过,现在工程师做软件开发的时候一般直接面向C,不需要考虑这么多的底层逻辑状态了。
这个是APSR的寄存器定义。
这是IPSR的定义。IPSR包含当前中断服务例程(ISR)的异常类型编号。
这个是EPSR的定义。包含Thumb状态位以及执行状态位。使用MSR指令直接通过应用软件读取EPSR的尝试总是返回零。在应用软件中使用MSR指令写入EPSR的尝试将被忽略。故障处理程序可以检查堆叠PSR中的EPSR值,以指示发生故障的操作。
可中断继续指令是针对加载多条指令的一种中断情况,执行LDM以及STM的时候处理器会执行暂停以及继续的操作,此时,中间的临时状态会存储在EPSR中。
If-Then块在16位IT指令之后最多包含4条指令。块中的每条指令都是有条件的。指令的条件要么是相同的,要么是相反的。
几个掩码寄存器:Exception、Priority、Fault。分别可以禁用exception、优先级可以配置的中断以及所有的非NMI中断。
这个寄存器是可以读取的,在FreeRTOS的移植版本中也是见到过的。
以上是之前看到过的代码。
这个是控制寄存器的定义,前面已经看到过多次这个信息。主要是两部分,SP的类型以及线程的权限。
当改变堆栈指针时,软件必须在MSR指令之后立即使用ISB指令。这确保ISB之后的指令使用新的堆栈指针执行。
常见的CMSIS是Cortex系列的MCU软件接口标准的缩写,提供了对应寄存器的访问,也提供了便于RTOS内核开发的标准接口。
这个是内核相关的存储映射定义。
简单总结以上属性的特点:
- Normal:可重新排序
- Device:可以缓冲但是不能重新排序
- Strongly-ordered:连缓冲也不允许
- XN:这里不能够取指令
能够很容易理解的几个点:
- 外设不会提供指令存储;
- 外部RAM可以用来存储code指令;
- 外部设备不可以提供指令;
这是为了能够保证数据或者指令的一致性而提供的几条指令。
由此看,读取动作才是唯一的保护机制。
有的编译器会提供相应的C函数来实现对应指令的生成。
异常的状态:未激活、挂起、激活、激活并挂起。从最后一个描述看,异常其实是可以有一个二级的缓冲。
上面是几个比较特殊的exception。超级调用(SVC)是由SVC指令触发的异常。在操作系统环境中,应用程序可以使用SVC指令访问操作系统内核函数和设备驱动程序。PendSV是系统级服务的中断驱动请求。在操作系统环境中,当没有其他异常活动时,使用PendSV进行上下文切换。SysTick可以用来作为系统的Tick时钟,IRQ则是常用的中断,通常是外设。
这是几种不同的异常处理方式。
这是异常向量表的定义。在系统复位时,向量表固定在地址0x00000000。特权软件可以写VTOR,将向量表的起始地址重新定位到不同的内存位置,在0x00000080到0x3FFFFF80的范围内。
- 异常的优先级数字越小代表的优先级越高。
- 除了Reset、Hard fault以及NMI之外,其他的异常的优先级都是可以配置的。
组优先级之间不会进行抢占,但是会决定执行的优先级。
关于编程模型的部分暂且梳理到这里,剩下的内容主要是关于各种错误异常的原因介绍,这类问题等我遇到对应问题的时候再把这个文件作为字典回查会好一些。