
rtx51小型实时操作系统的应用体会.docx
19页rtx51小型实时操作系统的应用体会2007年06月27日 星期三 23:53最近在做设计的时候老遇到一些几个任务需要同时进行的情况,刚开始想自己去做一个多任务的程序(因为称不上系统),想用一个脉冲计数的方法来实现多任务切换,但是感觉实现起来比较麻烦无意中发现了51单片机下个rtx51实时操作系统(本人以前不知道的),后来就去找相关资料发现这方面的资料在网上很少,也很杂乱经过一段时间的学习,我有了个大概的了解下面给大家讲述一下:RTX51是一个用于8051系列处理器多任务实时操作系统RTX51可以简化那些复杂而且时间要求严格的工程的软件设计工作有二个不同的RTX51版本可以利用:RTX51 Full 使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作在与中断功能相似的状态下 信号和信息可以通过邮箱系统在任务之间互相传递 你可以从一存池中分配和释放内存 你可以强迫一个任务等待中断 超时或者是从另一个任务或中断发出的信号或信息RTX51 Tiny 是一个 RTX51的子集 它可以很容易地在没有任何外部存储器的单片8051系统上运转 除了下列例外 RTX51 Tiny支持许多在RTX51中的特征。
RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换 不支持抢先式的任务切换不包括消息历程没有存储器池分配程序 RTX51使用一个8051硬件计时器中断作为定时程序 产生的周期性中断用于驱动 RTX51时钟 RTX51不需要在你的程序中拥有一个主函数 它将自动开始执行任务 0 如果你确实有一个主函数 你必须利用 RTX51 Tiny中的 os_create_task函数或 RTX51中的 os_start_system函数手工启动 RTX51 下列例子显示一个只使用时间片轮转任务调度的简单的 RTX51应用程序 在本程序里的二个任务是简单计数器回路 rtx51开始执行函数名为 job0的任务 0 这些功能添加了另一个叫做 job1任务 在 job0运行一会儿以后 RTX51切换到 job1 在 job0运行一会儿以后、RTX51转回到job0 这个过程将不确定地重复下去 #include
我介绍几个资料的下载地址,大家自己去看吧!【转】 KEIL RTX51 TINY内核的分析与应用2011年04月18日 星期一 19:28转载自 lan042最终编辑 lan042特性:最大任务数:16最大激活的任务数:16所需的CODE空间:最大900ByteDATA空间:7字节STACK空间:3字节XDATA空间:0字节时钟数:0个系统时钟分频:1000-----65535中断嵌套:小于20层任务切换时间:100-700时钟周期工具要求:以下软件应用需要用 RTX51 TinyC51纺编译器A51 Marco AssemblerBL51 Linker or Lx51 LinkerRTX51TNY.LIB 和 RTX51BT.LIB必需存储在库路径上,一般是文件夹\KEIL\C51\LIBRTX51TNY.H包含文件必须存储在包含文件路径上,一般是文件夹\KEIL\C51\INC目标要求:应用程序可能需要外部分的数据存储空间,但内核并不需要外部存储空间KEIL C51支持各种存储模式:选择存储模式只影响应用程序的存的数据存储,操作系统的变量和堆栈只存在于51的内存中,即DATA和IDATA,一般情况下,RTX51 Tiny的应用只需要小存储模式在RTX51 Tiny中每个应用程序运行的时间是固定的,支持cooperative任务切换和round-robin任务切换,不支持preemptive任务切换和任务优先级。
如果应用程序需要preemptive任务切换则必须使用RTX51 FULL-Time Executive版本中断:RTX51 Tiny的工作与中断函数是并行工作的中断服务程序可以向RTX51 Tiny的任务发信号(使用函数isr_send_signal),也可以置位作任务的Ready标志(使用函数isr_set _ready)在RTX51 Tiny中必须使能中断,但是在RTX51 Tiny没有中断服务管理RTX51 Tiny使用Timer0和Timer0中断全局中断禁能和Timer0中断禁能会使RTX51 Tiny停止工作,所以只能在短时间内禁能中断可重入函数非可重入的C函数不能被多个任务或中断过程调用非可重入的函数的参数和变量保存在静态存储空间中,当它们同时被多个任务调用时,这些参数和变量就可能被覆盖了你可以在多任务系统中调用非可重入函数如果你能保证他们不会同进行不过,这就意味着必须能 round-robin任务调度,并且非可重入函数不可以调用RTX51 Tiny的功能函数只使用寄存器就量和自动变量的函数自然地就是可重入函数,可以毫无限制地在RTX51 Tiny中调用C51编译器支可重入函数。
可重入函把参数和局部变量保存在堆栈中这样就可以保证他们被多个任务同时使用RTX51 Tiny并不管理可重入函数的堆栈,因些,如果你在应用程序中使用了可重入函数,你必须确保这些功能函数不调用任务RTX51 Tiny的系统函数,并且可重入函数不会被round-robin任务切换所中断注意:如果你打自在多个任务或中断中调用可重入或非可重入函数必须禁止round-robin任务切换运行时库:所有的C51可重入运行时库可能毫无限制地在所用任务中使用非可重入时库的要与可重入函数的要求相同多个数据指针C51编译器允许使用多个数据指针RTX51 Tiny对他们不进行管理,所以在应用中你必须小心Essentially,你必须确保在改变数据指针时不会发生round-robin切换注意:当你打算使用多数据指针时你最好禁止round-robin切换算术单元(说法与多个数据指针相同)工作寄存器组RTX51 Tiny的所有任务都使用工作组0 因些,所有的任务都必须使用C51默认的编译选项:REGISTERBANK (0)中断函数可能会使用其他的工作寄存器组然而RTX51 Tiny在工作寄存器组中永远需要6个字节RTX51 Tiny在工作寄存器组中使用的这些字节可以参考配置文件单个任务程序嵌入式和标准C程序都mian()函数开始。
在入式应用中, main函数一般都是一个死循环,我们也可以把它看作是一个连续执行的任务如:void main (void){while (1) /* repeat forever */{do_something (); /* execute the do_something 'task' */}}在这个例子中,do_something ()函数可以认为是一个单任务,既然只有一个任务在执行,就不需要具有多任务能力或多任务操作系统多任务程序许多成熟的C程序使用一种叫做pseudo多任务的策略,把多个作协做为一循环,如:void main (void){int counter = 0;while (1) /* repeat forever */{check_serial_io (); /* check for serial input */process_serial_cmds (); /* process serial input */check_kbd_io (); /* check for keyboard input */process_kbd_cmds (); /* process keyboard input */adjust_ctrlr_parms (); /* adjust the controller */counter++; /* increment counter */}}在这个例子中,每个函数完成一个独立的操作或任务。
这些函数是一个一个顺序执行的当添加更多的任务时调度就行了一个问题比方说,如果函数process_kbd_cmds执行的时间比较长,主循环就需要很长时间才能再执行到函数check_serial_io ,这时候串口的数据可能会丢失当然check_serial_io 可以在主循环中多调用几次来解决这个问题,但最终这种方法并不是最有效的RTX51 Tiny的程序当使用RTX51 Tiny时,你可以为每一个任务生成一个独立的函数,如:void check_serial_io_task (void) _task_ 1{/* This task checks for serial I/O */}void process_serial_cmds_task (void) _task_ 2{/* This task processes serial commands */}void check_kbd_io_task (void) _task_ 3{/* This task checks for keyboard I/O */}void process_kbd_cmds_task (void) _task_ 4{/* This task processes keyboard commands */}void startup_task (void) _task_ 0{os_create_task (1); /* Create serial_io Task */os_create_task (2); /* Create serial_cmds Task */os_create_task (3); /* Create kbd_io Task */os_create_task (4); /* Create kbd_cmds Task */os_delete_task (0); /* Delete the Startup Task */}在这个例子中,每个函数定义了一个RTX51 Tiny的任务。
RTX51 Tiny程序没有主C函数,RTX51 Tiny首先执行任务0作为一个典型的应用,任务0只是简单地用来生成其他的所有任务工作原理RTX51 Tiny使用并管理你的目标资源,这一部分讲述RTX51 Tiny如何使用这些资源RTX51 Tiny的许多方面都可以根据工程需要进行配置时间片中断RTX51 Tiny使用标准的8051的定时器0来产生定时中断这个中断就是RTX51 Tiny的时钟片RTX51 Tiny运行时库中用的时等待时间都是以这个时间片为单位的RTX51 Tiny的默认的时间片是10000个机器周期因此,标准的8051运行在12MHz的时钟下的时候,时。
