没有合适的资源?快使用搜索试试~ 我知道了~
首页ucos-ii移植ARM-CORTEM3详解
资源详情
资源评论
资源推荐

基于 ARM- Cortex-M3 的 U-COS II 系统移植说明
虽然 U-COS II 在中国的市场不怎么滴,但是学习这个系统能更好的掌握操作系统原理(特别是任务调度和
内存管理),也为学习 linux 内核做更好的铺垫,反正好处多多,这里介绍一下我的移植经历,希望对大家有所
帮助。
我的移植基本上是从零开始的。首先想要做好移植,有两方面的内容是必须要了解:
1.目标芯片;2.ucosii 内核原理。
虽然我们移植的目标芯片是 stm32,但操作系统的移植基本是针对 Cortex-M3 内核(以下简称 CM3)而言的,
所以我们只需了解 CM3 内核就好了。stm32 芯片就是 CM3 内核加上各种各样的外设。
怎么才能了解 CM3 呢?看一本书<<ARM Cortex-M3 权威指南>>(宋岩译,网上多的很)就好了,很多同学
可能想,看完这本书移植的新鲜劲都没了,因此我把该书和移植有关的章节都列了出来,并对其中的重点内容
进行介绍,我数了数相关章节还不到 100 页,就这点内容,总要看了吧。
相关章节如下:
chapter2 Cortex-M3 概览
2.1 - 2.9
主要了解 Cortex-M3 的概貌。刚开始看时不用追求全部理解,后面会有详细介绍,很多内容多看几遍就明白。
其中 2.8 指令集,只要了解,CM3 只使用 thumb2 就 ok 了。
chapter3 Cortex-M3 基础
3.1 寄存器组
R0-R12: 通用寄存器
R13: 堆栈寄存器
有两个,MSP 和 PSP,同时只能看见一个
引用 R13 时,引用的是正在使用的那个
MSP:可用于异常服务和应用程序
PSP:只能用于应用程序
系统复位后,用的堆栈指针是 MSP。
R14: 连接寄存器,又名 LR
存储返回地址
R15: 程序计数寄存器,又名 PC
3.2 特殊功能寄存器
程序状态字寄存器组(PSRs)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
控制寄存器(CONTROL)
程序状态字寄存器组(PSRs)分为
应用程序 PSR(APSR)
中断号 PSR(IPSR)
执行 PSR(EPSR)
每个都是 32 位,由于这 3 个寄存器有效位是错开的,因此可以组合访问。
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
这三个寄存器用于控制异常的使能和除能。

控制寄存器(CONTROL)
它有两个作用:
1.定义特权级别
2.选择当前使用哪个堆栈指针
3.3 操作模式和特权极别
操作模式: 处理者模式和线程模式
异常处理:处理者模式
主程序:线程模式
ucosii 不区分特权级和用户级,程序始终工作在特权级
这两个堆栈指针的切换是全自动的,就在出入异常服务例程时由硬件处理。
3.4 - 3.7
没什么好讲的,需要看。
3.8 复位序列
0x00000000 MSP 初值
0x00000004 PC 初值 复位向量
chapter7 异常
7.1 异常类型
分为系统异常(编号 1-15)和外部中断(大于 15)
7.2 优先级
CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级。
在 NVIC 中,每个中断都有一个优先级配置寄存器(1 个 byte),用来配置该中断的优先级。但该寄存器并
不是每个位都被使用,不同制造商生产的芯片不相同,譬如 stm32 使用 4 位,也就是说 stm32 支持 16 个可编
程优先级(参考:chapter9) 。
注意该寄存器是以 MSB 对齐的,因此 stm32 每个中断的优先级配置寄存器 7:4 位有效,3:0 位无效。
对于优先级,CM3 又分为抢占优先级和亚优先级,
NVIC 中的应用程序中断及复位控制寄存器(AIRCR)的优先级分组(10:8)描述了如何划分抢占优先级和亚优先
级。
什么意思?以 stm32 为例,优先级配置寄存器不是 7:4 位有效吗,如果 AIRCR 中的优先级分组值为 4,则优
先级配置寄存器的 7:5 位确定抢占优先级,位 4 确定亚优先级。此时所有中断有 8 个抢占优先级,每个抢占优
先级有 2 个亚优先级。
抢占优先级高的中断可以抢占抢占优先级低的中断,即抢占优先级决定了中断是否可以嵌套。
相同抢占优先级的中断不能嵌套,但当抢占优先级相同的异常有不止一个到来时,就优先响应亚优先级最高
的异常。
参考附录 D
表 D.9 中断优先级寄存器阵列 0xE000_E400 - 0xE000_E4EF 共 240 个。
表 D.16 系统异常优先级寄存器 0xE000_ED18 - 0xE000_ED23 共 12 个。
优先级相同,看中断号,中断号小的优先。
7.3 向量表>
初始在 0x00000000 处,可以通过向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)更改,一般无需更
改。
7.4 中断输入及挂起行为
需要看。
7.5 Fault 异常
可不看。

