热度 16
2013-7-11 00:16
2215 次阅读|
0 个评论
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的帮助文档) ( 1 ) RUNNING 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. ( 2 ) READY 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. ( 3 ) WAITING 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. ( 4 ) DELETED 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 ( 5 ) TIME-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