嵌入式实时操作系统_第1页
嵌入式实时操作系统_第2页
嵌入式实时操作系统_第3页
嵌入式实时操作系统_第4页
嵌入式实时操作系统_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式实时操作系统多任务实时操作系统多任务实时操作系统前后台系统前后台系统的组成:前台和后台程序后台:是一个无限循环的应用程序,循环中调用相应的任务函数完成相应的操作,各个任务依次运行,没有调度,运行的次序不能改变。前台:是中断服务程序,处理异步事件。适用情形一般不复杂或实时性要求不高的小系统很适合采用前后台系统,例如微波炉、电话机、玩具等。在另外一些基于省电的应用中,由于平时微处理器处在停机状态,所有的事都靠中断服务来完成,因此也常常采用前后台系统模式。操作系统

操作系统(OperatingSystem,简称OS)是计算机中最基本的程序。操作系统负责计算机系统中全部软、硬资源的分配以及回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件平台。操作系统的主要包括四大功能:处理机管理:解决CPU的分时复用。存储管理:配合CPU调度内存。设备管理:分配外设的使用,包括独享、共享和虚拟。软件资源管理:解决程序和信息的存取和管理等问题。实时操作系统

实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。

多任务实时操作系统

用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度和异常处理等工作。

多任务实时操作系统,以分时方式运行多个任务,看上去好像是多个任务“同时”运行。任务之间的切换应当以优先级为根据,只有具有优先服务方式的RTOS才是真正的实时操作系统,而时间分片方式和协作方式的RTOS并不是真正的“实时”。相关基本概念资源与共享资源内核与任务切换消息队列时钟节拍调度死锁临界区中断任务函数的可重入性资源与共享资源程序运行时可使用的软、硬件环境统称为资源。资源可以是输入/输出设备,例如打印机、键盘和显示器;资源也可以是一个变量、一个结构或一个数组等。共享资源就是指可以被一个以上任务使用的资源。为防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫互斥。任务任务,也称为线程,是一个程序。一般地,每个任务都是一个无限的循环。任务有五种状态,任何时刻,一个任务都处于这五种状态之一的状态下。休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪态意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂不能运行

。运行态的任务是指该任务掌握了CPU的控制权,正在运行。挂起态指该任务在等待,等待某一事件的发生。被中断状态是指,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。内核与任务切换内核是操作系统最基本的部分。负责管理各个任务,为每个任务分配资源,它提供的基本服务是任务切换。任务切换当多任务内核决定运行另外的任务时,保存正在运行任务的当前状态,即保存CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。中断中断是最基本的任务切换方式,停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到以下部分:1.在前后台系统中,程序回到后台程序;2.对非占先式内核而言,程序回到被中断了的任务;3.对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。调度任务的调度方式有基于时间片轮转的调度和基于优先级的调度。多数实时系统是基于优先级调度法的。基于优先级的调度法指CPU总是让处于就绪态的优先级最高的任务先运行。至于何时让高优先级任务掌握CPU的使用权,有两种不同的情况:占先式调度任何时候具有最高优先级且已就绪的任务先执行。非占先式调度要求每个任务自我放弃CPU的所有权。临界区临界资源:任何时候都只允许一个任务访问的资源。临界区或临界段:用于访问临界资源的代码段。临界代码段不允许多个并发任务交叉执行,否则会产生严重后果,比如进入中断后的现场保护代码等。为确保临界区代码的安全执行,在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断函数的可重入性可重入(Reentrant)型函数:是指可以被多个任务并发使用,而数据不会遭到破坏的函数。可重入型函数特征:只使用局部变量,变量保存在CPU寄存器或堆栈中,可以在任意时刻被中断,再重新恢复运行时,数据不会被破坏;若使用全局变量,则需满足互斥条件。可重入型函数实例

voidfunc1(int*x,int*y){

inttemp;

temp =*x;

*x =*y;

*y =temp;

}不可重入型函数清单

staticinttemp;