7.6 SVC 和 PendSV
SVC 主要用在分特权级和用户级的操作系统,ucosii 不区分特权级和用户级,可以不管这个东西。
这里说点题外话,一开始我很奇怪为什么会提供这种中断,因为这种中断一般都是用在大型的操作系统
上,如 linux 系统上,可 CM3 又不提供 MMU,应该是无法移植 linux 系统。后来我才知道 uclinux 是针对没有
MMU 的嵌入式系统而设计的,不过还是很怀疑有人会在像 stm32 这种芯片上用 uclinux。
PendSV
PendSV 中断主要做上下文切换,也就是任务切换,是 ucosii 移植过程中最重要的中断。
主要有两点:
1.PendSV 中断是手工往 NVIC 的 PendSV 悬起寄存器中写 1 产生的(由 OS 写)。
2.PendSV 中断优先级必须设为最低。
在讲移植代码时会介绍具体是如何做的。
对于 7.6 的 PendSV 部分应认真研读一下。
chapter8 NVIC 与中断控制
NVIC 负责芯片的中断管理,它和 CM3 内核紧密相关。
如果对于 CM3 中断配置不是很了解,可以看看 8.1, 8.2, 8.3, 8.4 节。
8.7 节讲述了 SysTick 定时器,需要看。
chapter9 中断的具体行为
9.1 中断/异常的响应序列
当 CM3 开始响应一个中断时
1.xPSR, PC, LR, R12 以及 R3‐R0 入栈
2.取向量
3.选择堆栈指针 MSP/PSP,更新堆栈指针 SP,更新连接寄存器 LR,更新程序计数器 PC
对移植 ucosii 来说,需要注意 1,3
9.2 异常返回
在 CM3 中,进入中断时,LR 寄存器的值会被自动更新。
9.6 节对更新后的值进行说明。这里统称 EXC_RETURN。
返回时通过把 EXC_RETURN 往 PC 里写来识别返回动作的。
因为 EXC_RETURN 是一个特殊值,所以对于 CM3,汇编语言就不需要类似 reti 这种指令,而用 C 语言开
发时,不需要特殊编译器命令指示一个函数为中断服务程序。实际上,中断服务程序如果是 c 代码编写,汇编
成汇编代码,函数结尾一般是 reti。
9.3 嵌套的中断
只要注意:中断嵌套不能过深即可。
9.4 和 9.5
这两节说明 CM3 对中断的响应能力大大提高了,主要是硬件机制的改进。
但对移植来说,并不需要关注。
9.6 异常返回值
对不同状态进入中断时,LR 寄存器的值进行说明,需要看。
这里有一点需要注意,该点在讲移植代码时再介绍。
9.7 和 9.8
对移植来说,并不需要关注。
chapter10 Cortex-M3 的低层编程
这一章仅需关注 10.2 节,因为对移植来说汇编与 C 的接口是必须面对的。
剩余14页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论2