③char os_send_signal(task_id);
④char isr_send_signal(task_id);
⑤char os_clear_signal(task_id);
⑥char os_running_task_id(void);
⑦char os_wait(event_sel,ticks,dummy)。
各函数的函数原型和具体意义。
2 RTX51 TINY 内核分析
2.1 任务状态
RTX51 TINY 的用户任务具有以下几个状态。
*RUNNING:任务处于运行中,同一时间只有一个任务可以处于“RUNNING”状态。
*READY:任务正在等待运行,在当前运行的任务时间片完成之后, RTX51 TINY 运行下
一个处于“READY”状态的任务。
*WAITING:任务等待一个事件。如果所等待的事件发生的话,任务进入“READY”状态。
*DELETED:任务不处于执行队列。
*TIME OUT:任务由于时间片用完而处于“TIME OUT”状态,并等待再次运行。该状态写
“READY”状态相似,但由于是内部操作过程使一个循环任务被切换而被冠以标记。
图 1 所示为任务状态转换图。
2.2 同步机制
为了能保证任务在执行次序上的协调,必须采用同步机制。内核用以下事件进行任务间的
通信和同步。
①SIGNAL:用于任务之间通信的位,可以用系统函数置位或清除。如果一个任务调用
os_wait 函数等待 SIGNAL 而 SIGNAL 未置位,则该任务被挂起直到 SIGNAL 置位,才返回
到 READY 状态,并可被再次执行。
②TIMEOUT:由 os_wait 函数开始的时间延时,其持续时间可由定时节拍数确定。带有
TIMEOUT 值调用 os_wait 函数的任务将被挂起,直到延时结束,才返回到 READY 状态,
并可被再次执行。
③INTERVAL:由 os_wait 函数开始的时间间隔,其间隔时间可由定时节拍数确定。带有
INTERVAL 值调用 os_wait 函数的任务将被挂起,直到间隔时间结束,然后返回到 READY
状态,并可被再次执行。与 TIMEOUT 不同的是,任务的节拍计数器不复位。
2.3 调度规则
RTX51 TINY 使用 8051 内部定时器 T0 来产生定时节拍,各任务只在各自分配的定时节拍
数(时间片)内执行。当时间片用完后,切换至下一任务运行,因此,各任务是并发执行
的。
调度规则如下:如果
,且特定事件还没有发生,②任务执行比循环切换所规定的时间长,则运行任务被中断;
如果①没有其它任务正在运行,②任务处于“READY”或“TIMEOUT”状态下等待运行,则另
一个任务开始。
2.4 任务控制块
为了能描述和控制任务的运行,内核为每个任务定义了称作任务控制块的数据结构,主要
包括三项内容:
①ENTRY[task_id]:task_id 任务的代码入口地址,位于 CODE 空间,2 字节为一个单位。
②STKP[taskid]:taskid 任务所使用堆栈栈底位置,位于 IDATA 空间,1 字节为一个单位。