|
单任务程序
一个标准的 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。 这个过程将不确定地重复下去。
#include <rtx51tny.h> 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功能延迟任务的执行。
#include <rtx51tny.h> 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个时钟报时周期加 1。