嵌入式操作系统

发布 2022-10-21 07:23:28 阅读 8387

嵌入式课程设计。

uc/os内核分析。

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

现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。90%的uc/os-**使用标准的ansi c语言书写,程序可读性强、移植性好;同时它可被免费获得即使商业性的应用也只收取少量的许可费用。

uc/os-具有很好的可移植性,而且移植过程非常简单,因此被广泛的应用于各种嵌入式微处理器中,同时也得到了众多开发工具的支持,可以在一系列方便的窗口中显示uc/os-的内部数据结构。uc/os-提供了一个辅助模块,uc/os-view来观察任务状态。uc/os-还提供了许多接口模块,如图形用户界面,uc/gui、文件系统uc/fs、tcp/ip栈 uc/tcp-ip、usb栈uc/usb等方便用户的使用。

任务管理。简单的说,任务管理就是一个具用系统控制参数的函数。这个参数具用形式参数,主体一般是在一个必要的初始化之后的一个无限的循环,该函数不会返回。

而系统控制参数就是嵌入式操作系统管理该任务的一个数据结构。在uc/os-中称为任务管理块(os-tcb)。os-tcb是在任务建立时就被建立和赋值,它用来保存和恢复该任务,其信息包括当前任务栈顶的指针、任务优先级、任务堆栈容量等。

uc/os-可以管理64个任务,除去uc/os-和系统任务和保留任务优先级,可以多达56个应用任务供用户使用。优先级号越小,任务的优先级就越高。在uc/os- 中,任务的优先级号往往就是任务的编号。

uc/os-总是运行进入就绪态中的优先级最高的任务。确定哪个任务优先级最高,以及哪个任务运行了,是由调试器(scheduler)完成的。任务级的调度是由函数ossched()完成的:

中断级的调度是由函数osintext()完成的。

建立任务。在uc/os-中使用函数ostaskcreate()或者ostaskcreateexit()来建立任务。ostaskcreateexit()在ostaskcreate()的基础上扩展了一些功能。

ostaskcreate() 该函数的原型为:

int8u ostaskcreate( void (*task) (void*pd),void *pdata,os-stk *ptos,int8u prio);

task 指向任务所对应函数的指针。

pdata 可以指向一个数据结构,用来在建立任务的时候向该任务传递一些参数。

ptos 指向该任务堆栈栈顶的指针。

prio 为该任务的优先级。

执得结果有以下几种情况:

任务成功建立,返回os-no-err.

如果具用该优先级的任务已经存在,返回os-prio-exist.

如果任务的优先级低于在文件中定义的系统最低优先级os-lowest-prio,返回os-prio-invalid

如果系统中不有多余的os-tcb,返回os-no-more-tcb.

ostaskcreateexit()该函数的原型为:

int8u ostaskcreateext(void (*task)(void *pd),void *pdata,os-stk *ptos,int8u prio,int16u id,os-stk *pbos,int32u stk_size,void*pext,int16u opt);

id 任务标识。

pbos 指针,指向任务堆栈栈底。

stk_size 参数标明了任务堆栈的容量。

pext 用户自定义的数据结构指针,来扩展tcb的功能。

opt 任务操作的一些选项,例如堆栈检查、清空堆栈等。

任务的挂起与恢复。

uc/os-通过函数ostasksuspend()无条件地将正在运行的任务挂起,被挂起的任务处于等待状态,只能通过调用函数ostaskresume()函数来唤醒,进入就绪状态。也就是说,被ostasksupend()函数挂起的的任务被剥夺了cpu的控制权,需要ostaskresume()函数来恢复这种权利。任务的挂起可以由自己来完成。

也可以由其它任务来完成。当任务被挂起后,只有其他任务才能将其恢复。

ostasksupend()该函数的原型为:

int8u ostasksupend(int8u prio);

执行结果有以下几种:

os-no-err任务挂起成功。

os-task-supend-prio 优先级prio不存在。

os-prio-invalid 优先级prio 超出os-lowest-prio的范围。

os-task-supend-idle 优先级prio指定到空闲任务。

ostaskresume()该函数的原型为:

int8u ostaskresume (int8u prio);

执行结果有以下几种:

os-no-err任务恢复成功。

os-task-resume-prio 优先级prio不存在。

os-prio-invalid 优先级prio 超出os-lowest-prio的范围。

os-not-supend优先级prio没有处于挂起状态。

2. 通信机制。

为了实现任务之间的数据共享、同步和通信,uc/os-提供了多种方法包括信息量、邮箱和消息队列等信号形式,在uc/os-中,这些信息称为事件(event)。

