嵌入式操作系统

发布 2022-10-21 07:36:28 阅读 8804

概述部分:

嵌入式系统硬件组成:处理器子系统,存储子系统,附属电路,i/o子系统,调试子系统。

软件组成:初始化引导**,操作系统,通信协议栈,图形用户界面,应用软件。

板极支持包:

各种商用实时操作系统,都采用了分层的设计方法,它将系统中与硬件直接相关的一层软件独立出来,称之为board support package即简称bsp。

能够支持众多的硬件平台,并实现应用程序的硬件无关性。

bsp的主要功能在于配置系统硬件使其工作于正常的状态,完成硬件与软件之间的信息交互,为os及上层应用程序提供一个与硬件无关的软件平台。

bsp位于硬件平台与操作系统之间,用于对上层软件屏蔽各种硬件相关性。

1.按软件实时性分为:

非实时系统(pda)

软实时系统(如消费类产品)

硬实时系统(工业实时控制系统)

2.按商用与免费分。

引导加载程序(boot loader)的工作:将内核映像从硬盘上读到ram中,然后跳到内核的入口点击运行,也即开始启动操作系统。

boot loader的典型结构框架:大多数 boot loader 都分为 stage1 和 stage2 两大部分。依赖于 cpu 体系结构的**,比如设备初始化**等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。

而 stage2 则通常用c语言来实现,这样可以实现给复杂的功能,而且**会具有更好的可读性和可移植性。

stage1:

硬件设备初始化。

为加载 boot loader 的 stage2 准备 ram 空间。

拷贝 boot loader 的 stage2 到 ram 空间中。

设置好堆栈。

跳转到 stage2 的 c 入口点。

stage2:

初始化本阶段要使用到的硬件设备。

检测系统内存映射(memory map)。

将 kernel 映像和根文件系统映像从 flash 上读到 ram 空间中。

为内核设置启动参数。

调用内核。

任务之间的通信:信箱、队列、管道。

uc/os的任务调度:

任务调度将在以下情况下发生:

1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。

2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。

最高优先级任务的寻找。

通过建立就绪列表实现。

