打印
[内核技术]

嵌入式操作系统之三 预备知识

[复制链接]
2014|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 山东电子小菜鸟 于 2018-8-8 16:11 编辑



通过前面软文介绍我们对操作系统有了初步的了解,但这也只是停留在概念阶段,这



些知识对于写一个操作系统来说是远远不够的。从现在的开始,我们将从无到有,一


步一步一个功能一个功能的写出操作系统。


我们就先了解一下写操作系统所需要的知识,会涉及到一些汇编语言及芯片的内部


结构,如果你没有这方面相关的基础的话,看起来可能会枯涩难懂一些,如果是这种情况的


话,建议粗略看一下就可以了,不要过分追求细节。


我们首先将在 ARM7 芯片上编写操作系统,因此本章将对 ARM7 芯片的内部结构做一


些介绍,并会介绍一下相关的汇编语言,以及 C 语言与汇编语言之间的关系,最后再介绍


一下 Wanlix 操作系统的文件组织结构及开发环境。

相关**
嵌入式操作系统之一为什么要使用操作系统
嵌入式操作系统之二 操作系统的分类

作者:王奇

后期软文的资料及源代码原理图将在公众号中提供,
有兴趣的朋友可以关注微信公众号:嵌入式单片机之家


下载相关资料








相关帖子

沙发
山东电子小菜鸟|  楼主 | 2018-8-5 16:56 | 只看该作者
ARM7 芯片基本结构


ARM7 芯片构架比较简单,32bits 线性地址空间统一排列,任何地址都是唯一的,不同


的片上资源及外设被分配到不同的地址空间,不同数据结构的指针固定为 4 字节长度,这相


对 51 芯片来说方便很多也清晰很多,从用户编程的角度来看入手比较简单,因此本手册首


先选用 ARM7 芯片来作为开发操作系统的硬件平台。选用的 ARM7 芯片,是 ADI 公司的一


款芯片——Aduc7024。


Aduc7024 具有片上 AD、DA、GPIO、UART、I2C、SPI、TIMER、WDT、PWM 等外


设,具有 62KBytes 的内部 FLASH 程序空间和 8KBytes 的内部 RAM 空间,无需外挂 ROM


和 RAM,芯片的具体细节可以查阅附录中的参考文档 1。在我们的开发过程中,我们主要


使用了芯片的 UART,也就是串口,作为打印数据的端口,输出到 PC 上来观察操作系统的


运行。
当我们完成了操作系统的一些基本功能后,我们会将 Wanlix 和 Mindows 移植到另外一


款 ARM 芯片上——Cortex 内核的 ARM 芯片,并在此芯片上继续完善 Mindows 的功能。这


么做,第一是让读者了解 wanlix 和 Mindows 的移植过程,第二是让读者在移植过程中体会


操作系统与用户代码无关的重要性,第三,Cortex 内核芯片功能更强、资源更丰富,可以在


此芯片上实现更多的功能。Cortex 内核是 ARM 公司新推出的一种内核,其功能强大,性价


比高,后面章节我们再详细讨论,我们首先来了解 ARM7 芯片。


ARM7 支持 7 种处理器模式,分别是 USR 模式、SYS 模式、SVC 模式、ABT 模式 、


UND 模式、IRQ 模式和 FIQ 模式,虽然有这么多种模式但可以归纳为 2 大类:正常工作模


式和中断工作模式。


正常工作模式包括 USR 模式和 SYS 模式,USR 模式没有任何特性,是芯片最常用的模


式,芯片一般都是在 USR 模式下运行的。SYS 模式与 USR 模式也没什么区别,仅比 USR


模式权限大些,能访问到芯片的特殊寄存器,适合操作系统使用(但我不知道怎么使用,本


文没有使用该模式)。

使用特权

评论回复
板凳
山东电子小菜鸟|  楼主 | 2018-8-5 17:00 | 只看该作者


而中断工作模式又分为异常中断模式和正常中断工作模式。芯片无法正常运行时就会进


入异常中断模式,芯片进入异常中断模式后软件就无法再继续提供原有功能了,异常中断模

式仅是为定位问题而提供的。异常中断模式包括 ABT 模式和 UND 模式,指令或数据出错


时就会进入 ABT 模式,例如,ARM 模式下的一条指令是需要访问 4 字节对齐的地址,如果


