实时操作系统RTX51 Tiny是RTX51的简板,它不支持优先级和CAN总线的相关定义函数。
RTX51
使用一个8051硬件计时器中断作为定时程序,产生的周期性中断用于驱动 RTX51时钟
该系统是通过给各个任务一定的时间片进行轮回完成调度的。
系统给要执行的
N
个任务按
Os_create_task(task_id)
创建的先后顺序排成一个队列,系统首先执行任务
0
,然后按队列中的任务一个一个的执行。
1、我们可以通过修改其配置文档
CONF_TNY.A51
(
keil/c51/
RTX_TINY
)来修改系统的相关配置;经常修改的部分如下:
;
; define the register bank used for the timer interrupt.
INT_REGBANK
EQU 1 ; default is Registerbank 1
;
;
; define Hardware-Timer Overflow in 8051 machine cycles.
INT_CLOCK EQU
10000 ; default is 10000 cycles
;
;
; define Round-Robin Timeout in Hardware-Timer Ticks.
TIMESHARING
EQU 5 ; default is 5 ticks.
;
;
;
; note: Round-Robin can be disabled by using value 0.
;
; Note:
Round-Robin Task Switching can be disabled by using '0' as
;
value for the TIMESHARING equate.
;------------------------------------------------------------------------------
;
; 'RTX-51 tiny' Stack Space
; =========================
;
; The following EQU statements defines the size of the internal RAM used
; for stack area and the minimum free space on the stack. A macro defines
; the code executed when the stack space is exhausted.
;
; ; define the highest RAM address used for CPU stack
RAMTOP
EQU 0FFH ; default is address (256-1)
;
FREE_STACK
EQU 20 ; default is 20 bytes free space on stack
;
STACK_ERROR
MACRO
CLR EA ; disable interrupts
SJMP $ ; endless loop if stack space is exhausted
ENDM
;
;------------------------------------------------------------------------------
2
、
RTX51
事件:
(1)
使用
RTX51
的时间溢出事件:
使用 os_wait函数等待的最简单的事件是事件溢出 RTX51时钟报时信号周期,这类事件可被
用于任务中需要延迟一段时间的地方,这可用于查询一个开关状态的代码中。 在这样的条件下,
只须每隔 50ms左右查询一次开关。
使用 os_wait函数等待RTX51时钟报时信号周期的任务停止,下一个处于READY状态的任务开始执行。
(2)
使用
RTX51
的信号事件
你可以使用 os_wait功能暂停一个任务并等待从另一个任务发出的信号或旗标。这可以用于
协调两个或更多的任务。如果一任务在等待一个信号并且信号标志是 0,在这个信号被发送之前这个任务将一直处于挂起状态,下一个处于READY状态的任务需要等到上一个任务时间片完成以后才开始执行;如果信号标志已经是 1,当任务查询信号时,信号标志会被清除并且继续执行任务。
Os_send_signal(task_id)
发送信号后,需等到下次执行因等待信号而终止的任务查询信号时,该任务才开始继续向下执行,在此期间如果该信号被清除,因等待而挂起的任务则无法执行
os_wait
后面的指令。
3
、下面,我们看RTX51 Tiny
提供的系统函数;
系统函数名称
|
功能说明
|
运行时间(时钟周期)
|
Os_create_task(task_id)
|
将一任务加入到执行队列
|
302
|
Os_delete_task(task_id);
|
将一任务从执行队列删除
|
172
|
Os_send_signal(task_id);
|
给一任务发送信号
|
408/316/71
|
Os_clear_signal(task_id);
|
删除一个发送的信号
|
57
|
Isr_send_signal(task_id)
|
在中断中给一任务发送信号
|
46
|
Os_wait()
|
等待
|
68/160
|
Os_wait1()
|
等待
|
|
Os_wait2()
|
等待
|
|
4
、任务之间的通信:
(
1
)
char os_wait (
unsigned char event_sel, /* events to wait for */
unsigned char tick s, /* timer ticks to wait等待信号的数目*/
unsigned int dummy); /* unused argument */
参数event_sel可以是下面一个或几个间的逻辑或:
K_IVL:等待一个时钟报时间隔
K_SIG:等待一个信号
K_TMO:等待一个超时(time-out)
(2)char os_wait1 (
unsigned char event_sel); /* events to wait for */
它是
os_wait
的一个子集,只等待一个信号。
(3)char os_wait2 (
unsigned char event_sel, /* events to wait for */
unsigned char tick s); /* timer ticks to wait */
参数event_sel同
os_wait
参数 ticks规定等待一个间隔事件k_ivl 或一个超时事件k_tmo 的报时信号数目
|