3.1 嵌入式软件基础

目录

1.1、嵌入式软件体系结构

1.1、无操作系统的情形

1.2、设备驱动层

1.2.1、版本支持包

1.2.2、引导加载程序

1.2.3、设备驱动程序

1.3、嵌入式中间件

2、嵌入式操作系统概述

2.1、嵌入式操作系统概念

2.2、常见嵌入式操作系统

3、任务管理

3.1、进程、线程和任务

3.1.1、进程

3.1.2、线程

3.1.3、任务

3.1.2、任务的调度

3.1.3、任务间通信

4、存储管理

4.1、分区存储管理

4.2、地址映射

4.2.1、静态地址映射

4.2.2、动态地址映射

4.3、页式存储管理

4.4、虚拟存储管理

5、设备管理

5.1、设备管理基础

5.1.1 I/O独立编址

5.1.2 内存映像编址

5.1.3 混合编址

5.2、I/O控制方式

5.2.1 程序循环检测

5.2.2 中断驱动方式

5.2.3 直接内存访问方式

5.3、I/O软件

5.3.1 中断处理程序

5.3.2 设备驱动程序

5.3.3 设备独立的I/O软件

5.3.4 用户空间的I/O软件


 

1.1、嵌入式软件体系结构

1.1、无操作系统的情形

  • 循环轮转方式
for() {
//do something
}
  • 前后台系统

前后台系统是在循环轮转的基础上增加了中断处理功能。中断服务程序(Interrupt Service Routine,ISR)

负责处理异步事件,这部分看做前台系统。而后台系统一般是一个无限的循环。

1.2、设备驱动层

1.2.1、版本支持包

设备驱动层也叫版本支持包(Board Support Package,BSP),BSP的思想是把所有与硬件相关的代码都封装起来,并向上提供一个虚拟的硬件平台,而操作系统就运行在这个虚拟的硬件平台上。一般来说,BSP只要包括两个方面的内容:引导加载程序BootLoader和设备驱动程序。

1.2.2、引导加载程序

引导加载程序是BootLoader是嵌入式系统加电后运行的第一段软件代码,在PC机中,她的引导加载程序是由两部分组成:位于ROM中的BIOS和位于硬盘主引导记录(Master Boot Record,MBR)中的BootLoader引导程序。

BootLoader就是在操作系统内核运行之前运行的一小段程序。通过这段程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境设置到一个合适的状态。

1.2.3、设备驱动程序

设备驱动程序就是一组库函数,用来对硬件进行初始化和管理,并向上提供良好的访问接口。

1.3、嵌入式中间件

嵌入式中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件。

2、嵌入式操作系统概述

2.1、嵌入式操作系统概念

所谓的内核是指系统当中的一个组件,它包含了OS的主要功能。这些功能包括:任务管理、存储管理、输入/输出(I/O)设备管理和文件系统管理。

  • 任务管理:对嵌入式系统中的运行软件进行描述和管理,并完成助理级资源的分配与调度。
  • 存储管理:提高内存的利用率,方便用户的使用,并提供足够的存储空间。
  • I/O设备管理:方便设备的使用,提高CPU和输入输出设备的利用率。
  • 文件系统管理:解决文件资源的存储、共享、保密和保护等问题。

2.2、常见嵌入式操作系统

  • VxWorks:是美国WindRiver System公司开发的一款嵌入式实时操作系统。
  • 嵌入式Linux:芬兰人Linus Torvalds发明的
  • Windows CE:微软公司发布的嵌入式操作系统。
  • ucOS-II:美国人Jean Labosse发明的,免费、开源。

3、任务管理

3.1、进程、线程和任务

3.1.1、进程

进程,简单的说,是一个正在运行的程序。
进程与程序既有联系又有区别,主要表现为下面结构方面:

  •  程序由数据和代码两部分内容组成, 它是一个静态的概念。 而进程是正在执行的程序,它也由两部分组成: 程序和该程序的运行上下文。它是一个动态的概念。
  • 程序和进程之间并不是一一对应的。 一个进程在运行的时候可以启动一个或多个程序。反之,同一个程序也可能由多进程同时执行。
  • 程序可以作为一种软件资源长期保存, 以文件的形式存放在光盘或硬盘上, 而进程则是一次执行的过程,它是暂时的,是动态的产生和终止。

一个进程至少应包括三个方面: 相应的程序、 CPU 上下文、一组系统资源

3.1.2、线程

线程就是代码在进程的资源平台上的一条执行流程。对于同一个进程当中的各个线程来说, 他们可以共享该进程的大部分资源。线程的CUP上下文和栈这两种资源是不能与其他线程共享的

3.1.3、任务

在VxWorks以及uc-OS-II中,任务指的就是线程,而在Linux中任务指的就是进程。

任务的状态有三种,运行状态、就绪状态以及阻塞状态,转换的关系如下图

3.1.2、任务的调度

任务的调度主要有两种方式:可抢占调度和不可抢占调度。

  • 可抢占方式:当一个任务正在运行时,调度程序可以去打断它,并安排另外的任务去运行。
  • 不可抢占方式:如果一个任务被调度程序选中,则会一直运行下去,直到它因为某种原因被阻塞了,或者主动交出了CPU的使用权。

任务的调度有几个性能指标,简单提两个:

  • 响应时间:调度器为一个就绪任务进行上下文切换所需要的时间,以及任务在就绪队列中的等待时间。
  • 周转时间:一个任务从提交到完成所经历的时间。