实际访问的地址不是 4 字节对齐的话,这时芯片就会进入 ABT 模式,程序 PC 指针就会跳


转到 ABT 的异常中断向量,执行 ABT 的中断服务程序。如果用户为 ABT 模式编写了定位


信息程序并挂到 ABT 异常中断上,那么就可以利用这些代码输出产生 ABT 异常的原因了 。


UND 模式与 ABT 模式的工作原理是一样的,只不过 UND 模式是在遇到没有定义的指令时


才会进入。


正常中断模式是为用户实现系统功能而设计的中断模式,它是预先设计好的,是系统运


行所必须的。正常中断模式又分为 IRQ 模式、FIQ 模式和 SVC 模式。IRQ 模式就是普通的


中断模式,当芯片产生中断时就会进入 IRQ 模式,等同于其它芯片的中断。FIQ 是快速中


断模式,它比 IRQ 中断优先级高,备份、还原中断现场时间更少些,也就是说能更优先更


快速的产生中断,除此之外它与 RIQ 中断没什么区别。SVC 是软中断模式,由软件触发,


常用于操作系统中,软中断在本文中将会有非常重要的应用。

使用特权

评论回复
地板
山东电子小菜鸟|  楼主 | 2018-8-5 17:14 | 只看该作者

使用特权

评论回复
5
山东电子小菜鸟|  楼主 | 2018-8-5 17:15 | 只看该作者
程序可以看做是指令+数据的组合,程序运行的过程就是不断的取出指令并按照指令不
断计算数据的过程,在这个计算过程中需要使用寄存器来存放指令和数据。寄存器与芯片内


核直接相连,因此芯片操作它们的速度要远快于操作内存的速度。但寄存器的数量较少,因


此指令和数据平时是存放在 FLASH 或者 RAM 中的,只有当使用时才会放入寄存器进行运


算。


每种芯片内部都会有寄存器,不同芯片的寄存器种类、数量各不相同,但都会有下面这


3 种:



一、PC(Program Counter)寄存器,PC 寄存器中存放的是当前执行的指令所在的地

址,芯片是通过 PC 寄存器找到其需要执行的指令的,更改 PC 寄存器就会发生指令跳转,


当我们在 C 语言里调用函数或者产生分支跳转时,实际上就是通过改变 PC 寄存器的值实现


的。



二、状态寄存器,状态寄存器里都会有 N、Z、C、V 这 4 个状态标志,N 用来表示数

据是有符号数还是无符号数,Z 用来表示 0 还是非 0,C 是进位标志,当产生进、借位时影


响的就是这个标志,V 是溢出标志,数据运算过程中产生数据溢出了就会更改此标志。



三 、

通用寄存器,这些通用寄存器用来临时存放数据,供芯片运算时使用,某些通用寄存器也可


能会有其它专有的功能,各个芯片的定义不一样。

使用特权

评论回复
6
山东电子小菜鸟|  楼主 | 2018-8-5 17:16 | 只看该作者
ARM7 芯片每种工作模式下有 17 个寄存器可以使用,分别是 R0~R15 和 CPSR 寄存器,


其中 R15 寄存器又可以称之为 PC 寄存器,CPSR 是状态寄存器,其余的可以认为是通用寄


存器,在这些通用寄存器里,R13 和 R14 是比较特殊的,R13 寄存器又可以称之为 SP(Stack


pointer)寄存器,用来指示当前堆栈的位置,R14 寄存器又可以称之为 LR(Link register)


寄存器,当使用某些跳转指令时,硬件会自动将跳转前的指令存入 LR 寄存器中,以供返回


时使用。


前面说了 ARM7 芯片有 7 种工作模式,有些寄存器是这 7 种模式共用的,但 ARM7 芯


片也为每种不同的工作模式提供了专有的寄存器,进入不同模式便可以使用不同模式下的专


有寄存器,如下图所示,ARM7 芯片共有 37 个寄存器,但每种模式仅有 17 个寄存器可以使


用。

使用特权

评论回复
7
山东电子小菜鸟|  楼主 | 2018-8-5 17:17 | 只看该作者
本帖最后由 山东电子小菜鸟 于 2018-8-5 17:19 编辑

