尽管现在网上已经有不少关于ucosii在stm32上的移植版别,包含micrium也有官方移植版别。但这些版别详细是怎样移植出来的,又该怎样根据移植好的ucosii开发应用软件,网上介绍的并不多。这儿介绍一下我的移植阅历,期望对咱们有所协助。
我的移植基本上是从零开端的。首要想要做好移植,有两方面的内容是有必要要了解。1.方针芯片;2.ucosii内核原理。
尽管咱们移植的方针芯片是stm32,但操作体系的移植基本是针对Cortex-M3内核(以下简称CM3)而言的,所以咱们只需了解CM3内核就好了。stm32芯片便是CM3内核加上各式各样的外设。
怎样才干了解CM3呢?看一本书<>(宋岩译,网上多的很)就好了,许多同学或许想,看完这本书移植的新鲜劲都没了,因而我把该书和移植有关的章节都列了出来,并对其间的要点内容进行介绍,我数了数相关章节还不到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的接口是有必要面临的。
10.2 汇编与C的接口
有两点需求知道:
1.当主调函数需求传递参数(实参)时,它们运用R0‐R3。其间R0传递第一个,R1传递第2个……在回来时,把回来值写到R0中。
2.在函数中,用汇编写代码时,R0-R3, R12能够随意运用,而运用R4‐R11,则有必要先PUSH,后POP。
以上内容和移植多少都有些联系,刚开端看,或许不太理解,多看几遍就好了。