u c / o s 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块tcb(task control block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。

任务切换。任务调度模块首先用变量ostcbhighrdy 记录当前最高级就绪任务的tcb 地址,然后调用os_task_sw()函数来进行任务切换。

uc/os任务的五种状态:睡眠,就绪,运行,等待,中断服务。

uc/os的任务程序形式:

1.过程(从**上看,任务就是函数) 2.无限循环 3.没有返回,没有返回参数 4.可以有输入参数,没有输出参数 5.没有出口 6.每个任务有自己的堆栈

为了保证系统的可靠运行,一般地任务的创建在系统中初始化中进行。创建任务等资源,不许分配内存资源,删除任务时释放内存资源,内存分配和释放多次以后,会产生碎片,最终会造成系统的资源枯竭,系统无法继续运行下去。

uc/os-ii任务有两种:用户任务和系统任务

uc/os的任务存储结构:

1.任务堆栈(为了满足任务切换和响应中断时保存cpu寄存器中的内容及任务调用其他函数时的需要,每个任务都有自己的堆栈,所有uc/os-ii任务的控制块中都含有一个指向该任务堆栈的指针)

2.任务控制块(ostcbtbl):uc/os-ii用来记录任务的堆栈指针,任务的当前状态,任务的优先级等一些任务管理有关的属性的表就叫做任务控制块;任务控制块相当于一个任务的身份证,系统通过任务控制块感知和管理任务,uc/os-ii把系统所有任务的控制块链接为两条链表,并通过它们管理各个任务

3. uc/os-ii用两条链表(tcblist)管理任务控制块。

空任务块链表:其中所有任务控制块还未分配给任务。

任务块链表:其中所有任务控制块已分配给任务。

任务堆栈的初始化:把任务初始数据存到任务堆栈。

任务的创建:创建任务实质上是创建一个任务控制块,并通过任务控制块把任务**和任务堆栈关联起来形成一个完整的任务。

uc/os-ii有两个用来创建任务的函数:ostaskcreate()和ostaskcreateext()

ostaskcreateext()是前者的扩展,并提供了一些附加功能。

uc/os调度机制(按某种规则进行任务切换):uc/os-ii采用了按优先级抢占式规则。

系统中每个任务都按照其任务的重要性分配有一个唯一的优先级别。

优先级别高的任务先运行,优先级别低的任务后运行。

uc/os-ii最多可创建64个任务,任务优先级别最多64级,用整数表示,0,1,2...63.数字越小,优先级越高。

任务调度主要由调度器完成:调度器主要有两项工作:

在任务就绪表中查找具有最高优先级别的就绪任务。

实现任务切换。

uc/os-ii有两种调度器:

任务级调度器:由函数ossched()实现。

中断级调度器:由函数osintext()实现。

osrdytbl和osrdygrp的关系:为了便于对就绪表的查找uc/os-ii定义了一个数据类型为int8u的变量osrdygrp,并使该变量的每一个位都对应osrdytbl的一个任务组。

如果某任务组中有任务就绪,则变量osrdygrp里把该任务组所对应的位置为1;否则置为0

对任务就绪表的操作:

1.登记:当某个任务处于就绪态时,系统就将该任务登记在任务就绪表中,即在就绪表中将改任务的对应位置1.

osrdygrp | osmaptbl[prio>>3];

osrdytbl[prio>>3] |osmaptbl[prio&0x07];

2.注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的对应位置0

if((osrdytbl[prio >>3]& osmaptbl[prio&0x07])=0)

osrdygrp&=-osmaptbl[prio >>3];

3.最高优先级就绪任务的查找。

y=osunmaptal[osrdygrp]; 获得优先级别的高三位。

x=osunmaptal[osrdygrp[x]];获得低三位。

prio=(y<<3)+x; /获得就绪任务的优先级别。

osunmaptbl识uc/os为提高查找速度定义的一个数组,共有256个元素

4.使任务进入就绪态:如果prio是任务优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:

osrdygrp|=osmaptbl[prio>>3];

osrdytbl[prio>>3] |osmaptbl[prio& 0x07];

假设优先级为12——1100b

osrdygrp|=0x02;

osrdytbl[1] |0x10;

在这里我们要特别注意osmaptbl[ ]的值。

任务间的同步(任务之间的制约性合作):在多任务合作工作的过程中,操作系统应该解决两个问题:

各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等该任务释放该资源后,等待的任务之一才能使用它。

相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。

消息邮箱:用来传递消息缓冲区指针的数据结构。

消息队列:用来传递多个消息的数据结构。

osstathighrdy()函数的作用:当调用osstart()时,osstart()从任务就绪表中找出那个用户建立的优先级最高任务的任务控制块。然后调用高优先级就绪任务启动函数osstarthighrdy()。

这个文件与选择的微处理器有关。实质上,函数osstarthighrdy()是将任务栈中保存的值弹回到cpu寄存器中,然后执行一条中断返回指令,中断返回指令强制执行该任务**。

信号量集的管理:从总体上看ucos-ii把信号量集的功能分成了两部分:标志组和等待任务链表。

标志组存放了信号量集的所有信号。

等待任务链表中的每个节点都对应着一个叫做os_flag_node的结构。

os_flag_node结构实质上就是等待任务控制块。

即ucos-ii信号量集由一个标志组和多个等待任务控制块组成。

内存控制块的组织方式:

uc/os-ii对内存进行两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存块。

操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。

内存分区及内存块的使用情况则由内存控制块来记录。

osintctxsw: 调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,完成这个切换工作的函数osintctxsw()就叫做中断级任务切换函数。

宏os_enter_critical()和os_exit_critical()的实现方法(三种):

方法1:直接使用处理器的开中断和关中断指令来实现宏,这时需要定义令常数os_critical_method=1

#define os_enter_critical()

asm("di关中断。

#define os_exit_critical()

asm("ei开中断。

方法2:可使cpu中断允许标志的状态在临界段前和临界段后不发生改变。

在宏os_enter_critical()中,把cpu的允许中断标志保持到堆栈中,然后再关闭中断,这样在临界段结束时,即再调用宏os_exit_critical()时,只要把堆栈中保存的cpu允许中断状态恢复即可。

#define os_enter_critical()

asm("push psw")

通过保存程序状态字来保存中断允许标志。

asm("di") 关中断。

#define os_exit_critical()

嵌入式操作系统

嵌入式操作系统eos embedded operatingsystem 是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。eos负责嵌人系统的全部软 硬件资源的分配 调度工作,控制协调并发活动 它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。目前,已推出一些应...

嵌入式操作系统

嵌入式课程设计。uc os内核分析。uc os 是由micrium公司设计,源 完全的实时嵌入式操作系统,而且是第一个公开内核实现机制的实时操作系统。uc os 结构非常紧凑,使用也很简单。uc os 功能比较强大,支持56个用户任务,其内核为占先式,支持信号量 邮箱 消息对列等多种进程间通信机制。...

嵌入式操作系统

操作系统。在嵌入式操作系统的基础上直接开发设计出安全 稳定和高效的系统是有。一定难度的。目前,大多数开发者都会选择在原有的操作系统上进行简编 整。合,设计出本身需要的系统。当前比较流行的操作系统主要有 vxworks psos windows ce 和 linux 等。已有许多的公司都在致力研发适合...