好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

RTX51小型实时操作系统介绍.doc

7页
  • 卖家[上传人]:飞***
  • 文档编号:4913778
  • 上传时间:2017-08-27
  • 文档格式:DOC
  • 文档大小:58.50KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • RTX51 小型实时操作系统介绍(连载 1)有二个不同的 RTX51 版本可以使用∶RTX51 Full 使用多于四个任务优先权同时完成存在时间片轮转调度和抢先式的任务切换 RTX51 工作在与中断功能类似的状态下 信号和消息可以通过邮箱系统在任务之间互相传递 你可以从一个可分配存储区中分配和释放内存 你可以强迫一个任务等待中断、超时或者是从另一个任务或中断发出的信号或消息RTX51 Tiny 是 RTX51 的一个子集,它可以很容易地在没有任何外部存储器的单片 8051 系统上运行 除了下列例外,RTX51 Tiny 支持许多 RTX51 中的特性RTX51 Tiny 仅支持时间片轮转任务切换和使用信号进行任务切换不支持抢先式的任务切换不包括消息历程 没有可分配存储区分配程序许多微处理器应用程序要求同时执行两个工作或任务 对于这样的应用程序,一个实时操作系统(RTOS)允许灵活的分配系统资源(中央处理器、存储器、等等.)给各个任务 RTX51 是一个很容易使用的功能强大的实时操作系统 RTX51 可以运行于所有的 8051 派生机型你可以使用标准 C 语言编写和编译一个程序并使用 C51 构造、编译他们, 仅在指定任务标识符和优先权上有一点差别。

      RTX51 程序也要求你在程序中用include 命令引入实时管理的头文件并使用 BL51 linker/locator 进行连接和选择适当的 RTX51 库文件RTX51 小型实时操作系统介绍(连载 2)单任务程序一个标准的 C 语言程序从主函数开始执行 在一个嵌入式应用中,主函数通常是一段无限循环的代码,可以认为是一个连续执行的单独任务 例如∶int counter;void main (void) {counter = 0;while (1) { /* 始终重复 */counter++; /* 计数器加 1 */}}时间片轮转程序一种更高级的 C 语言程序可以在不使用实时操作系统的情况下实现时间片轮转拟多任务系统 在这种系统中、任务或功能被一段无限循环程序重复调用例如∶int counter;void main (void) {counter = 0;while (1) { /* 始终重复 */check_serial_io ();process_serial_cmds (); /* 处理串行输入 */check_kbd_io ();process_kbd_cmds (); /* 处理键盘输入 */adjust_ctrlr_parms (); /* adjust the controller */counter++; /* increment counter */}}用 RTX51 进行时间片轮转调度rtx51 也能完成多重任务时间片轮转,而且允许准并行执行多个无限循环或任务。

      任务并不是并行执行的而是按时间片执行的可利用的中央处理器时间被分成时间片由 RTX51 分配一个时间片给各个任务 每个任务允许执行一个预先确定的时间 然后,rtx51 切换到另一准备运行的任务并且允许这个任务执行片刻 时间片非常短、通常为几个毫秒 因此、它表现得如同各个任务是同时地执行的RTX51 使用一个 8051 硬件计时器中断作为定时程序,产生的周期性中断用于驱动 RTX51 时钟RTX51 不需要在你的程序中拥有一个主函数它将自动开始执行任务 0 如果你确实有一个主函数,你必须利用 RTX51 Tiny中的 os_create_task 函数或 RTX51 中的 os_start_system 函数手工启动 RTX51下面的例子显示一个只使用时间片轮转任务调度的简单的 RTX51 应用程序 在本程序里的二个任务是简单的计数器回路 rtx51 启动时执行函数名为 job0 的任务 0 这个函数添加了另一个叫做 job1 的任务 在 job0 运行一会儿以后、RTX51 切换到 job1 在 job1 运行一会儿以后、RTX51 转回到 job0 这个过程将不确定地重复下去#i nclude int counter0;int counter1;void job0 (void) _task_ 0 {os_create (1); /* mark task 1 as ready */while (1) { /* loop forever */counter0++; /* update the counter */}}void job1 (void) _task_ 1 {while (1) { /* loop forever */counter1++; /* update the counter */}}RTX51 事件即使是在等待一个任务的时间片到达时,你也可以使用 os_wait 函数通知 RTX51 它可以让另一个任务开始执行。

      这个功能中止正在运行的当前任务然后等待一个指定事件的发生 在这个时候、任意数量的其他任务仍可以执行使用 RTX51 的时间溢出事件你可以用 os_wait 函数等待的最简单的事件是 RTX51 时钟报时信号周期溢出 这类事件可被用于任务中需要延迟一段时间的地方 这可用于查询一个开关状态的代码中 在这样的应用中,只须每隔 50ms 左右查询一次开关状态下一个例子示范了如何在允许其他的任务执行的时候使用 os_wait 功能延迟任务的执行#i nclude int counter0;int counter1;void job0 (void) _task_ 0 {os_create (1); /* mark task 1 as ready */while (1) { /* loop forever */counter0++; /* update the counter */os_wait (K_TMO, 3); /* pause for 3 clock ticks */}}void job1 (void) _task_ 1 {while (1) { /* loop forever */counter1++; /* update the counter */os_wait (K_TMO, 5); /* pause for 5 clock ticks */}}在上面的例子中、job0 像前面叙述的一样启动 job1。

      然后,在增加 counter0 计数以后,job0 调用 os_wait 函数以暂停3个时钟报时信号这时,rtx51 切换到下一个任务 job1 在 job1 增加 counter1 计数以后、它也调用 os_wait 以暂停5个时钟报时信号 现在、rtx51 没有其他的任务需要执行,因此在它可以延续执行 job0 之前它进入一个空循环等待3个时钟报时信号过去这个例子运行的结果是 counter0 每3个时钟报时周期加 1,而 counter1每 5 个时钟报时周期加 1RTX51 小型实时操作系统介绍(连载 3)使用 RTX51 的信号你可以使用 os_wait 功能暂停一个任务并等待从另一个任务发出的信号(或旗标) 这可以用于协调两个或更多的任务等待一个信号会如下面所诉工作∶如果一任务在等待一个信号,并且信号标志是 0,在这个信号被发送之前,这个任务将一直处于挂起状态 如果信号标志已经是 1,当任务查询信号时、信号标志会被清除,并且继续执行任务 以下例子说明了这种应用∶#i nclude int counter0;int counter1;void job0 (void) _task_ 0 {os_create (1); /* mark task 1 as ready */while (1) { /* loop forever */ if (++counter0 == 0) /* update the counter */os_send_signal (1); /* signal task 1 */}}void job1 (void) _task_ 1 {while (1) { /* loop forever */os_wait (K_SIG, 0, 0); /* wait for a signal */counter1++; /* update the counter */}}在上述例子中,job1 一直处于等待状态,直到它接收到从任何其他任务发出的信号。

      当它接收到一个信号时、它将使 counter1 加 1 然后继续等待另一个信号 job0 将连续地增加 counter0 直到它溢出到 0 当溢出发生时、job0 发送一个信号给 job1 同时 RTX51 标记 job1 为执行状态 在 RTX51 到达下一个时钟报时周期前,job1 不会开始执行优先权和抢先机制上述程序的缺点是当 job0 发出信号时 job1 并不是立即开始执行 在一些情况下,由于时间的原因这是不受欢迎的 RTX51 允许你指定任务的优先级 一个具有较高优先级的任务变成可用的时,会中断一个低优先级任务或抢在它前面执行 这叫做优先型多任务或仅仅称之为抢先机制注意 RTX51 Tiny 不支持抢先机制和优先权 、你可以变更上述函数 job1 的说明给它一个比 job0 高的优先级 全部任务的默认优先级均为 0 这是最低的优先级 优先级可以设定为 0-3 下面的例子说明如何定义 job1 的优先级为 1void job1 (void) _task_ 1 _priority_ 1 {while (1) { /* loop forever */os_wait (K_SIG, 0, 0); /* wait for a signal */counter1++; /* update the counter */}}现在、每当 job0 发送一个信号给 job1 时,job1 将立即开始执行。

      用 RTX51 进行编译和连接rtx51 是完全地统一到 c51 程序设计语言中的 这使得很容易熟悉如何生成 RTX51 应用程序 上述的例子是可执行的 RTX51 程序 你不需要书写任何 8051 汇编程序或函数 你唯一需要做的是用 c51 编译你的 RTX51 程序并把他们用 BL51 Linker/Locator 连接在一起 例如:如果你使用 RTX51 Tiny 的话,你将使用以下命令行命令进行编译和连接:C51 EXAMPLE.CBL51 EXAMPLE.OBJ RTX51TINY如果你使用 RT。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.