调度的算法:

  • 先来先服务算法(First Come First Server,FCFS):不可抢占式调度方式
  • 短作业优先算法(Short Job First,SJF):又分为可抢占式调度和不可抢占式调度。
  • 时间片轮转调度:给每个就绪任务分配一小段CPU时间。

3.1.3、任务间通信

任务的高级通信方式主要包括共享内存、消息传递和管道三类。

  • 共享内存:各个任务共享特定地址空间当中的某些部分。
  • 消息传递:指任务与任务之间通过发送和接受消息来交换信息。
  • 管道:即连接两个任务之间的一个打开的共享文件。

4、存储管理

4.1、分区存储管理

把整个分区划分为两大部分,即系统区和用户区。在具体实现上由可以分为两类:固定分区和可变分区。

固定分区的利用率不高,内碎片会造成很大的浪费。

可变分区会产生外碎片,就是各个占用的分区之间,有难以利用的一些空余空间,这通常是一些比较小的空闲分区。

在内存的算法上,当一个新任务到来时,需要为他寻找一个空闲分区,其大小必须大于等于该任务的要求,若是大于该要求,则将该分区分割成两个小的分区,其中一个分区为要求的代销并标记为占用,另一个分区为余下的部分并标记为空闲。

通常分区匹配的算法有:最先匹配法、下次匹配法、最佳匹配法以及最坏匹配法。

4.2、地址映射

为了保证CPU在执行指令的时候,可以正确的访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这个过程就称为地址映射。

用户的程序经过汇编或者或者编译后形成的目标代码,而目标代码通常采用的就是相对地址的形式,其首地址为0,其余指令中的地址都是相对于这个首地址来编址的。

4.2.1、静态地址映射

当用户程序被装载到内存时候,直接对指令代码进行修改,一次性第实现逻辑地址到物理地址的转换。

4.2.2、动态地址映射

当用户程序被装载到内存时,不对指令代码做任何修改,而是杂程序的运行过程中,当它需要访问内存单元时,再来进行地址转换。

4.3、页式存储管理

4.4、虚拟存储管理

 

5、设备管理

5.1、设备管理基础

在嵌入式系统中存在各种类型的输入/输出(I/O)设备,包括键盘、触摸屏、液晶显示器。

一个I/O单元通常由两部分组成:一个是机械部分,既I/O本身;另一个是电子部分,既设备控制器或设备控制器。I/O设备本身不予CPU打交道,而是通过它的设备控制器与CPU打交道。

  那么CPU如何来访问设备控制器中的这些寄存器呢,主要有三种:I/O独立编址、内存映像编译和混合编址。

5.1.1 I/O独立编址

对于设备控制器中的每一个寄存器,分配一个唯一的I/O端口编号,然后通过专门的I/O指令来对这些端口操作。

5.1.2 内存映像编址

把设备中的每一个寄存器都映射为一个内存单元,这些内存单元用于I/O操作,对这些内存单元的读写方式与平常的内存访问时完全相同的。

5.1.3 混合编址

对于设备控制器当中的寄存器,采用独立编址的方法。对于设备当中的缓冲区则采用内存映像编址的方法。

5.2、I/O控制方式

I/O设备的控制方式有三种:程序循环检测、中断驱动和直接内存访问。

5.2.1 程序循环检测

在程序当中。通过不断的检测I/O设备的当前状态,来控制一个I/O操作的完成,也称为繁忙等待法或轮训方式。缺点:在进行I/O设备的控制时候,需要一直占用CPU,就会浪费CPU时间。

5.2.2 中断驱动方式

当用户需要I/O操作时,会去调用相应的系统函数,由这个函数发起I/O操作,并将任务阻塞起来,然后去调度其他的任务去使用CPU。当所需的I/O操作完成时候,相应的设备就会向CPU发送一个中断,系统在中断的地方发现还有数据需要处理,就在次启动I/O操作。

5.2.3 直接内存访问方式

在中断驱动的控制方式下,每一次的数据读写还是通过CPU来完成的,如果每一次处理的数据量比较小如1个字节,中断出现的频率就很高,而中断处理需要额外的系统开销,所以也会浪费一些CPU时间。

人们就提出了新的解决方法,就是直接内存访问(Direct Memory Acess, DMA)的控制方式。让DMA控制器来代替CPU完成I/O设备与内存之间的数据传送,从而节省更多的CPU时间。

5.3、I/O软件

设备管理软件的分为四个层次,中断处理程序、设备驱动程序、设备独立的I/O软件以及用户空间的I/O软件。

5.3.1 中断处理程序

当一个用户程序需要某种I/O服务时,它回去调用相应的系统函数,而这个函数又会去调用相应的设备驱动程序。在设备驱动程序去启动I/O操作,并且被阻塞起来,直到这个I/O操作完成后,将产生一个中断,并跳到相应的中断处理程序。之后再中断处理程序中,将会唤醒阻塞的驱动程序。

5.3.2 设备驱动程序

设备驱动程序的基本任务就是接受来自于上层I/O软件的抽象请求,并且去执行这个请求。

5.3.3 设备独立的I/O软件

在这个层面上实现的主要功能有:设备驱动程序的管理、设备驱动程序的统一接口、设备命名、设备保护、缓冲技术、出错报告以及独占设备的分配与释放。

5.3.4 用户空间的I/O软件

通常大部分的I/O软件都是包含在操作系统当中,是操作系统的一部分,但也有一小部分的I/O软件,他们运行在系统内核之外。主要有两部分

  • 与用户程序进行链接的库函数(C语言中的I/O有关库函数)
  • 完全运行在用户空间的程序:Spooling技术可以把一个独占设备转变为具有共享设备的虚拟设备。

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值