tag 标签: rtx51

相关博文
  • 热度 20
    2013-11-14 15:59
    3774 次阅读|
    1 个评论
    记得使用51还是大学时候的事了,当时只知道能在51上移植uc-os,主要原因也是不知道51上能使用什么RTOS,后来看到有人开始在51上移植uc-os,自己也就搞了本书开始研究uc-os,不过可惜,移植了将近一星期,也没移植成功,后来就放弃了! 最近由于项目需要,要使用51内核的MCU,不过这次需要给51加入RTOS,以增加系统稳定性。通过我们公司的老工程师才知道原来KEIL上早就已经集成了专用于51内核的RTOS,也就是这次的主题RTX51 Tiny。 首先说说关于RTX51 Tiny。RTX51分为Tiny版和Full版,两者都是不开源的。Tiny是免费版,Full是收费的。在功能上Full的功能比Tiny要强大很多。而KEIL中提供的就是Tiny版。不过对于51来说,Tiny版就应该够用了。其实之前在51上移植uc-os应该来说是一个不好的选择,51内核的资源有限,对于大型的RTOS可能运行起来还存在问题,不过自己也没试过。RTX51 Tiny是非常简化的RTOS,它没有什么信号量,也没有什么消息信箱等等,只具有几个简单的系统调度功能函数。它对任务的调度方式,也可由用户在其配置文件中进行设置,它的调度方式分为:1,时间片轮叫调度,即将每个任务分给CPU,CPU在这一规定时间片内对任务进行操作,以任务的ID号对任务进行轮叫运行。2.合作式调度,这种方式就是用户通过自定义的方式将时间片轮叫调度关闭了,RTOS调度任务的方式,只能通过用户进行手工的调度。RTX51最大支持16个任务,任务之间没有优先级。由于没有优先级,在轮叫调度方式下,如果当前任务发送了一个信号给它非相邻的任务,当这一任务执行完成后,它仍然会执行它的下一个相邻任务,而不会去执行发给其信号的任务,具体执行的情况,可以看我的例子。RTX51是使用Timer0作为RTOS的时间调度,所以用户在应用程序中就不要使用Timer0了,不然程序肯定无法运行。对于时间片的时间设定,RTX51使用了INT_CLOCK,TIMESHARING这两个宏,在使用过程中,我发现对于TIMESHARING好像不能设置的太大,不然对于任务的调度就混乱了,不过在KEIL相关的文档中也没有找到关于这个宏所能定义的最大值。还有由于RTX51-Tiny使用的是Timer0,在使用Timer0之前一定要设置好Timer0的时钟源和工作模式,默认情况下Timer0使用的是16-bit模式,所以如果用户在程序中还使用其它的定时器会涉及修改TMOD寄存器时不要采用直接赋值的方式,而应该采用Read-Modify-Write的方式,这样就不会改变默认TMOD位!!还有每个任务必须是while(1)结构,否则此任务就只会执行一次,并造成整个任务调度出错!!RTX51中时钟节拍不要设置的太小,因为时间中断会占用几百个指令周期。RTX51中只具有如下的系统服务: isr_send_signal isr_set_ready os_clear_signal os_create_task os_delete_task os_reset_interval os_running_task_id os_send_signal os_set_ready os_switch_task os_wait os_wait1 os_wait2 对于RTX51的相关资料文档,在KEIL中已经阐述的非常详细了,以后在使用过程中,在出现什么问题,再和大家分享,下面是我用KEIL和Protues仿真的一个实例。  
  • 热度 25
    2013-7-29 03:42
    1532 次阅读|
    3 个评论
    山寨的开场白终于可以上传了,大家拍砖,我睡觉了。 时间:2013-07-29 3:33
  • 热度 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
相关资源