图 3 中寄存器左下角不带阴影的是不可备份寄存器,各个模式共用,带阴影的是可备份


寄存器,为每个模式所单独拥有,只有进入该模式才可以使用。


不可备份寄存器对各个模式来说是共用的,因此,为防止切换后模式破坏切换前模式中


的数据,在模式切换后的需要使用软件将这些不可备份寄存器保存起来,当切换回原模式后


再恢复这些不可备份寄存器。可备份寄存器则无需软件保存,硬件会在切换模式时自动将切


换后模式下的可备份寄存器替换为切换前模式下的可备份寄存器,虽然名字一样,但实际上


的物理空间是不同的,因此在不同模式下尽管使用了相同的可备份寄存器,但实际上并没有


数据上的冲突,看下面的例子:



使用特权

评论回复
8
山东电子小菜鸟|  楼主 | 2018-8-5 17:18 | 只看该作者
本帖最后由 山东电子小菜鸟 于 2018-8-5 17:21 编辑
在 USR 模式下将 R0 和 R13 的值置为 0:
MOV R0, #0
MOV R13, #0
此时,发生了从 USR 模式到 IRQ 模式的切换,然后在 IRQ 模式下将 R0 和 R13 加 1:
ADD R0, R0, #1
ADD R13, R13, #1

R0 是不可备份寄存器,因此上述操作是对同一个 R0 寄存器操作的。在 USR 模式下先


将 R0 置为 0,然后在 IRQ 模式下将 R0 加 1,最后 R0 的值为 1。而 R13 是可备份寄存器 ,


在 USR 模式下先将 USR 模式下的 R13 置为 0,进入 IRQ 模式后将 IRQ 模式下的 R13 加 1 ,


最后 USR 模式下的 R13 的值仍为 0,而 IRQ 模式下的 R13 值在它原有的基础上加了 1。在


上述操作中,虽然软件使用的都是 R13 这同一个名字,但芯片会根据不同模式而对不同模


式下的 R13 寄存器进行操作,上述对 R13 的操作就是对不同的 2 个 R13 寄存器进行的操作。


FIQ 的可备份寄存器是 R8~R14,其它模式的可备份寄存器是 R13~R14,包括 IRQ 模式 ,


因此切换到 FIQ 模式时需要备份的寄存器少一些,因此 FIQ 要比 IRQ 快一些。

使用特权

评论回复
9
山东电子小菜鸟|  楼主 | 2018-8-5 17:21 | 只看该作者

CPSR 与 R 寄存器不同,所有模式下均是使用同一个 CPSP 寄存器,在模式切换时硬件


会自动将切换前模式的 CPSR 寄存器保存到切换后模式的 SPSR 寄存器中,然后切换后的模


式会继续使用 CPSR 寄存器作为自己的状态寄存器,当需要切换回原有模式时,硬件会自动


将 CPSR 从当前模式的 SPSR 寄存器恢复过来。



ARM7 芯片软件的运行完全是由上述的这些寄存器决定的,只要能合理的修改这些寄存


器就能控制软件的运行,操作系统就是通过备份、还原、更改这些寄存器来控制程序执行流


程的,进而实现任务之间的切换。由于 C 语言无法访问到这些寄存器,因此必须使用汇编


语言才能对这些寄存器进行操作,下节我们将了解一些 ARM7 的汇编语言,以便理解操作


系统的任务切换过程。

使用特权

评论回复
10
caijie001| | 2018-8-7 13:36 | 只看该作者
mark

使用特权

评论回复
11
gujiamao12345| | 2018-8-7 20:15 | 只看该作者
好久没上论坛了,鸟哥发干活了

使用特权

评论回复
评论
山东电子小菜鸟 2018-8-8 16:13 回复TA
感谢顾佳茂大哥支持 
12
山东电子小菜鸟|  楼主 | 2018-8-8 16:06 | 只看该作者

感谢杰杰评论

使用特权

评论回复
13
山东电子小菜鸟|  楼主 | 2018-8-8 16:07 | 只看该作者

感谢顾佳茂评论

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq:641208111;技术交流群:377640799 大学电子竞赛预热赛开赛啦~千元大奖等你来拿火热进行中!!点击参加活动 欢迎加个人QQ:641208111一起交流合作

140

主题

3082

帖子

23

粉丝