logo资料库

RTX51(中文版).pdf

第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
资料共33页,剩余部分请下载后查看
综述
新的特性
问题解决
产品规格
工具要求
目标需求
中断
可重入函数
C库程序
多数据指针
算术单元
寄存器Bank
实时程序
单任务程序
多任务程序
RTX51 Tiny程序
操作原理
定时器滴答(Timer Tick)中断
任务
任务管理
事件
任务调度
Round-Robin任务切换
Cooperative任务切换
Idle任务
堆栈管理
配置RTX51 Tiny
配置
硬件定时器
Round-Robin(循环)
长中断
Code banking(代码空间)
堆栈
Idle任务
库文件
优化
使用RTX51 Tiny
书写程序
包含文件
编程指导
定义任务
编译与连接
命令行工具
µVision IDE
调试
示例
RTX1_EX1示例
RTX_EX2示例
Traffic示例
函数参考
isr_send_signal
isr_set_ready
os_clear_signal
os_create_task
os_delete_task
os_reset_interval
os_running_task_id
os_send_signal
os_set_ready
os_switch_task
os_wait
os_wait1
os_wait2
目录 综述 ...................................................................... 2 堆栈 .......................................................... 14 新的特性 ........................................................ 2 Idle 任务 ............................................... 14 问题解决 ........................................................ 3 库文件 .......................................................... 15 产品规格 ........................................................ 3 优化 .............................................................. 15 工具要求 ........................................................ 4 使用 RTX51 Tiny ........................................... 15 目标需求 ........................................................ 4 书写程序 ..................................................... 15 中断 ............................................................. 4 包含文件 ................................................. 16 可重入函数 ............................................... 5 编程指导 ................................................. 16 C 库程序 ..................................................... 5 定义任务 ................................................. 16 多数据指针 ............................................... 5 编译与连接 ................................................. 17 算术单元.................................................... 5 命令行工具 ............................................ 17 寄存器 Bank .............................................. 5 µVision IDE .......................................... 17 实时程序 ............................................................. 6 调试 .............................................................. 18 单任务程序.................................................... 6 示例 ................................................................... 19 多任务程序.................................................... 6 RTX1_EX1 示例 ........................................... 19 RTX51 Tiny 程序 ......................................... 7 RTX_EX2 示例 ............................................. 20 操作原理 ............................................................. 8 Traffic 示例 ............................................. 20 定时器滴答(Timer Tick)中断 .......... 8 函数参考 .......................................................... 21 任务 ................................................................. 9 isr_send_signal ..................................... 21 任务管理 ........................................................ 9 isr_set_ready .......................................... 22 事件 ................................................................. 9 os_clear_signal ..................................... 23 任务调度 ..................................................... 10 os_create_task ....................................... 23 Round-Robin 任务切换 ........................... 10 os_delete_task ....................................... 24 Cooperative 任务切换 ........................... 11 os_reset_interval ................................. 25 Idle 任务 .................................................... 12 os_running_task_id .............................. 26 堆栈管理 ..................................................... 12 os_send_signal ....................................... 27 配置 RTX51 Tiny ........................................... 12 os_set_ready ............................................ 28 配置 .............................................................. 12 os_switch_task ....................................... 29 硬件定时器 ............................................ 13 os_wait ....................................................... 30 Round-Robin(循环) ....................... 13 os_wait1 ..................................................... 31 长中断 ..................................................... 13 os_wait2 ..................................................... 32 Code banking(代码空间) ............ 14
RTX51 Tiny 用户指南 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 在遇到以下条件的时候是可伸缩的,并且显示代码尺寸显著 减小。 1. Round-Robin 任务切换被禁止 2. 使用很少的 RTX51 Tiny 系统函数 3. 禁用堆栈检查 禁用 Round-Robin 任务切换也可以减少数据空间的需求。 问题解决 以下列出 RTX51 Tiny 版本 1.06 已知的问题。这些问题在 RTX51 Tiny 版本 2 中已被修正。 1. 在 RTX51 Tiny V1.06 中,在 os_wait 时出现中断,isr_send_signal 函数或破坏 READY 状态。这会导致任务死机,从中断等待信号。这个问题在 RTX51 Tiny 版本 2 中已修复。 2. 在 RTX51 Tiny V1.06 中,K_IVL 和 K_SIG 事件不能合并成一个来调用 os_wait 程 序,因为在信号发生时不能调整 interval 时间值。RTX51 Tiny 版本 2 提供 os_reset_interval 程序,允许适当的调整 interval 时间值。 3. 在 RTX51 Tiny V1.06 中,Round-Robin 的 TIMESHARING EQUate 不能置为 1。如果 是,如果中断在 Round-Robin 在时间设置前出现,Round-Robin 周期将会被破坏, 要延时 256 个时钟为不是 1。这个问题在 RTX51 Tiny 版本 2 中已被修复。 4. 在 RTX51 Tiny V1.06 中,当用户中断执行时长超出 RTX51 Tiny 系统时钟定时器 周期,RTX51 Tiny 系统时钟定时器被递归调用。重写 SAVEPSW 和 SAVEACC 的值通 常会导致系统崩溃。这个问题在 RTX51 Tiny 版本 2 中已经修复。如果应用程序包 含的中断函数执行时间比 RTX51 Tiny 系统时钟定时器间隔长,LONG_USR_INTR 配 置选项可以设置为 1。如果应用程序中需要消耗大量时间执行高优先级的中断程序 则可能需要这个选项。 产品规格 参数 定义任务最大数量 激活任务的最大数量 需要的 CODE 空间 需要的 DATA 空间 限制 16 16 最大 900 Bytes 7 Bytes
需要的 STACK 空间 需要的 XDATA 空间 定时器(Timer) 3 Bytes/Task 0 Bytes 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 任务切换。 寄存器 Bank RTX51 Tiny 将所有任务分配在寄存器 bank0。出于这个原因,所有的任务函数必须使用默认 的 C51 设置编译,REGISTERBANK (0)。 中断函数可以使用其它的寄存器 bank。但是,RTX51 Tiny 需要寄存器区的 6 个永久 bytes。 被 RTX51 Tiny 使用的 6 个 byte 所在的寄存器 bank,可以在配置文件中指定。
实时程序 实时程序必须快速响应实时发生的事件。没有实时操作系统(RTOS),很少有事件可以轻松 创建。随着更多事件被添加,复杂性和程序复杂程度增加,就凸显了 RTOS 的好处。 单任务程序 嵌入式和标准 C 程序都是从 main C 函数开始执行。在嵌入式应用中,main 通常按死循环执 行,可以看做是一个连续执行的单任务。例如: void main (void) { while (1) /* repeat forever */ { do_something (); /* execute the do_something 'task' */ } } 在这个示例中,do_something 函数可以看做是一个单任务。此处只有一个任务执行,不需 要多任务性能或多任务此处系统。 多任务程序 很多复杂的 C 程序可以执行一个伪多任务,多个函数(或任务)在一个循环中执行。例如: 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 函数执行 很长时间,main 循环需要很长时间才能返回到 check_serial_io 函数,串口数据将会丢失。 当然,check_serial_io 函数可以在 main 循环中多次调用来解决这个问题,但是最终这种 方式是行不通的。 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 程序没有 main C 函数。 而是从 task 0 开始执行。典型应用中,task 0 轻松的创建其它的任务。 操作原理 RTX51 Tiny 使用和管理目标系统的资源。RTX51 Tiny 的很多方面可以通过 project basis 在 project 中配置。  定时器滴答(Timer Tick)中断 主要论述驱动 RTOS 的周期性时钟中断。  任务 论述 RTX51 Tiny 任务的概念。  任务管理 论述 RTX51 Tiny 如何管理任务及各种任务的状态。  事件 论述如何用事件触发任务。  任务调度程序 提供调度管理任务的详细信息。  Round-Robin(循环)任务切换 描述如何使用 round-robin 任务切换。  Cooperative(联合)任务切换 描述如何使用 cooperative 任务切换。  Idle(空闲)任务 描述 RTX51 Tiny 的 idle 任务  堆栈管理 提供 RTX51 Tiny 管理 8051 硬件堆栈的详细信息。 定时器滴答(Timer Tick)中断 RTX51 Tiny 使用标准 8051 定时器 0(模式 1)创建周期中断。这个中断是 RTX51 Tiny 的定 时器滴答。为 RTX51 Tiny 库程序指定的超时和区间值需要使用 RTX51 Tiny 时钟滴答测试。 默认的,RTX51 定时器滴答中断每 10000 个机器周期出现一次。因此,对于运行在 12MHz 的 标准的 8051,定时器滴答周期中是 0.01 秒或 100Hz 的频率(12MHz/12/10000)。只可以在 CONF_TNY.A51 配置文件中修改。 注意:  可以在 RTX51 Tiny 滴答中断中添加自己的代码。更多信息请参考“CONF_TNY.A51 配置文件”。  RTX51 Tiny 如何使用中断系统的详细信息请参考“综述”中的“中断”章节。
分享到:
收藏