单片机原理与嵌入式系统设计——原理、应用、Protues仿真、实验设计第9章1.ppt
上传人:sy****28 上传时间:2024-09-15 格式:PPT 页数:71 大小:1.6MB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

单片机原理与嵌入式系统设计——原理、应用、Protues仿真、实验设计第9章1.ppt

单片机原理与嵌入式系统设计——原理、应用、Protues仿真、实验设计第9章1.ppt

预览

免费试读已结束,剩余 61 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第9章多任务实时操作系统RTX-519.1RTX-51实时多任务操作系统简介9.2RTX-51TINY的任务管理9.3如何使用RTX-519.4RTX-51TINY提供的系统函数9.5RTX-51TINY的配置9.6基于Proteus的RTX-51应用实例本章小结RTX-51实时多任务操作系统简介RTX-51TINY是RTX-51FULL的一个子集,可以很容易地运行在80C51系统上,而不需要外部RAM。RTX-51TINY支持按时间片循环任务调度,支持任务间信号传递,最大16个任务,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处理,不支持存储区的分配和释放,不支持占先式调度。RTX-51TINY是一个很小的内核,完全集成在KeilC51编译器中。更重要的是,它仅占用800B左右的程序存储空间,可以在没有外部数据存储器的80C51系统中运行,但应用程序仍然可以访问外部存储器。9.1.1单任务程序与多任务程序的比较2.多任务循环3.前后台系统do_int0_something();/*执行do_int0_something"任务"*/int0_flag=0;//清除int0_flag}}}voidexint0(void)interrupt0//处理紧急事件任务{int0_flag=1;/*设置中断0标记*/;}4.RTX-51实时多任务9.1.2使用RTX-51TINY的软硬件要求RTX-51TINY运行于大多数80C51兼容的器件及其变种上。RTX-51TINY应用程序可以访问外部数据存储器,但RTX-51TINY内核无此需求。RTX-51TINY支持KeilC51编译器全部的存储模式。存储模式的选择只影响应用程序对象的位置,RTX-51TINY系统变量和应用程序栈空间总是位于8051的内部存储区(DATA或IDATA区),一般情况下,应用程序应使用小(SMALL)模式。RTX-51TINY执行协作式任务切换(每个任务至少调用一个操作系统例程)和循环任务切换(每个任务在操作系统切换到下一个任务前运行一个固定的时间段),不支持抢先式任务切换以及任务优先级。9.1.3使用RTX-51TINY的注意事项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的例程。如果程序确实需要禁止中断,应该持续很短的时间。2.再入函数3.C51库例程9.2.1定时器滴答中断9.2.2任务9.2.3任务状态9.2.4事件9.2.5任务调度如果出现以下情况,当前运行任务中断:1.任务调用os_wait函数并且指定事件没有发生。2.任务运行时间超过定义的时间片轮转超时时间。如果出现以下情况,则开始另一个任务:1.没有其他的任务运行。2.将要开始的任务处于READY或TIME-OUT状态。9.2.6任务切换—2种方式2.协作任务切换#include<RTX-51tny.h>/*RTX-51tinyfunctions&defines*/intcounter0;/*任务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个时钟报时*/}}job2()_task_2{while(1){/*无穷循环*/