网上找到,觉得不错拿出分享:
特性:
最大任务数:16
最大激活的任务数:16
所需的CODE空间:最大900Byte
DATA空间:7字节
STACK空间:3字节
XDATA空间:0字节
时钟数:0个
系统时钟分频:1000-----65535
中断嵌套:小于20层
任务切换时间:100-700时钟周期
工具要求:
C51纺编译器
A51 Marco Assembler
BL51 Linker or Lx51 Linker
RTX51TNY.LIB 和 RTX51BT.LIB必需存储在库路径上,一般是文件夹KEILC51LIB
RTX51TNY.H包含文件必须存储在包含文件路径上,一般是文件夹KEILC51INC
目标要求:
应用程序可能需要外部分的数据存储空间,但内核并不需要外部存储空间
KEIL C51支持各种存储模式:选择存储模式只影响应用程序的存的数据存储,操作系统的变量和堆栈只存在于51的内存中,即DATA和IDATA,一般情况下,RTX51 Tiny的应用只需要小存储模式
在RTX51 Tiny中每个应用程序运行的时间是固定的,支持cooperative任务切换和round-robin任务切换,不支持preemptive任务切换和任务优先级。如果应用程序需要preemptive任务切换则必须使用RTX51 FULL-Time Executive版本。
中断:
RTX51 Tiny的工作与中断函数是并行工作的。中断服务程序可以向RTX51 Tiny的任务发信号(使用函数isr_send_signal),也可以置位作任务的Ready标志(使用函数isr_set _ready)
在RTX51 Tiny中必须使能中断,但是在RTX51 Tiny没有中断服务管理
RTX51 Tiny使用Timer0和Timer0中断。全局中断禁能和Timer0中断禁能会使RTX51 Tiny停止工作,所以只能在短时间内禁能中断。
可重入函数
非可重入的C函数不能被多个任务或中断过程调用。非可重入的函数的参数和变量保存在静态存储空间中,当它们同时被多个任务调用时,这些参数和变量就可能被覆盖了。
你可以在多任务系统中调用非可重入函数如果你能保证他们不会同进行。不过,这就意味着必须能 round-robin任务调度,并且非可重入函数不可以调用RTX51 Tiny的功能函数。
只使用寄存器就量和自动变量的函数自然地就是可重入函数,可以毫无限制地在RTX51 Tiny中调用。
C51编译器支可重入函数。可重入函把参数和局部变量保存在堆栈中。这样就可以保证他们被多个任务同时使用。RTX51 Tiny并不管理可重入函数的堆栈,因些,如果你在应用程序中使用了可重入函数,你必须确保这些功能函数不调用任务RTX51 Tiny的系统函数,并且可重入函数不会被round-robin任务切换所中断。
注意:如果你打自在多个任务或中断中调用可重入或非可重入函数必须禁止round-robin任务切换。
运行时库:
所有的C51可重入运行时库可能毫无限制地在所用任务中使用。非可重入时库的要与可重入函数的要求相同。
多个数据指针
C51编译器允许使用多个数据指针。RTX51 Tiny对他们不进行管理,所以在应用中你必须小心
Essentially,你必须确保在改变数据指针时不会发生round-robin切换。
注意:当你打算使用多数据指针时你最好禁止round-robin切换。
算术单元
(说法与多个数据指针相同)
工作寄存器组
RTX51 Tiny的所有任务都使用工作组0。因些,所有的任务都必须使用C51默认的编译选项:REGISTERBANK (0)
中断函数可能会使用其他的工作寄存器组。然而RTX51 Tiny在工作寄存器组中永远需要6个字节。RTX51 Tiny在工作寄存器组中使用的这些字节可以参考配置文件
单个任务程序
嵌入式和标准C程序都mian()函数开始。在入式应用中, main函数一般都是一个死循环,我们也可以把它看作是一个连续执行的任务。如:
void main (void)
{
while (1) /* repeat forever */
{
do_something (); /* execute the do_something 'task' */
}
}
在这个例子中,do_something ()函数可以认为是一个单任务,既然只有一个任务在执行,就不需要具有多任务能力或多任务操作系统。
多任务程序
许多成熟的C程序使用一种叫做pseudo多任务的策略,把多个作协做为一循环,如:
void main (void)
{
int counter = 0;
while (1) /* repeat forever */
{
check_serial_io (); /* check for serial input */
process_serial_cmds (); /* process serial input */
check_kbd_io (); /* check for keyboard input */
process_kbd_cmds (); /* process keyboard input */
adjust_ctrlr_parms (); /* adjust the controller */
counter++; /* increment counter */
}
}
在这个例子中,每个函数完成一个独立的操作或任务。这些函数是一个一个顺序执行的
当添加更多的任务时调度就行了一个问题。比方说,如果函数process_kbd_cmds执行的时间比较长,主循环就需要很长时间才能再执行到函数check_serial_io ,这时候串口的数据可能会丢失。当然check_serial_io 可以在主循环中多调用几次来解决这个问题,但最终这种方法并不是最有效的。
RTX51 Tiny的程序
当使用RTX51 Tiny时,你可以为每一个任务生成一个独立的函数,如:
void check_serial_io_task (void) _task_ 1
{
/* This task checks for serial I/O */
}
void process_serial_cmds_task (void) _task_ 2
{
/* This task processes serial commands */
}
void check_kbd_io_task (void) _task_ 3
{
/* This task checks for keyboard I/O */
}
void process_kbd_cmds_task (void) _task_ 4
{
/* This task processes keyboard commands */
}
void startup_task (void) _task_ 0
{
os_create_task (1); /* Create serial_io Task */
os_create_task (2); /* Create serial_cmds Task */
os_create_task (3); /* Create kbd_io Task */
os_create_task (4); /* Create kbd_cmds Task */
os_delete_task (0); /* Delete the Startup Task */
}
在这个例子中,每个函数定义了一个RTX51 Tiny的任务。RTX51 Tiny程序没有主C函数,RTX51 Tiny首先执行任务0。作为一个典型的应用,任务0只是简单地用来生成其他的所有任务。
工作原理
RTX51 Tiny使用并管理你的目标资源,这一部分讲述RTX51 Tiny如何使用这些资源。RTX51 Tiny的许多方面都可以根据工程需要进行配置。
时间片中断
RTX51 Tiny使用标准的8051的定时器0来产生定时中断。这个中断就是RTX51 Tiny的时钟片。RTX51 Tiny运行时库中用的时等待时间都是以这个时间片为单位的
RTX51 Tiny的默认的时间片是10000个机器周期。因此,标准的8051运行在12MHz的时钟下的时候,时间片有0.01S或着说是100Hz。这个值可以在CONF_TNY.A51 配置文件中更改。
注意:你在以RTX51 Tiny时间片中断中编辑你自己的代码,参考:CONF_TNY.A51
任务:
RTX51 Tiny可以看作是一个任务切换器。要生成RTX51 Tiny程序,你必须生成一个具有一个或多个任务的应用。以下细节可以帮你更快地理解RTX51
任务必须用C语言编写,并且用Keil C51支持的关键词声明
RTX51 Tiny使用准确的状态维护任务。
同时只有一个任务可以处于运行状态
可能会有多个任务处于就绪,等待,删除或超时状态
空闲任务总是处于就绪状态,即使使用你的所有任务都处于block状态
任务管理
RTX51 Tiny的任务总是处于以下状态中一确定的状态
RUNNING:任务处于运行状态,os_running_task_id返回正在运行的任务的编号
READY:任务处于就绪状态。当一个正在运行的任务运行完毕,RTX51 Tiny就会启动下一个就绪状态的任务。一个任务可以通设置他的READY标志位os_set_ready or isr_set_ready使它立即进入就绪状态(即使它可能正在等待时间到或等一个信号)
WAITTING:处于等待一个事件的任务就处于等待状态。当所等待的事件发生后,任务就转换到就绪状态,函数os_wait用来使一个作任务进行等待状态
DELETED:没有开始运行的任务或被删除的任务处于DELETED状态。函数os_delete_task使一个已经启动(使用函数os_create_task)的任务进入DELETED状态
TIME-OUT:被round-robin Time-Out中断的任务处于TIME-OUT状态。这个状态在round-robin程序中等效于READY状态
事件(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的一部分,用来将处理器交给任务。任务调度器根据以下规则决定具体执行哪一个任务。
当出现以下情况将中断当前任务
任务调用函数os_wait,并且等待的任务还没有发生
任务执行的时间超过了设定的round-robin时间片
其他的任务在出现以下条件时开始运行
没有其他任务正在运行
将启动的任务正处于就绪状态或TIME-OUT状态
下面是比较全的资料: