[内核技术]

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

[复制链接]
1732|13
手机看帖
扫描二维码
随时随地手机跟帖
山东电子小菜鸟|  楼主 | 2018-8-5 16:52 | 显示全部楼层 |阅读模式
本帖最后由 山东电子小菜鸟 于 2018-8-8 16:11 编辑



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



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


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


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


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


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


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


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


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

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

作者:王奇

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

下载相关资料








相关帖子

山东电子小菜鸟|  楼主 | 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 | 显示全部楼层
111.jpg

使用特权

评论回复
山东电子小菜鸟|  楼主 | 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 是溢出标志,数据运算过程中产生数据溢出了就会更改此标志。



三 、

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


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

使用特权

评论回复
山东电子小菜鸟|  楼主 | 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 个寄存器可以使


用。

使用特权

评论回复
山东电子小菜鸟|  楼主 | 2018-8-5 17:17 | 显示全部楼层
本帖最后由 山东电子小菜鸟 于 2018-8-5 17:19 编辑

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


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


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


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


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


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


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


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



使用特权

评论回复
山东电子小菜鸟|  楼主 | 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 快一些。

使用特权

评论回复
山东电子小菜鸟|  楼主 | 2018-8-5 17:21 | 显示全部楼层
111.jpg
CPSR 与 R 寄存器不同,所有模式下均是使用同一个 CPSP 寄存器,在模式切换时硬件


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


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


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



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


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


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


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


系统的任务切换过程。

使用特权

评论回复
caijie001| | 2018-8-7 13:36 | 显示全部楼层
mark

使用特权

评论回复
gujiamao12345| | 2018-8-7 20:15 | 显示全部楼层
好久没上论坛了,鸟哥发干活了

使用特权

评论回复
评论
山东电子小菜鸟 2018-8-8 16:13 回复TA
感谢顾佳茂大哥支持 
山东电子小菜鸟|  楼主 | 2018-8-8 16:06 | 显示全部楼层

感谢杰杰评论

使用特权

评论回复
山东电子小菜鸟|  楼主 | 2018-8-8 16:07 | 显示全部楼层

感谢顾佳茂评论

使用特权

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

本版积分规则

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

140

主题

3082

帖子

23

粉丝