voidfunc2(int*x,int*y){

temp =*x;

*x =*y;

*y =temp;

}死锁所谓死锁,是指各并发任务彼此等待对方所拥有的资源,且这些并发任务在得到对方的资源之前不会释放自己所拥有的资源,从而造成大家都想得到资源而又都得不到资源,各并发任务不能继续向前推进的状态。最简单的防止死锁发生的方法有两种:1.让每个任务先得到全部需要的资源,再进行下一步工作。2.让每个任务用同样的顺序去申请多个资源,释放资源时使用相反的顺序。消息队列和时钟节拍消息队列是保存消息的容器。通过内核提供的服务,任务或中断服务子程序可以将消息放入消息队列。同样,任务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先给任务,遵循先进先出原则(FIFO)。内核提供的典型消息队列服务如下:1.消息队列初始化,队列初始化时总是清为空;2.放一则消息到队列中去(POST);3.等待一则消息的到来(PEND);4.无等待取得消息。基于RTX51操作系统的软件设计RTX51是Keil公司开发的专门针对于8051兼容MCU所作的多任务实时操作系统,是Keil自带的小操作系统之一。有二个不同的RTX51版本,RTX51Full

和RTX51TinyRTX51Tiny是一个功能强大的RTOS,且易于使用,它用于8051系列的微控制器。该RTOS最多支持16个任务,基于RTX51Tiny构建的应用程序没有main()函数,是从任务0开始执行的,也不支持抢先任务切换和任务优先级。RTX51Tiny的程序用标准的C语言构造,由KeilC51C编译器编译。用户可以很容易的定义任务函数,而不需要进行复杂的栈和变量结构配置,只需包含一个指定的头文件(rtx51tny.h)。

RTX51Tiny使用定时器0、定时器0中断,和寄存器组1。

描述

RTX51完全模式

RTX51最小模式任务数最大256,19个激活任务,其中16个标准任务,3个快速任务16RAM40~46字节RAM

20~200字节IDATA

最少450字节XDATA7字节DATA

3*任务数IDATA

不需要XDATAROM6KB~8KB900字节定时器定时器0或1定时器0单任务和伪多任务void

main(void)

{

while(1){

do_something(

);

//一直循环执行do_something任务

}

}

void

main(void)

{

while(1){

key_scan(

);

//键盘扫描

do_key(

);

//处理按键事件

ctr_adj(

);

//调整控制器

}

}

RTX51Tiny的多任务(程序结构)void

job0(void)

_task_

0

{

os_create_task(1);

//创建任务1

os_create_task(2);

//创建任务2

os_create_task(3);

//创建任务3

os_delete_task(0);

//删除任务0

}

void

job1(void)

_task_

1

//键盘扫描任务

{

while(1){

key_scan(

);

}

}

void

job2(void)

_task_

2

//处理按键事件任务

{

while(1){

do_key(

);

}

}

void

job3(void)

_task_

3

//调整控制器任务

{

while(1){

ctr_adj(

);

}

}

RTX51的任务调度RTX51利用任务状态来管理各个任务。用户为RTX51定义的每个任务都会以各种状态的某一种来运行。RTX51内核为每个任务保留了适当的状态如下表所示。RTX51的任务状态表状态描述Running运行状态当前正在执行的任务,在任一时刻只能有一个任务处于运行状态Ready就绪状态等待执行的任务,当前任务执行完后,接着执行就绪状态任务Waiting等待状态等待某一事件的任务,如事件发生,任务进入就绪状态Deleted删除状态没有启动的任务Time-out超时状态与就绪状态相似,放在round-robin中尚未执行的任务RTX51的任务调度RTX51支持多个任务的准并行执行。任务不是被同时执行,而是以分时的方式轮片执行。可用的CPU时间被分成多个时间片,然后由RTX51将这些时间片分配给各个任务。每个任务只允许在预定的时间片中执行,时间片用完时,RTX51就切换至另一个就绪的任务,继续执行一段时间。时间片的具体长度可以用配置函数TIMESHARING来定义。如果遇到因为一个任务处于等待并且占用了时间片而暂时无法往下执行,可以调用系统函数os_wait来通知RTX51,以便将当前的任务挂起而提前执行另一任务。

RTX51的任务调度

