|
实时操作系统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 的报时信号数目
|
所有评论(0)