事件(Events)
在实时操作系统中事件可以用来控制任务的执行。一个可能会等待一个事件,也可能给其他任务设置事件标志。
函数os_wait允许任务等待一个或多个事件。
任务等待的是最普通的事件就是Timeout,一个简单的Timeout就是一定数量的clock ticks,当一个任务等待的时间耗尽时,它就可以继续执行了,当它等待时,其他的任务就可以运行
variant of the Timeout is the Interval. An interval is like a timeout except that the specified number of clock ticks is relative to the last time the os_wait function was invoked by the task. The Interval may be used to generate a task which is run on a regular, synchronous schedule (like once every second) regardless of how long the task takes between calls to the os_wait function.(以上内容是说,interval类似于timeout,但与timeout不同的是interval参考的不是上一次任务执行后的时间,而是某个特定的时间点,从而是一个规律性的、周期性的运行的任务:比如说每秒一次)
信号是任务间通信的一种简单的形式,一个任务可以等待其他作任务给他发一个信号(使用 os_send_signal and isr_send_signal 函数)。
每个任务的READY标志都可能被其他任务置位(使用 os_set_ready and isr_set_ready 函数)。一个等timeout, interval, 或信号的任务都可以通过置位READY标志重新启动。
RTX51 Tiny会为每个事件维护一个标志。以下事件选择项可以被用来表明等待什么:
事件选项 描述
K_IVL 等待特定数目的Interval
K_SIG 等待一个信号
K_TMO 等待Timeout
当函数os_wait返回,发生的事件被返回值标志
返回值 描述
RDY_EVENT 任务的就绪标志被置位
SIG_EVENT 信号已收到
TMO_EVENT 一个Timeout已经结束或一个interval已经完毕
函数os_wait可能会等待以下事件组合
K_SIG | K_TMO:os_wait延迟任务直到一个信号已经发给他,或直到设定的clocktick耗尽
K_SIG | K_IVL:os_wait延迟任务直到一个信号已经发给他,或直到设定的interval耗尽
注意:上面的两个事件也可能不组合。
库文件
RTX51 Tiny包括两个库文件
RTX51TNY.LIB is used for non-banking RTX51 Tiny programs
RTX51BT.LIB is used for code-banking RTX51 Tiny programs.
The RTXTINY2.PRJ project found in the \KEIL\C51\RTXTINY2\SOURCECODE\ folder is used to build these two libraries.
注意:不需要在应用显式地包含这两个文件。如果你使用µVision2 IDE或command-line linker时这两个文件会自动地包含进去。
如果要建立RTX51 Tiny的库,缺省的配置文件会加入进去。如果不显式地声明包含配置文件,默认的配置文件会包含进去。以后对配置文件做的修改会对就用产生意想不到的效果。
定义任务
实时或多任务应用由一个或多个完成特定功能的任务组成。RTX51 Tiny支持最多16个任务
任务必须是用_task_声明的C函数,返回值和参数都必须是void类型的,如
void func (void) _task_ task_id
这里
func is the name of the task function.
task_id is a task ID number from 0 to 15
以下例子定义了函数job0作为一个任务,任务编号为0。
void job0 (void) _task_ 0 {
while (1) {
counter0++; /* increment counter */
}
}
注意:所有的任务都必须通过循环实现,而且永不返回
char os_send_signal (
unsigned char task_id); /* ID of task to signal */
Description:该函数给编号为task_id的任务发一个信号。如果任务在等待该信信号,该函数使这个任务进行就绪状态。否则信号就存储在任务的信号标志里
Return Value:发送成功则返回0,如果任务不存在返回-1
See Also: isr_send_signal, os_clear_signal, os_wait
Example:
#include