原创 给51单片机上系统了

2013-7-11 00:16 2212 16 16 分类: MCU/ 嵌入式 文集: MCU

 

1.     简述RTX51 Tiny操作系统!!!

RTX51 Tiny是德国KEIL公司开发的专门针对于8051内核兼容MCU所作的实时操作系统(RTOS),RTX51有两个版本:RTX51-FULL与RTX51-Tiny。FULL版本支持四级任务优先级,最大支持256个任务,它工作在类似于中断功能的状态下,同时支持抢占式与时间片循环调度、支持信号(signal)、消息队列、二进制信号量(semaphore)和邮箱(mailbox),其功能强大,仅仅占用6~8KB的程序存储器空间。RTX51 Tiny是RTX51 FULL的子集,是一个很小的内核,只占有800byte的存储空间(主要程序RTX51 TNY.A51仅有不足一千行)它适用于对实时性要求不严格的、仅要求多任务管理且任务间通信功能不要求非常强大的应用。它仅使用51内部寄存器来实现所有功能,应用程序只需要以系统调用(system call)的方式引用RTX51中的函数即可,RTX51-Tiny可以支持16个任务,多个任务遵循时间片轮转的规则,任务间以信号signal的方式进行通信,任务可以等待另一任务给他发出signal然后在再从挂起状态恢复运行,它并不支持抢占式任务切换的方式。

2.     为什么要使用操作系统?

有时候进行单片机程序开发的时候我们需要用到多任务,这时就必须涉及到操作系统了,因为没有操作系统的话很难达到多任务协调调度的目的...以前我阅读过uCOS-II的源码,也曾将其移植到51系列单片机上,但是由于其需要很大的内存,单片机需另扩展RAM才能跑起来。RTX51 Tiny是一款可以运行在大多数8051兼容的器件及其派生器件上的实时操作系统(准实时),相对与传统的开发方式而言,用实时操作系统进行开发是一种效率更高的方式。作为实时操作系统,RTX51 Tiny虽然比较简陋,但它还是具备了一些实时操作系统的基本要素,完全可以充当我们进入实时操作系统(RTOS)世界的领路者,更为重要的是,它是免费的。所以我决定将为大家呈现一道超小的操作系统盛宴,以便大家慢慢享用。若喜欢,慢慢享用,若摒弃,别倒掉,留我慢慢品尝,我是农家孩子,不舍得浪费 ^_O_^

3.     RTX51 Tiny中任务有以下五种状态(摘自keil的帮助文档)
1RUNNING The task that is currently running is in the RUNNING State. Only one task at a time may be in this state. The os_running_task_id returns the task number of the currently executing task. 
2READY Tasks which are ready to run are in the READY State. Once the Running task has completed processing, RTX51 Tiny selects and starts the next Ready task. A task may be made ready immediately (even if the task is waiting for a timeout or signal) by setting its ready flag using the os_set_ready or isr_set_ready functions. 
3WAITING Tasks which are waiting for an event are in the WAITING State. Once the event occurs, the task is switched to the READY State. The os_wait function is used to place a task in the WAITING State. 
4DELETED Tasks which have not been started or tasks which have been deleted are in the DELETED State. The os_delete_task routine places a task that has been started (with os_create_task) into the DELETED State 
5TIME-OUT Tasks which were interrupted by a Round-Robin Time-Out are in the TIME-OUT State. This state is equivalent to the READY State for Round-Robin programs.

若大伙们和我一样,英语比较烂,那就来段中文的段段子,以便屌丝们能很好的理解,嘿嘿。。。

   

运 行

正在运行的任务处于运行态。某个时刻只能有一个任务处于该状态。

os_running_task_id 函数返回当前正在运行的任务编号。

就 绪

准备运行的任务处于就绪态。一旦运行的任务完成了处理,RTX51 Tiny选择一个就绪的任务执行。一个任务可以通过用os_set_ready或os_set_ready函数设置就绪标志来使其立即就绪(即便该任务正在等待超时或信号)。

等 待

正在等待一个事件的任务处于等待态。一旦事件发生,任务切换到就绪态。Os_wait函数用于将一个任务置为等待态。

删 除

没有被启动或已被删除的任务处于删除态。Os-delete-task函数将一个已经启动(用os_create_task)的任务置为删除态。

超 时

被超时循环中断的任务处于超时态,在循环任务程序中,该状态相当于就绪态。

 

4.     如何使用RTX51 Tiny??

1)        包含头文件RTX51TNY.H

2)        创建任务(至少一个,不需要main,因为操作系统有自己的main)

3)        程序必须至少包含一个任务函数

4)        中断必须有效(EA = 1),在临界区如果要禁止中断时一定要小心。

5)        程序必须至少调用一个RTX51 Tiny库函数(例如:os_wait)。否则,连接起将不包含RTX51 Tiny库

6)        任务0是程序中首先要执行的函数,必须在任务0中调用os_create_task函数以运行其余任务

7)        任务函数必须是从不退出或返回的。任务必须用一个while(1)或类似的结构重复。用os_delete_task函数停止运行的任务,例如在任务0开启之后用os_delete_task(0)停止该任务。

8)        在Target里Operation System中选择RTX51 Tiny

9)        必须在uVison中指定RTX51 Tiny,或者在连接器命令行中指定。

附注:

u  所有的任务都应该是无限循环,任务一定不能返回

u  任务不能返回一个函数值,它们的返回类型必须是void

u  不能对一个任务传递参数,任务的形参必须是void

u  每个任务必须赋予一个唯一的、不重复的ID

u  为了最小化RTX51 Tiny的存储器要求,从0开始对任务进行顺序编号

u  任务的定义方法:void func(void) _task_ id

u  一共可以使用16个任务 _task_ 是KEIL扩展关键字

----- 调试时可以使用Peripherals菜单中的RTX51 Tiny Tasklist查看任务列表与状态 -----

Ø  TID是在任务定义指定的任务ID

Ø  Task Name 是任务函数的名字

Ø  State是任务当前的状态

Ø  Wait for Event 指出任务正在等待什么事件

Ø  Sig显示任务信号标志的状态(1为置位)

Ø  Timer指示任务距超时的滴答数,这是一个自由运行的定时器,仅在任务等待超时或时间间隔是使用

Ø  Stack指示任务栈的起始地址

5.     RTX51 Tiny中的中断说明!

RTX51 Tiny的工作于中断函数是并行工作的。中断服务程序可以向RTX51 Tiny德任务发信号(使用函数isr_send_signal),也可以置位做任务的Ready标志(使用函数isr_set_ready)在RTX51 Tiny中必须使能中断,但是在RTX51 Tiny没有中断服务管理,RTX51 Tiny使用Time0和Timer0中断。全局中断禁能和Timer0中断禁能会使RTX51 Tiny停止工作,所以只能在短时间内禁能中断。

注意:RTX51 Tiny使用了定时器0为它提供时钟.所以应用程序中应避免使用定时器0.

6.     单任务程序

嵌入式和标准C程序都以main()函数开始。在嵌入式应用中,main函数一般都是一个死循环,我们也可以把它看做是一个连续执行的任务。如:

Void main(void)

{

        While(1)              /* repeat forever */

        {

               Do_something(); /* execute the do_something ‘task’ */

}

}

在这个例子中,do_something()函数可以认为是一个单任务,既然只有一个任务在执行,就不需要具有多任务能力或多任务操作系统。

7.     多任务程序

许多成熟的C程序使用一种叫做pseudo多任务的策略,把多个协调作为一个循环,如:

void main(void)

{

       int counter = 0;

       while(1)

       {

              check_serila_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时,你可以为每一个任务生成一个独立的函数,如:

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只是简单地用来生成其他的所有任务。

8.     时间片中断的概念

RTX51 Tiny使用标准的8051的定时器0来产生定时中断。这个中断就是RTX51 Tiny的时钟片。RTX51 Tiny运行时库中用的时等待时间都是以这个时间片为单位的RTX51 Tiny的默认的时间片是10000个机器周期。因此,标准的8051运行在11.0592MHz的时钟下的时候,系统的时钟周期为:

1.08507 x 10000 = 10850us = 10.8507ms

TIME SHARING EQU 5 定义任务切换的时间片的长度 即多少个系统时钟周期一个时间片,系统默认为5个系统时钟,如果晶振伟11.0592MHz则时间片为10.8507 x 5 = 54.2535ms,注意该值不能设定为0,否则系统不会进行任务切换。

!!注意:你在以RTX51 Tiny时间片中断中编辑你自己的代码,参考:CONF_TNY.A51

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条