uc/os-提供了统一的事件控制块(ecb)来管理这些信号。同任务控制块(tcb)一样,ecb也是一个数据结构,,其中包括了事件的类型、事件的指针、等待该事件的任务列表等信息。

在基于嵌入式操作系统的程序中,通常采用下图所示的方法来进行通信。在中断服务isr或者任务释放某种形式的信号,而另外有一个或者多个任务在等待该信号的到来,从而有机会进入就绪态或者运行态。等待事件发生的多个任务按照优先级的高低来获取有效信号。

在中断服务isr中,可以发出信号,但禁止无限期地等待某个信号,否则会影响系统的响应时间,甚至引起更严重的结果。

图1任务之间、任务和isr之间的通信。

uc/os-的几种事件形式。

信号量。信号量是一种相对比较简单的通信方式,除去等待它的任务列表之外,它可以看成是一个单纯的整数,在uc/os-中,它的取值范围是0~6535。信号量主要用于任务之间的同步或者简单的信息传递,或者用来记录系统中某个共享资源目前可以使用的数量。

采用信号量进行通信任务,就是基于这个信号量的数值进行工作的。与邮箱和消息队列相比,信号量无法传递复杂的信息,但具有最短的cpu处理时间。

信号量的建立。

信号量的建立是通过调用函数ossemcreate()来完成的,该函数的原型为:

os_event *ossemcreate(word value);

其中value是该信号量的初始值,是一个16位无符号整型数据量。返回值是该信号量的事件控制块的指针。

信号量的释放。

信号时的释放标志着某一事件已经发生,或者某项资源得到了释放或者增加,它可能引起等待事件或者资源的任务就绪。信号量的释放是通过调用函数ossempost()来完成的。如果操作成功,ossempost()将使该信号量的数值增1。

ossempost()的原型为:

int8u ossempost(os_event *pevent);

pevent就是返回值,一个信号量的事件控制块的结指针。共有三种返回值分别为:

os-no-err 信号量释放成功。

os-sem-ovf 信号量溢出。

os-err-event-type pevent 参数有误返回。

信号量的等待。

信号量的等待是指任务在等待某个信号量的到来,以进入就绪态,它通过ossempend()函数来表示。如果该任务调用ossempend()函数时,信号量的值非零,ossempend()把该信号量减1,如果该任务在等待信号量的所有任务中具有最高的优先级,那么该任务就会进入就绪态。ossempend()函数可以规定任务等待信号量的最长时间,在最长时间内如果任务没有得到信号量,任务将转入就绪态,并返回超时信息。

ossempend()函数原型号为:

void ossempend(os-event *pevent, int16u timeout, it8u, *err);其中:pevent 形式参数,是信号量的指针。

timeout 规定了任务等待该信号量的最长时间,它为零,表示无限期的等待。

err 函数返回的错误**,它有四种情况,分别为;

os-no-err成功等到信号量的时候。

os-timeout 等待超时。

os-err-pend-isr 在中断服务isr中调用。

os-err-event-type pevernt参数有误。

邮箱。邮箱用来在任务之间或者中断和任务之间传递的一个指针,该指针指向的是就。

是需要传递的信息,信息通常是事先定义好的一个数据结构,包含了需要传递的必要参数。发送信息的任务或者中断指针放入邮箱,接收信息的任务将指针从邮箱中取走。一个邮箱只能存放一条信息,当邮箱已满的时候,向邮箱添加信息会出现错误;当邮箱为空的时候,等待该信息的任务将处于等待状态或者在超时情况下运行。

邮箱的建立。

在uc/os-中,邮箱的建立是通过调用函数osmboxcreate()来完成的,它在建立邮箱的同时,进行了邮箱的初始化。osmboxcreate()函数的原型为:

os-event * osmboxcreate(void *msg );

形式参数msg用来初始化建立消息邮箱。通常msg为null,表示邮箱在建立初始时的内容为空;如果将msg指向存在的信息,则表示建立邮箱的时候向其中放入了一条信息,这种用法可以用来进行资源共享。osmboxcreate()的返回值就是指向该信息邮箱的事件控制块的指针。

嵌入式操作系统

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

嵌入式操作系统

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

嵌入式操作系统

概述部分 嵌入式系统硬件组成 处理器子系统,存储子系统,附属电路,i o子系统,调试子系统。软件组成 初始化引导 操作系统,通信协议栈,图形用户界面,应用软件。板极支持包 各种商用实时操作系统,都采用了分层的设计方法,它将系统中与硬件直接相关的一层软件独立出来,称之为board support pa...