RTX51中处理任务分配的模块称为调度程序(Scheduler)。调度程序驱动哪个任务运行是按照以下的规则进行的:(1)如果发生以下情况时,当前运行的任务将被中断:调用os_wait函数,而所等待的事件未来到;任务的执行时间已经超过所定义的Round-Robin循环时间间隔(2)如果发生以下情况时,另一个任务将被启动:已没有正在执行的任务;将要执行的任务处在就绪状态或超时状态。RTX51系统的配置编写RTX51程序需要包含RTX51TNY.H文件。在程序中,需要用一个关键字“_task_”

来声明一个函数的任务属性。RTX51程序不需要main函数。在进行连接处理时,会将启动任务0的执行所需要的代码连接进来,作为开始执行的代码。用户可以更改配置文件CONF_TNY.A51中的以下几个参数:①系统定时器中断所用的寄存器组②

系统定时器的时间间隔③

Round-Robin的超时(time-out)值④

内部数据存储器的大小⑤RTX5l启动后的自由堆栈大小

RTX51系统的配置参数描述INT_REGBANK说明RTX51系统所用的寄存器组INT_CLOCK定义系统时间间隔,系统用这个间隔产生一个中断信号,定义的数据是指每次中断发生所需的CPU周期数TIMESHARING定义Round-Robin任务切换的超时间隔(time-out),它是定时器溢出中断次数,发生指定次数中断后切换任务。如果是0,则多任务Round-Robin机制被屏蔽RAMTOP说明8051片内RAM的最大地址,8051为7FH,8052为0FFHFREE_STACK定义任务切换的堆栈自由空间体积字节数。RTX51会检验堆栈体积是否合理。如太小,引用STACK_ERROR宏STACK_ERROR当RTX51检测到堆栈出错时执行的宏,可以根据应用程序需求更换这个宏RTX51的功能函数函数描述执行周期数os_create_task将任务移入执行队列302os_delete_task执行队列中移去某任务172os_send_signal发送一信号到某任务(从某任务调用)408(任务切换)71(不含任务切换)os_clear_signal删除一发送信号57isr_send_signal发送一信号到某任务(从中断调用)46os_running_task_id返回当前执行的任务号os_wait等待某事件68(对未就绪信号)160(对未就绪消息)os_wait1等待某事件os_wait2等待某事件RTX51的功能函数isr_send_signal函数原型

charisr_send_signal(unsignedchartask_id);功能说明发送一个信号到task_id任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号将存储在此任务的信号标志中。此函数只能从中断函数中调用。返回值如果执行成功,此函数返回0值;如果所指定的任务不存在,则返回-1。os_clear_signal函数原型

charos_clear_signal(unsignedchartask_id);功能说明清除由task_id任务的信号返回值如果信号清除成功,此函数返回0值;如果所指定的任务不存在,则返回-1

os_send_signal函数原型

charos_send_signal(unsignedchartask_id);功能说明发送一个信号到task_id任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号将存储在此任务的信号标志中。此函数只能在任务函数中调用返回值如果执行成功,此函数返回0值;如果所指定的任务不存在,则返回-1RTX51的功能函数os_create_task函数原型

charos_create_task(unsignedchartask_id);功能说明启动已定义的由task_id任务。此任务根据RTX51运行规则,标记为就绪,并准备执行。返回值如果任务成功启动,此函数返回0值;如果没有task_id任务,则返回-1

os_delete_task函数原型charos_delete_task(unsignedchartask_id);功能说明停止task_id任务,此任务将从任务表中删除。返回值如果任务成功启动,此函数返回0值;如果没有task_id任务,则返回-1。

③os_running_task_id函数原型charos_running_task_id(unsignedchartask_id);功能说明判断当前执行任务的编号返回值返回当前正在执行的任务的编号,返回值为0~15。

RTX51的功能函数os_wait函数原型charos_wait(unsignedcharevent_sel,unsignedchartisks,unsignedchardummy);

/*将要等待的事件*/

/*将要等待的定时器时标数*/

/*未用参数*/

功能说明停止当前执行的任务,并等待一个或多个事件,如时间间隔、超时、从另一个任务或中断发出的信号等。参数event_sel说明所等待的一个事件或几个事件的组合。事件种类及返回值如下表所示:

os_wait函数的事件参数表os_wait函数的返回值表事件描述K_IVL定时器溢出K_SIG收到信号K_TMO时间片超时返回值描述SIG_EVENT信号被接收TMO_EVENT发生超时或事件间隔已过NOT_OKevent_sel的值非法RTX51的功能函数os_wait1

函数原型

charos_wait1(unsignedcharevent_sel);功能说明暂停当前任务,等待一个事件的发生。它是os_wait函数的一个子集,不接受针对os_wait函数提供的全部事件。参数event_sel指定了等待的事件,它只能是K_SIG。返回值当信号事件发生时,任务就被允许执行,任务的执行将恢复。返回用于识别事件、使任务重新启动的常量。os_wait2函数原型charos_wait2(unsignedcharevent_sel,

unsignedchartisks);

/*将要等待的事件*/

/*将要等待的定时器时标数*/功能说明与os_wait相同,但是不需要dummy参数。返回值与os_wait相同最好的学习资料最好的学习资料是Keil中自带的用户手册RTX51的应用举例下面的代码将要实现的功能是:使LED0每隔1秒切换一次状态(ON/OFF),LED1每0.7秒切换一次状态,LED2每0.4秒切换一次状态,LED3每0.2秒切换一次状态。#include<rtx51tny.h>#include<reg52.h>typedefunsignedcharuchar;typedefunsignedintuint;sbitLED0=P2^0;sbitLED1=P2^1;sbitLED2=P2^2;sbitLED3=P2^3;sbitKEY0=P1^7;

voidjob0(void)_task_0{

LED0=1;

LED1=1;

LED2=1;

LED3=1;//关闭四个LED

os_create_task(1);//创建任务1

os_create_task(2);//创建任务2

os_create_task(3);//创建任务3

os_create_task(4);//创建任务4

os_create_task(5);//创建任务5

os_delete_task(0);//删除自己(task0),使task0退出任务链表}voidjob1(void)_task_1{

while(1){

LED0=!LED0;

os_wait(K_TMO,100,0);//等待100个时钟周期

}

}voidjob2(void)_task_2

{

while(1){

LED1=!LED1;

os_wait(K_TMO,70,0);//等待(延时)0.7s

}}voidjob3(void)_task_3{

while(1){

LED2=!LED2;

os_wait(K_TMO,40,0);//等待(延时)0.4s

}}voidjob4(void)_task_4{

while(1){

LED3=!LED3;

os_wait(K_TMO,20,0);//等待(延时)0.2s

}}

voidjob5(void)_task_5{

while(1){

if(0==KEY0){//判断按键是否按下

LED3=1;

os_delete_task(4);//按键按下时关闭LED3,使task4退出任务链表,LED3不再闪烁

}

}}

RTX51的应用举例RTX51在单片机控制的GPS接收板上的应用

(1)系统硬件组成

单片机W77E58、快速8051内核、32KBROM、1KB的XDATARAM,符合使用RTX51的硬件要求;键盘、GPS定位模块、液晶显示模块。(2)系统软件构成

软件运行环境KEILuVision26.20集成开发环境加上RTX51完全版。任务KEY-BOARD,监测键盘的情况,如果有按键按下,把按键的编码发送到邮箱1,外部中断1等待接收GPS数据,并把数据存储起来,向DISPLAY任务发出信号,进行处理。任务SEND_OUT,把接收到的数据

进行处理,并发送出去。任务VOICE进行语音输出。RTX51的应用举例

#include<RTX51.h>

//包含RTX51文件

#defineDISPLAY0

#defineSEND_OUT1

#defineKEY_BOARD2

#defineVOICE3

voidmain(void)

{

init_system();

//系统初始化

os_start_system(DISPLAY);

//启动RTX51

}

viodtask0(void)_task_DISPLAY

{

os_set_slice(1000);

//设置时间片大小

os_enable_isr(0);

//允许外部中断0

os_creat_task(SEND_OUT);

//启动SEND_OUT任务

os_creat_task(VOICE);

//启动VOICE任务

os_creat_task(KEY_BOARD);//启动KEY_BOARD任务

for(;;){

switch(os_wait(K_SIG+K_MBX+1,255,&keyboard))//等待接收信号和键盘消息

{caseEVENT_SIGNAL:

//当接收到信号的时候

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论