RTX51 Tiny用户指南包含如何使用Keil RTX51 Tiny Real-Time Kernel的信息。
这个手册包含以下章节。
- 综述 提供一个RTX51 Tiny Kernel的简短介绍。
- Real-Time程序 讨论实时程序面临的问题,以及如何使用RTX51 Tiny来解决这些问题。
- 操作原理 描述如何操作RTX51 Tiny,以及切换任务。
- 配置RTX51 Tiny 描述如何为应用配置内核。
- 使用RTX51 Tiny 关注RTX51内核的用法,包括创建和编译任务的细节。
- 库参考 列出所有对RTX51 Tiny库有效的库程序。
版本历史
- 2004年1月:CHM格式初版
RTX51 Tiny是一个实时操作系统(RTOS),可以用来创建同时执行多个函数或任务的应用程序。通常在嵌入式应用中需要用到。事实上不使用RTOS来创建实时程序(在一个循环中执行一个或多个函数或任务),像RTX51 Tiny这样的RTOS可以处理许多时序安排、保持以及时间问题。
实时操作(RTOS)可以柔性调度系统资源,如CPU与内存,以及提供任务间通信。RTX51 Tiny是一个强大的RTOS,可以轻松的在8051衍生设备中使用和工作。
RTX51 Tiny程序是使用标准C设计的,使用Keil C51 C编译器编译,添加到C语言中,可以轻松的声明任务函数,而不需要使用复杂的堆栈和变量结构配置。RTX51 Tiny程序仅需要将一个特殊的头文件包含在程序中并将RTX51 Tiny库连接到程序中。
RTX51 Tiny版本2包含很多新的特性可以使实时软件开发更容易。例如:
- 支持代码分页
RTX51 Tiny目前支持代码分页。这个选项必须在CONF_TNY.A51配置文件中进行使能。其它的代码分页应用中必须在L51_BANK.A51文件中定义代码分页硬件配置。
- 直接转换任务
一个新的函数(os_switch_task)允许一个任务直接执行任务转换切换到其它READY状态的任务。
- 任务Ready标志
新的RTX51 Tiny库程序isr_set_ready和os_set_ready,允许为一个任务设置READY标志。READY标志可以用于将一个任务置于等待时间间隔、超时或信号(signal)(参考os_wait)READY的状态。任务在下一次时机中恢复。
- 支持CPU空闲模式
RTX51 Tiny目前允许Idle Task在中进入空间模式(很多设备可以)。
- 在定时器中断中支持用户代码
目前可以在RTX51 Tiny定时器中断中添加用户的代码。可以使用与RTX51 Tiny相同的固定时钟频率作为自己程序的时钟。这个选项必须在CONF_TNY.A51 配置文件中使能。
- 支持间隔调整
os_reset_interval函数在混合间隔和信号调用os_wait程序的时候,允许调整间隔的超时值。
此外,RTX51 Tiny已经完全重组结构来增加它的灵活性,提供性能以及减少代码和数据空间的需求。RTX51 Tiny版本2在遇到以下条件的时候是可伸缩的,并且显示代码尺寸显著减小。
- Round-Robin任务切换被禁止
- 使用很少的RTX51 Tiny系统函数
- 禁用堆栈检查
禁用Round-Robin任务切换也可以减少数据空间的需求。
以下列出RTX51 Tiny版本1.06已知的问题。这些问题在RTX51 Tiny版本2中已被修正。
- 在RTX51 Tiny V1.06中,在os_wait时出现中断,isr_send_signal函数或破坏READY状态。这会导致任务死机,从中断等待信号。这个问题在RTX51 Tiny版本2中已修复。
- 在RTX51 Tiny V1.06中,K_IVL和K_SIG事件不能合并成一个来调用os_wait程序,因为在信号发生时不能调整interval时间值。RTX51 Tiny版本2提供os_reset_interval程序,允许适当的调整interval时间值。
- 在RTX51 Tiny V1.06中,Round-Robin的TIMESHARING EQUate不能置为1。如果是,如果中断在Round-Robin在时间设置前出现,Round-Robin周期将会被破坏,要延时256个时钟为不是1。这个问题在RTX51 Tiny版本2中已被修复。
- 在RTX51 Tiny V1.06中,当用户中断执行时长超出RTX51 Tiny系统时钟定时器周期,RTX51 Tiny系统时钟定时器被递归调用。重写SAVEPSW和SAVEACC的值通常会导致系统崩溃。这个问题在RTX51 Tiny版本2中已经修复。如果应用程序包含的中断函数执行时间比RTX51 Tiny系统时钟定时器间隔长,LONG_USR_INTR配置选项可以设置为1。如果应用程序中需要消耗大量时间执行高优先级的中断程序则可能需要这个选项。
参数 | 限制 |
定义任务最大数量 | 16 |
激活任务的最大数量 | 16 |
需要的CODE 空间 | 最大900 Bytes |
需要的DATA 空间 | 7 Bytes |
需要的STACK 空间 | 3 Bytes/Task |
需要的XDATA 空间 | 0 Bytes |
定时器(Timer) | 0 |
系统时钟因子(System Clock Divisor) | 1,000-65,535 |
中断等待时间(Interrupt Latency) | 20 Cycles or Less |
环境切换时间(Context Switch Time) | 100-700 Cycles |
以下软件应用程序是RTX51 Tiny需要的:
- C51编译器
- A51宏汇编器
- BL51连接器或LX51连接器
RTX51TNY.LIB和RTX51BT.LIB库文件必须存储在哭路径下。通常是\KEIL\C51\LIB文件夹。
RTX51TNY.H头文件必须存储在包含路径中。通常是\KEIL\C51\INC文件夹。
RTX51 Tiny运行在多数8051兼容设备,包括单片的变种。RTX51 Tiny应用可以使用外部数据存储器,但是内核不需要。
RTX51 Tiny可以工作在所有Keil C51 编译器支持的内存模式。选择的内存模式仅影响应用程序目标的位置。RTX51 Tiny系统变量和应用的堆栈区域总是存储在8051内部存储器(DATA或IDATA)。典型的,RTX51 Tiny应用按SMALL模式执行。
RTX51 Tiny执行协作(cooperative)任务切换(每个任务调用一个操作系统程序)和循环(round-robin)任务切换(在操作系统切换到下一个任务之前,每个任务运行的时间是固定的)。抢占式任务切换和任务优先级是不支持的。如果应用需要抢占式任务切换,必须使用RTX51 Full Real-Time Executive。
RTX51 Tiny与中断函数并行执行。中断服务程序可以通过发送一个信号(使用isr_send_signal函数)或设置任务的Ready标志(使用isr_set_ready函数)与RTX51 Tiny任务通信。
中断程序必须被执行,并且要像标准程序、non-RTX51 Tiny应用一样在RTX51 Tiny应用中使能。在RTX51 Tiny中没有中断程序管理。
RTX51 Tiny使用定时器0,定时器0中断,和寄存器bank 1。如果程序使用定时器0,RTX51 Tiny内核将不能正常工作。可以在RTX51 Tiny定时器0 ISR的尾部添加自己的定时器0 ISR。更多信息请参考“硬件定时器”。
RTX51 Tiny假设总中断(EA=1)是使能的。RTX51 Tiny库程序更改中断系统(EA位)的状态,需要确保RTX51 Tiny的内部结构没有被中断破坏。当使能和禁用总中断时,RTX51 Tiny只是简单的更改EA的状态。不会保存和恢复EA。EA只是简单地设置或清除。因此,如果程序禁用了之前调用RTX51程序的中断,RTX51将不会应答。
对于程序的关键部分可能需要短暂的禁止中断。但是,不可以使用被禁止的中断调用任何RTX51 Tiny程序。如果程序会禁止中断,也应该是短暂的。
C51编译器提供对可重入函数的支持。可重入函数将参数和局部变量存储在可重入堆栈中。在递归或重复调用的时候保护它们。RTX51 Tiny不包含C51可重入堆栈的管理。因此,如果在应用程序中使用可重入函数,必须确保这些函数不会调用RTX51 Tiny的系统函数,并且可重入函数不会被round-robin任务切换中断。
那些参数和自动变量仅使用寄存器的C函数,本身就是可重入的,并且可以被不受限制的从RTX51 Tiny调用。
不可重入C函数不可以从多个任务或中断程序中调用。非可重入C51函数将其参数和自动变量(局部变量)存储在静态存储区,当函数被多个任务同时调用或递归调用时会被重写。
如果可以确定不会递归调用(同时地),可以从多个任务调用非可重入函数。通常这意味着round-robin任务调度必须被禁用。并且非可重入函数不能电影任何RTX51 Tiny系统函数。
注意:
- 如果想要从多个任务或中断中调用可重入函数或非可重入函数,应该禁用round-robin任务切换。
C库程序
可重入的C51库程序可以不受限制的在任何任务中使用。对于非可重入的C51程序,同样的限制适用于不可重入的C函数。
Keil C51编译器允许使用多数据指针(对很多8051派生设备有效)。但是,RTX51 Tiny不提供对他们的管理。因此,如果在RTX51 Tiny应用程序使用多数据指针,必须要谨慎。
本质上,必须保证在执行更改数据指针选择器的代码时,round-robin任务切换不会发生。
注意:
- 如果想使用多数据指针,应该禁用Round-Robin任务切换。
Keil C51编译器允许使用各种8051设备的算术单元。但是,RTX51 Tiny不提供对他们的管理。因此,如果在RTX51 Tiny应用程序中使用算术单元,必须谨慎。
本质上,必须保证在执行使用算术单元的程序时,round-robin任务切换不会发生。
注意:
- 如果想使用算术单元,应该禁用Round-Robin任务切换。
RTX51 Tiny将所有任务分配在寄存器bank0。出于这个原因,所有的任务函数必须使用默认的C51设置编译,REGISTERBANK (0)。
中断函数可以使用其它的寄存器bank。但是,RTX51 Tiny需要寄存器区的6个永久bytes。被RTX51 Tiny使用的6个byte所在的寄存器bank,可以在配置文件中指定。