8051 系列 MCU 的微型操作系统1 RTX51 Tiny 介绍 Vision 是德国 Keil 公司开发的单片机IDE 软件, 最初主要用于 8051 系列单片机,RTX51 是其自带的运行于8051 系列单片机上的小型多任务实时操作系统,可用来设计具有实时性要求的多任务软件RTx51 有 2个版本: RTX51 Tiny 和 RTX51 FullRTX51 Tiny 是 RTX51 Full 的子集RTX51 Tiny自身仅占用 900 字节左右的程序存储空间,可以很容易地运行在没有外部扩展存储器的8051 单片机系统上它完全集成在Keil C5l 编译器中,具有运行速度快、对硬件要求不高、使用方便灵活等优点,因此越来越广泛地应用到单片机的软件开发中它可以在单个CPU上管理几个作业(任务) ,同时可以在没有扩展外部存储器的单片机系统上运行目前在 8051 系列单片机上使用多任务实时操作系统, RTX51 Tiny 也就成为了首选/ RTX51 TINY 允许同时 “ 准并行 ” 地执行多个任务 :各个任务并非持续运行,而是在预先设定的时间片 (time slice) 内执行 CPU执行时间被划分为若干时间片,RTX51 TINY 为每个任务分配一个时间片,在一个时间片内允许执行某个任务,然后RTX51 TINY 切换到另一个就绪的任务并允许它在其规定的时间片内执行。
由于各个时间片非常短,通常只有几ms,因此各个任务看起来似乎就是被同时执行了RTX51 TINY 利用单片机内部定时器0 的中断功能实现定时, 用周期性定时中断驱动RTX51 TINY的时钟它最多可以定义16 个任务,所有的任务可以同时被激活,允许循环任务切换,仅支持非抢占式的任务切换, 操作系统为每一个任务分配一个独立的堆栈区,在任务切换的同时改变堆栈的指针,并保存和恢复寄存器的值 RTX51 TINY 没有专门的时间服务函数和任务挂起函数,而是通过 os_wait()中的参数设定实现的使用RTX51 TINY 时用户程序中不需要包含main() 函数,它会自动地从任务0开始运行如果用户程序中包含有main() 函数,则需要利用os_create_task 函数来启动RTX51 实时操作系统特性:最大任务数: 16 最大激活的任务数:16 所需的 CODE 空间:最大900Byte DATA 空间: 7 字节STACK 空间: 3 字节XDATA 空间: 0 字节时钟数: 0 个系统时钟分频:1000-65535 中断嵌套:小于20 层任务切换时间:100-700 时钟周期应用:C51 纺编译器A51 Marco Assembler BL51 Linker or Lx51 Linker RTX51TNY .LIB 和 RTX51BT.LIB 必需存储在库路径上,一般是文件夹KEILC51LIB RTX51TNY .H 包含文件必须存储在包含文件路径上,一般是文件夹KEILC51INC 应用程序可能需要外部分的数据存储空间,但内核并不需要外部存储空间KEIL C51 支持各种存储模式:选择存储模式只影响应用程序的存的数据存储,操作系统的变量和堆栈只存在于51 的内存中, 即 DATA 和 IDATA,一般情况下, RTX51 Tiny 的应用只需要小存储模式。
在RTX51 Tiny 中每个应用程序运行的时间是固定的,支持 cooperative 任务切换和round-robin 任务切换 ,不支持 preemptive(抢先、抢占)任务切换和任务优先级名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - 8051 系列 MCU 的微型操作系统2 如果应用程序需要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 () 函数可以认为是一个单任务,既然只有一个任务在执行,就不需要具有多任务能力或多任务操作系统名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - 8051 系列 MCU 的微型操作系统3 多任务程序许多成熟的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 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - 8051 系列 MCU 的微型操作系统4 在这个例子中, 每个函数定义了一个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 的时钟下的时候,时间片有0.01S 或着说是100Hz这个值可以在CONF_TNY .A51 配置文件中更改注意:你在以RTX51 Tiny 时间片中断中编辑你自己的代码,参考:CONF_TNY .A51 任务:RTX51 Tiny 可以看作是一个任务切换器要生成 RTX51 Tiny 程序,你必须生成一个具有一个或多个任务的应用以下细节可以帮你更快地理解RTX。