[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章

PPT
  • 阅读 110 次
  • 下载 0 次
  • 页数 71 页
  • 大小 802.520 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章
可在后台配置第一页与第二页中间广告代码
[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章
可在后台配置第二页与第三页中间广告代码
[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章
可在后台配置第三页与第四页中间广告代码
[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章
[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 71
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】[计算机软件及应用]单片机原理与嵌入式系统设计-原理、应用、Protues仿真、实验设计第9章.ppt,共(71)页,802.520 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2133.html

以下为本文档部分文字说明:

第9章多任务实时操作系统RTX-51RTX-51是Keil公司开发的一款应用于80C51系列单片机的实时多任务操作系统。采用RTX-51可简化复杂的软件设计,缩短项目周期。RTX-51使得复杂的多任务程序设计变

得简单,因此在80C51系列单片机嵌入式系统中应用很广泛。◼9.1RTX-51实时多任务操作系统简介◼9.2RTX-51TINY的任务管理◼9.3如何使用RTX-51◼9.4RTX-51TINY提供的系统函数◼9

.5RTX-51TINY的配置◼9.6基于Proteus的RTX-51应用实例◼本章小结RTX-51实时多任务操作系统简介RTX-51是Keil公司开发的用于80C51系列单片机的多任务实时操作系统。RTX-51可以在单个C

PU上管理几个作业(任务),因而使复杂的系统和软件设计以及有时间限制的工程开发变得简单。RTX-51有2个模式:RTX-51FULL(完全模式)和RTX-51TINY(最小模式)。RTX-51FULL允许4个优先权任务的循环

和切换,并且还能并行地利用中断功能。RTX-51支持信号传递,以及与系统邮箱和信号量进行消息传递。RTX-51的os_wait函数可以等待以下事件:中断、时间到、来自任务或中断的信号、来自任务或中断的消息、信号量。RTX-51TINY是RTX-51FULL的一个子集,可以很容易地运行

在80C51系统上,而不需要外部RAM。RTX-51TINY支持按时间片循环任务调度,支持任务间信号传递,最大16个任务,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处

理,不支持存储区的分配和释放,不支持占先式调度。RTX-51TINY是一个很小的内核,完全集成在KeilC51编译器中。更重要的是,它仅占用800B左右的程序存储空间,可以在没有外部数据存储器的80C51系统

中运行,但应用程序仍然可以访问外部存储器。9.1.1单任务程序与多任务程序的比较1.简单的单任务嵌入式程序和标准C程序都是从main()函数开始执行的,在嵌入式应用中,main()通常是一个无限循环,可以认为是一个持续执行的单个

任务,例如voidmain(void){while(1)/*永远重复*/{do_something();/*执行do_something“任务”*/}}在这个例子里,do_something函数可以认为是一个单任务,由于仅有一个任务在执行,所以没有必要进行多任务处理

或使用多任务操作系统。2.多任务循环main()函数通过在一个循环里调用多个服务函数(或任务)来实现伪多任务调度。例如voidmain(void){intcounter="0";while(1)/*一直重复执行*/{check_serial_io();/*检查串行输入*/proce

ss_serial_cmds();/*处理串行输入*/check_kbd_io();/*检查键盘输入*/process_kbd_cmds();/*处理键盘输入*/adjust_ctrlr_parms();/*调整控制器*/counter++;/*增加计数器*

/}}3.前后台系统main()函数仍然是在一个循环中调用相应的函数完成相应的操作,这部分可以看成是后台行为,前台程序则通过中断来处理紧急事件。bitint0_flag=0;//中断0发生标记,初始化为0voidmain(void){intc

ounter="0";TCON=0x55;/*电平触发外部中断*/IE=0x81;/*打开外中断int0*/while(1)/*后台运行的任务*/{check_serial_io();/*检查串行输入*/

process_serial_cmds();/*处理串行输入*/check_kbd_io();/*检查键盘输入*/process_kbd_cmds();/*处理键盘输入*/counter++;/*增加计数器*/if(int

0_flag){例如:do_int0_something();/*执行do_int0_something"任务"*/int0_flag=0;//清除int0_flag}}}voidexint0(void)interrupt0//处理紧急事件任务{int0_flag=1;/

*设置中断0标记*/;}在程序运行时,后台程序检查每个任务是否具备运行条件,通过一定的调度算法来完成相应的操作。对于实时性要求特别严格的操作通常由中断来完成,仅在中断服务程序中标记事件的发生,不再做任何工作就退出中断,经过后台程序的调度完成事件的处理,这样就不会造成在中断

服务程序中处理费时的事件而影响后续事件和其他中断。4.RTX-51实时多任务RTX-51TINY允许“准并行”同时执行几个任务。各个任务并非持续运行,CPU执行时间被划分为若干时间片(timeslice),每一个任务在预先定义好的时间片内得以执行。时间到使正在执行的任务挂起,并使另一个任务开始执行

。当使用RTX-51TINY时,为每个任务建立独立的任务函数。voidcheck_serial_io_task(void)_task_1{/*该任务检测串行I/0*/}voidprocess_serial_cmds_task(

void)_task_2{/*该任务处理串行命令*/}voidcheck_kbd_io_task(void)_task_3{/*该任务检测键盘I/O*/}voidprocess_kbd_cmds_task(void)_task_4{/*处理键盘命令*/}

voidstartup-_task(void)_task_0{os_create_task(1);/*建立串行I/O任务*/os_create_task(2);/*建立串行命令任务*/os_create_task(3);/*建立键盘I/O任务*/os_create_task(4);/*

建立键盘命令任务*/os_delete_task(0);/*删除启动任务*/}例如:9.1.2使用RTX-51TINY的软硬件要求1.编译环境操作系统RTX-51的软件环境要求:C51编译程序。BL51连接程序。A51宏汇编程序。库文件RTX-51TNY.LIB必须保存在DO

S环境变量C51LIB指定的程序库路径内,一般是目录C51\LIB。头文件RTX-51TNY.H必须保存在DOS环境变量C51INC指定的包含路径内,一般是目录C51\INC。RTX-51内核完全集成在KeilC51编译器中,在µVision2IDE完成安装之后,软件环境即满足上述要求。使用R

TX-51TINY系统时,需要了解其在编译环境、硬件系统方面的要求和技术参数。RTX-51TINY运行于大多数80C51兼容的器件及其变种上。RTX-51TINY应用程序可以访问外部数据存储器,但RTX-51TINY内核无此需求。2.硬件系统RTX-51TINY技术参数描述R

TX-51TINY任务数量16个RAM需求7字节DATA空间3倍于任务数量的IDATA空间代码要求900字节硬件要求定时器0系统时钟1000~65535个周期中断请求时间小于20个周期任务切换时间100~700个周期取决于堆栈的负载RTX-51TINY支持KeilC51编译器全部的存储模式。

存储模式的选择只影响应用程序对象的位置,RTX-51TINY系统变量和应用程序栈空间总是位于8051的内部存储区(DATA或IDATA区),一般情况下,应用程序应使用小(SMALL)模式。RTX-51TINY执行协作式任务切换(每个任务至少调用一个操作系统例程)和循环任务切换(每个任务在操

作系统切换到下一个任务前运行一个固定的时间段),不支持抢先式任务切换以及任务优先级。9.1.3使用RTX-51TINY的注意事项RTX-51TINY中的中断、再入函数、指针和寄存器的选择,与普通的单片机程序也有所区别,这些在使用时都要及时注意。1.中断RTX-51TINY与中断函数并行运作,中断

服务程序可以通过发送信号(用isr_send_signal函数)或设置任务的就序标志(用isr_set_ready函数)与RTX-51TINY的任务进行通信。如同在一个标准的、没有RTX-51TINY的应用中一样,中断例程必须在RTX-51TINY应用中实现并允许,RTX-51T

INY没有中断服务程序的管理。RTX-51TINY使用定时器0、定时器0中断和寄存器组1。如果在程序中使用了定时器0,则RTX-51TINY将不能正常运转。RTX-51TINY认为总中断总是允许(EA=1)。RTX-51TINY库例程在需要时改变中断系统(EA)的状态

,以确保RTX-51TINY的内部结构不被中断破坏。当允许或禁止总中断时,RTX-51TINY只是简单地改变EA的状态,不保存并重装EA,EA只是简单地被置位或清除。因此,如果程序在调用RTX-51例程前禁止了中断,RTX-51可能会失去响应

。在程序的临界区,可能需要在短时间内禁止中断。但是,在中断禁止后,不能调用任何RTX-51TINY的例程。如果程序确实需要禁止中断,应该持续很短的时间。1.中断2.再入函数C51编译器提供对再入函数的支持

,再入函数在再入堆栈中存储参数和局部变量,从而保护递归调用或并行调用。RTX-51TINY不支持对C51再入栈的任何管理。因此,如果在程序中使用再入函数,必须确保这此函数不调用任何RTX-51TINY系统函数,且不被循环任务切换所打断。仅用寄存器传递参数和保存自动变量的C函数具有内在的

再入性,这些函数可以被不同的RTX-51TINY任务无限制地调用。非可再入C51函数不能被超过一个以上的任务或中断过程调用。非再入C51函数在静态存储区段保存参数和自动变量(局部数据),该区域在函数被多个任务同时调用或递归调用时可能会被修改。如果确定多个任务不会

递归(或同时)调用,则多个任务可以调用非再入函数。通常,这意味着必须禁止循环任务调度,且该非再入函数不能调用任何RTX-51TINY系统函数。3.C51库例程可再入C51库函数可在任何任务中无限制地使用。对于非再入的C51库函数,用户要保证它们不能同时被几个任务所调用。4.多数据指针KeilC51

编译器允许使用多数据指针(存在于许多80C51的派生芯片中),但RTX-51TINY不提供对它们的支持。因此,在RTX-51TINY的应用程序中应小心使用多数据指针。5.运算单元KeilC51编译器允许使用运算单元(存在于许多8051的派生芯片中)。RTX-51TINY不提供对它们的支持。因此,在

RTX-51TINY的应用程序中须小心使用运算单元。6.寄存器组RTX-51TINY分配所有的任务到寄存器0,因此,所有的函数必须用C51的默认设置进行编译。中断函数可以使用剩余的寄存器组。然而,RTX

-51TINY需要寄存器组中的6个固定的字节,用于这些字节的寄存器组在配置文件Conf_tny.A51中由INT_REGBANK指定。9.2.1定时器滴答中断9.2RTX-51TINY的任务管理RTX-51TINY用标准80C51的定时器0(模式1)生产一个周期性的中断。该中断就是RTX-51T

INY的定时滴答(TimerTick)。库函数中的超时和时间间隔就是基于该定时滴答来测量的。默认情况下,RTX-51每10000个机器周期产生一个滴答中断,因此,对于运行于12MHz的标准8051来说,滴答的周期是0.01秒/10毫秒,也即频率是100Hz(12MHz/12/10

000)。该值可以在Conf_tny.A51配置文件中修改。可以在RTX-51的定时滴答中断(定时器0中断)里追加自己的代码。参见Conf_tny.A51配置文件。9.2.2任务RTX-51TINY本质上是一个任务切换器,建立一个RTX-51TINY程序,就是建立一个或多个任务函数的

应用程序。下面的信息可以帮助读者快速地理解RTX-51。任务函数用关键字_task_定义,该关键字是KeilC51所支持的。RTX-51TINY维护每个任务的正确状态(运行、就绪、等待、删除、超时)。某个时刻只有一个任务处于运行态。任务可能处于就绪态、等待态、删除态或

超时态。空闲任务(Idle_Task)总是处于就绪态,当定义的所有任务处于等待状态时,运行该任务。9.2.3任务状态RTX-51TINY的用户任务具有一下几个状态RUNNING运行READY就绪WAITING等待DELETED删除TI

ME-OUT超时各状态可以进行切换。9.2.4事件在实时操作系统中,事件可用于控制任务的执行,一个任务可能等待一个事件,也可能向其他任务发送任务标志。超时(timeout):挂起运行的任务指定数量的时钟周期。间隔(interval):类似于

超时,但是软件定时器没有复位,典型应用是产生时钟。信号(signal):用于任务内部同步协调。os_wait()函数挂起一个任务来等待一个事件的发生。这样可以同步2个或几个任务。它的工作过程如下:当任务等待的事件没有发生时,系统挂

起这个任务;当事件发生时,系统根据任务切换规则切换任务。9.2.5任务调度可利用的中央处理器时间被划分成时间片,由RTX-51TINY分配一个时间片给每个任务。每个任务允许执行一个预先确定的时间,然后,RTX-51TINY切换到另一个准备运行的任务并且允许这个任务执行片刻。一个

时间片的持续时间可以用配置变量TIMESHARING定义。即使是在等待一个任务的时间片到达时,也可以使用os_wait系统函数通知RTX-51让另一个任务开始执行。os_wait中止正在运行的当前任务,然后等待一个指定事件的发生,这时,任意数量的其他任务仍然可

以执行。RTX-51TINY将处理器分配到一个任务的过程称为调度程序。RTX-51TINY调度程序定义那些任务按照下面的规则运行。如果出现以下情况,当前运行任务中断:1.任务调用os_wait函数并且

指定事件没有发生。2.任务运行时间超过定义的时间片轮转超时时间。如果出现以下情况,则开始另一个任务:1.没有其他的任务运行。2.将要开始的任务处于READY或TIME-OUT状态。9.2.6任务切换—2种方式1.循环任务切换循环法允许并行地执行若干任务。intcounter0;

intcounter1;voidjob0(void)_task_0{os_create(1);/*标记任务1为就绪*/while(1){/*无限循环*/counter0++;/*更新记数器*/}}voidjob1(void)

_task_1{while(1){/*无限循环*/counter++;/*更新记数器*/}}例:2.协作任务切换可以用os_wait或os_switch_task让RTX-51TINY切换到另一个任务而不是等待任务的时间片用完。

#include<RTX-51tny.h>/*RTX-51tinyfunctions&defines*/intcounter0;/*任务0的计数器*/intcounter1;/*任务1的计数器*/job0()_task_0{os_cre

ate_task(1);/*启动任务1*/while(1){/*无穷循环*/counter0++;/*counter0加1*/os_wait(K_TMO,5,0);/*等待超时信号:5个滴答超时*/}}job1()_task_1{while(1){/*无穷循环*/counter1+

+;/*counter1加1*/os_wait(K_TMO,10,0);/*等待超时信号:10个滴答超时*/}}os_wait例1:#include<RTX-51tny.h>/*RTX-51tinyfunctions&defines*/intcounter

0;/*任务0的计数器*/intcounter1;/*任务1的计数器*/intcounter2;/*任务2的计数器*/intcounter3;/*任务3的计数器*/job0()_task_0{os_create_task(

1);/*启动任务1*/os_create_task(2);/*启动任务2*/os_create_task(3);/*启动任务3*/while(1){/*无穷循环*/counter0++;/*counter0加1*/os_wait(K_TMO,5,0);/*等待超时信号:5个

时钟报时*/}}job1()_task_1{while(1){/*无穷循环*/counter1++;/*counter1加1*/os_wait(K_TMO,10,0);/*等待超时信号:10个时钟报时*/}}os_wait

例2:job2()_task_2{while(1){/*无穷循环*/counter2++;/*counter2加1*/if((counter2&0xFFFF)==0){/*如果counter2=0*/os_send_signal

(3);/*发信号至任务3*/}}}job3()_task_3{while(1){/*无穷循环*/os_wait(K_SIG,0,0);/*等待信号*/counter3++;/*收到信号后,counter3加1*/}}os_wait例2续:3.空闲任务没有任务准备运

行时,RTX-51TINY执行一个空闲任务。空闲任务就是一个无限循环。例如SJMP$有些8051兼容的芯片提供一种降低功耗的空闲模式,该模式停止程序的执行,直到有中断产生。在该模式下,所有的外设包括中断系统仍在运行。RTX-51TINY允许在空闲任务中启动空闲

模式(在没有任务准备执行时)。当RTX-51TINY的定时滴答中断(或其他中断)产生时,微控制器恢复程序的执行。空闲任务执行的代码在Conf_tny.A51配置文件中允许和配置。9.3如何使用RTX-51TINY9.3.1编写程序使用RTX-51TINY要实现下面三步:(1)编写RTX-5

1程序(2)编译并连接程序(3)测试和调试程序1.包含文件RTX-51TINY仅需要包含一个文件RTX-51TNY.H,所有的库函数和常数都在该头文件中定义。在建立多任务模块的源文件中要包含:#include<RTX-51tny.h>2.编程原则(1)确保包含了RTX-51TNY

.H头文件。(2)不要建立main()函数,RTX-51TINY有自己的main()函数。它会自动地从任务0开始运行。如果用户程序中包含有main()函数,则需要利用os_create_task函数来启动RTX-51实时操作系统。(3)程序必须至少包含一个任务函数。(4

)中断必须有效(EA=1),在临界区,如果要禁止中断时一定要小心。(5)程序必须至少调用一个RTX-51TINY库函数(像os_wait)。否则,连接时将不包含RTX-51TINY库。(6)Task0是程序中首先要执行的函数,必须在任务0中调用os_create_task函数以启

动其他任务。(7)任务函数必须是从不退出或返回的。任务必须用一个while(1)或类似的结构重复。用os_delete_task函数停止运行的任务。(8)必须在µVision2中设置使用操作系统RTX-51TINY,或者在连接器命令行中指定。实时或多

任务应用是由一个或多个执行具体操作的任务组成的,RTX-51TINY支持最多16个任务。3.定义任务任务就是一个简单的C函数,返回类型为void,参数列表为void,并且用_task_声明函数属性。例:1:voidfunc(void)_tas

k_task_id例2:Voidjob0(void)_task_0{while(1){counter0++;}}9.3.2编译和连接用µVision2IDE建立工程,添加RTX-51TINY程序文件。(1)打开如图

所示的目标对话框选项(从project菜单中选择OptionsforTarget)。(2)选择Target标签。(3)从Operating选项列表中选择RTX-51TINY,使用操作系统。其他设置同非RTX-51TINY一致。9.3.3调试

µVision2模拟器允许运行和测试RTX-51TINY应用程序。RTX-51TINY程序的加载和非RTX-51TINY程序的加载是一样的。无须指定特别的命令和选项。启动调试后,一个核心的对话框显示RTX-51TINY核心和程序中任务的所

有特征。从Peripherals菜单中选择RTX-51TINYTasklist显示该对话框9.3.4实例——os_wait函数的使用例9.1如图9.4所示,假设在AT89C52的P1口接有8个LED,使用RT

X-51TINY,编写程序使8个LED以不同的频率闪烁。分析:需要建立9个任务,初始化任务和8个LED闪烁任务,在初始化任务中建立8个LED闪烁任务,之后删除自身。使用os_wait函数等待超时进行任

务切换,修改Conf_tny.A51中的TIMESHARING禁止循环人为切换9.4RTX-51TINY提供的系统函数1.isr_send_signal概要:#include<RTX-51tny.h>charisr_send_signal(unsignedchartask_id);/*信号发往的任

务*/描述:isr_send_signal函数给任务task_id发送一个信号。如果指定的任务正在等待一个信号,则该函数使该任务就绪,但不启动它,信号存储在任务的信号标志中。该函数仅被中断函数调用。返回值:成功调用后返回0,如果指定任务不存在,则返回-1。例:#include<RTX-51t

ny.h>voidtst_isr_send_signal(void)interrupt2{isr_send_signal(6);/*给任务6发信号*/}2.isr_set_ready概要:#include<RTX-51tny.h>char

isr_set_ready{unsignedchartask_id};/*使就绪的任务*/描述:将由task_id指定的任务置为就绪态。该函数仅被中断函数调用。返回值:无。例:#include<RTX-51tny.h

>voidtst_isr_set_ready(void)interrupt2{isr_set_ready(1);/*置位任务1的就绪标志*/}3.os_clear_signal概要:#include<RTX-51tny.h>cha

ros_clesr_signal(unsignedcahrtask_id);/*清除信号的任务*/描述:清除由task_id指定的任务信号标志。返回值:信号成功清除后返回0,指定的任务不存在时返回-1。参阅:isr_send_si

gnal,os_send_signal,os_wait例:#include<RTX-51tny.h>voidtst_os_clsar_siganl(void)_task_8{…os_clear_signal(5);/*清除任务5的信号标志*/…}4.os_create_task

概要:#include<RTX-51tny.h>charos_create_task(unsignedchartask_id);/*要启动的任务ID*/描述:启动任务task_id,该任务被标记为就绪,并在下一个时间点开始执行。返回值:任务成功启动后返回0,如果任务不能

启动或任务已在运行,或没有以task_id定义的任务,返回-1。参阅:os_delete_task例:#include<RTX-51tny.h>#include<stdio.h>/*用于printf*/voidnew_task(void)_

task_2/*创建任务2*/{…}voidtst_os_create_task(void)_task_0{…if(os_create_task(2))/*启动任务2*/{printf(“couldn’tstartt

ask2"n”);}…}5.os_delete_task概要:#include<RTX-51tny.h>charos_delete_task(unsignedchartask_id);/*要删除的任务*/描述:

函数将以task_id指定的任务停止,并从任务列表中将其删除。如果任务删除自己,将立即发生任务切换。返回值:任务成功停止并删除后返回0。指定任务不存在或未启动时返回-1。参阅:os_create_task例:#include<RTX-51tny.h>#include<stdio.h>void

tst_os_delete_task(void)_task_0{…if(os_delete_task(2)){printf(“couldn’tstoptask2"n”);}…}6.os_reset_in

terval概要:#include<RTX-51tny.h>voidos_reset_interval(unsignedcharticks);/*滴答数*/描述:用于纠正由于os_wait函数同时等待K_IVL和K_SIG事件而产生的时间问题,在这种情况下,如果一个信号事件(K

_SIG)引起os_wait退出,时间间隔定时器并不调整,这样,会导致后续的os_wait调用(等待一个时间间隔)延迟的不是预期的时间周期。允许你将时间间隔定时器复位,这样,后续对os_wait的调用就会按预期的操作进行。返回值:无。例:#include<RTX-51tny.h>vo

idtask_func(void)_task_4{…switch(os_wait2(KSIG|K_IVL,100)){caseTMO_EVENT:/*发生了超时,不需要os_waitreset_interval*/break;caseSIG_EVCENT:/*收到信号,需要os_

waitreset_interval*/os_reset_interval(100);/*依信号执行的其他操作*/break;}…}例:#include<RTX-51tny.h>voidtst_os_running_task(void)_task_3{uns

ignedchartid;tid=os_running_task_id();/*tid=3*/}概要:#include<RTX-51tny.h>charos_running_task_id(void);描述:函数确认当前正在执行的任务的任务ID。返回值:返回当前正在执

行的任务的任务号,该值为0~15之间的一个数。7.os_running_task_id8.os_send_signal概要:#include<RTX-51tny.h>charos_send_signal(chartask_id);/*信号发往的任务*/描述:

函数向任务task_id发送一个信号。如果指定的任务已经在等待一个信号,则该函数使任务准备执行但不启动它。信号存储在任务的信号标志中。返回值:成功调用后返回0,指定任务不存在时返回-1。参阅:isr_send_signal,os_clear_signal,os_wait例:#inclu

de<RTX-51tny.h>voidsignal_func(void)_task_2{…os_send_signal(8);/*向8号任务发信号*/…}voidtst_os_send_signal(void)_task_8{…os_send_sign

al(2);/*向2号任务发信号*/…}9.os_set_ready概要:#include<RTX-51tny.h>charos_set_ready(unsignedchartask_id);/*使就绪的

任务*/描述:将以task_id指定的任务置为就绪状态。返回值:无。例:#include<RTX-51tny.h>voidready_func(void)_task_2{…os_set_ready(1);/*

置位任务1的就绪标志*/…}10.os_switch_task概要:#include<RTX-51tny.h>charos_switch_task(void);描述:该函数允许一个任务停止执行,切换到另一个任务。如果调用os_switch_ta

sk的任务是唯一的就绪任务,它将立即恢复运行。返回值:无。例:#include<RTX-51tny.h>#include<stdio>voidlong_job(void)_task_1{floatf1,f2;f1=0.0;while(1){f2=log(f1);f1+=0.0001;

os_switch_task();/*运行其他任务*/}}11.os_wait概要:#include<RTX-51tny.h>charos_wait(unsignedcharevent_sel,/*要等待的事件*/unsignedcharticks,/*要

等待的滴答数*/unsignedintdummy);/*无用参数*/描述:该函数挂起当前任务,并等待一个或几个事件,如时间间隔、超时或从其他任务和中断发来的信号。参数event_set指定要等待的事件,可以是表中常数的一些组合。事件描述K_IVL等待滴答值为单位的时间

间隔K_SIG等待一个信号K_TMO等待一个以滴答值为单位的超时事件可以用竖线符(“|”)进行逻辑或。例如,K_TMO|K_SIG指定任务等待一个超时或者一个信号。ticks参数指定要等待的时间间隔事件(K_IVL)或超时事件(K_TMO)的定时器滴答数。参数dummy是为了提供与R

TX-51FULL的兼容性而设置的,在RTX-51TINY中并不使用。返回值:当有一个指定的事件发生时,任务进入就绪态。任务恢复执行时,由返回的常数指出使任务重新启动的事件。返回值描述RDY_EVENT任务的就绪标志位是被os_

set_ready或isr_set_ready置位的SIG_EVENT收到一个信号TMO_EVENT超时完成,或时间间隔到NOT_OKevent_sel参数的值无效可能的返回值见表:例:#include

<RTX-51tny.h>#include<stdio.h>voidtst_os_wait(void)_task_9{while(1){charevent;event=os_wait(K_SIG|K_TMO,50.0);switc

h(event){default:/*从不发生,该情况*/break;caseTMO_EVENT;/*超时*/break;/*50次滴答超时*/caseSIG_EVENT;/*收到信号*/break;}}}12.os_wait1概要:#include<RTX-51tn

y.h>charos_wait1(unsignedcharevent_sel);/*要等待的事件*/描述:该函数挂起当前的任务等待一个事件发生。os_wait1是os_wait的一个子集,它不支持os_wait提供的全部事件。参数

event_sel指定要等待的事件,该函数只能是K_SIG。返回值:当指定的事件发生,任务进入就绪态。任务恢复运行时,os_wait1返回的值表明启动任务的事件,返回值见表返回值描述RDY_EVENT任务的就绪标志位是被os_

set_ready或isr_set_ready置位的SIG_EVENT收到一个信号NOT_OKevent_sel参数的值无效13.os_wait2概要:#include<RTX-51tny.h>charos_wait2(unsignedcharevent_sel,/*要等待的事件*/uns

ignedcharticks);/*要等待的滴答数*/描述:函数挂起当前任务等待一个或几个事件发生,如时间间隔、超时或一个从其他任务或中断来的信号。参数event_sel指定的事件可以是表中常数的组合。事件描述K_IVL等待滴答值为单位的时间间隔K_SIG等待一个信号

K_TMO等待一个以滴答值为单位的超时事件可以用“|”进行逻辑或。如K_TMO|K_SIG表示任务等待一个超时或一个信号。参数ticks指定等待时间间隔(K_IVL)或超时(K_TMO)事件时的滴答数。返回值:当一个或几个事件产生时,任务进入就绪态。任务恢复执行时,os_wa

it2的返回值见表。返回值描述RDY_EVENT任务的就绪标志位是被os_set_ready或isr_set_ready置位的SIG_EVENT收到一个信号TMO_EVENT返回时完成,或时间间隔到达NOT_OKevent_s

el参数的值无效9.5RTX-51TINY的配置对RTX-51TINY进行配置可以通过修改在\c51\lib\子目录的RTX-51TINY配置文件conf_tny.a51来实现。在这个配置文件中,可以改变以下参数:(1)用于系统时钟

报时中断的寄存器组。(2)系统计时器的间隔时间。(3)指定在时钟报时中断中执行的代理。(4)时间片轮转超时值。(5)允许或禁止任务切换。(6)指定应用程序占用长时间的中断。(7)指定是否使用codebanking。(8)定义RTX-51TINY的顶栈。(9)指定最小的栈空间需

求。(10)指定栈错误发生时要执行的代码。(11)定义站错误发生时要执行的代码。(12)定义空闲任务操作。9.5.1配置9.5RTX-51TINY的配置通过改变Conf_tny.A51中的设置来定制RTX-51TINY的配置。需要注意的是,如果在工程中没有包含配置文件(Co

nf_tny.A51),库中的默认配置将自动加载,后续的改变将存储在库中,这样可能会对以后的应用起到不良影响。9.5RTX-51TINY的配置建立µVision2IDE应用工程时并不需要显式地包含一个RTX-51TINY库。当使用μVision集成环境或命令行连接

器时会自动执行。9.5.2库文件9.5RTX-51TINY的配置①尽可能不使用循环任务切换。②不要将时钟节拍中断速率设置得太高,③在os_wait()函数中有3个参数:K_TMO、K_IVL和K_SIG。其中对于K_TMO和

K_IVL的使用要加以区别。9.5.3优化9.6基于Proteus的RTX-51应用实例——交通信号灯控制器【例9.2】结合一个Proteus仿真电路的具体实例——交通信号灯控制器,阐述实时多任务操作

系统RTX-51的应用。9.6基于Proteus的RTX-51应用实例——交通信号灯控制器①在用户设定的工作时间段内,红绿灯正常运行;在红绿灯转换之前3秒起,绿灯方向绿灯灭,黄灯闪烁。②在工作时间段外,黄色信号灯闪烁。同时倒计时显示数码管熄灭显示。③无论是在工作时间段内还是在工作时间段外

,当按下禁止通行按钮后,两个方向均亮红灯,禁止车辆通行,倒计时显示数码管熄灭显示“99”;在松开禁止通行按钮后,红绿灯继续正常工作。交通信号灯控制器设计要求9.6基于Proteus的RTX-51应用实例——交通信号灯控制器④通过键盘可以修改

时钟数据,并可设置工作时间段的起始时间和结束时间。⑤按键查看日历时钟的时间和所设置的参数。⑥任何针对于交通信号灯控制器按键、查询和参数设置操作,都不能影响红绿灯和倒计时显示数码管的显示。交通信号灯控制器设计要求(续)这是一个典型的实时多任

务系统,采用普通的多任务循环或前后台系统很难实现,而采用RTX-51TINY实时操作系统则可以获得很好的控制效果。9.6基于Proteus的RTX-51应用实例——交通信号灯控制器总体方案9.6基于Proteus的RTX-51应用实例——交通信号灯控

制器仿真电路9.6基于Proteus的RTX-51应用实例——交通信号灯控制器1.CPU、日历时钟单元2.数码管显示及驱动3.键盘单元4.红绿灯显示单元5.电源电路9.6基于Proteus的RTX-51应用实例——交

通信号灯控制器数码管显示及驱动—电路图9.6基于Proteus的RTX-51应用实例——交通信号灯控制器任务设计—详见主教材303页(1)任务划分(2)任务优先级安排(3)任务之间的同步和互斥(4)任务之间的信号传递9.6基于Pro

teus的RTX-51应用实例——交通信号灯控制器软硬件实现本章小结RTX51TINY是一种应用于80C51系列单片机的小型多任务实时操作系统。它完全集成在KeilC5l编译器中,具有运行速度快、对硬件要求不高、使用方便灵活等优点。它可以

在单个CPU上管理几个作业(任务),同时可以在没有扩展外部存储器的单片机系统上运行。本章小结RTX51TINY的用户任务具有以下几个状态:①运行(RUNNING)②就绪(READY)③等待(WAITING)④删除(DELETED)⑤超时(TIMEOUT)本章小结任务切换是RTX51TINY提供的基

本服务。任务切换有两种情况:①循环任务切换②协作任务切换

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?