zoukankan      html  css  js  c++  java
  • RTX51 Tiny

    参考文档 :RTX51 Tiny 2.02 中文手册.doc、Keil_Rtx51_tiny_RTOS中文版.pdf

    RTX-51 有 2 个版本:Full 和 Tiny。类似的国人写的 Small RTOS51

    Full 需要的资源较多(8K ROM/450的XDATA),但支持抢占式任务调度和中断任务,以及任务间互发消息;Tiny 不支持抢占式调度,任务间也不能互发消息,但消耗资源少(7+3*任务数RAM/不占用XDATA)。注意对C8051F/STC类增强型51用large模式

     参考资料见《RTX51 Tiny第2版用户手册》

    2类库文件

    RTX51TNY.LIB 用于无代码分组 (non_banking) RTX51 Tiny 程序。

    RTX51BT.LIB用于代码分组(code_ banking RTX51 Tiny 程序。

    一 特点:只适合51系列的周期性的任务场合(C8051F/STC),最多16个任务,没有主函数,从_task_ 0开始(用于创建其它任务,然后将自己删除,除_task_ 0外其它都是while(1)死循环),结构小巧只需要包含#include <rtx51tny.h>并在工程配置中选择。且需要项目添加CONF_TNY.A51,占用了定时器0和寄存器组1.

    Memory Model 用 Small 比较好,免得每次声明变量都写 data 修饰

    二系统滴答:

    • 配置文件ConfTny.A51中INT_CLOCK EQU 10000; default is 10000 cycles,意思是时钟滴答为10000个机器周期,即10000*1uS=10ms。所以os_wait(K_TMO, T, 0)定时时间=T*10MS;
      ;定时器时钟选择为系统时钟;因为C51是12T(一个单机器周期nop指令需要12个时钟周期/震荡周期(1/fs)),所以机器周期=12/fs(us).
      ;fs=12M;0.001s*12000000=12000
      ;fs=24M;0.001s*24000000=24000
      ;fs=48M;0.001S * 48000000 = 48000
      INT_CLOCK    EQU    24000    ; default is 10000 cycles
    •  TIMESHARING,即循环任务切换每个任务分到时间片,完了该任务被挂起切到其它就绪任务。默认是 5(5*INT_CLOCK),从这点来说Tiny-51适合周期性任务的场合,如果这个值是 0,那么,Round Robin 的任务轮询算法会停止,必须你自己手动 os_send_signal 或者 os_switch_task 来切换任务。某些时候,这样会提高实时性
    • RAMTOP。指定了可用 RAM 的顶部地址,默认是 0FFH,即 256 字节 RAM,任务多时要改小些
    • 任务若由时间片被动调度,修改时间的方法https://www.cnblogs.com/lizunicon/archive/2009/05/19/1460549.html
    • 我的程序要对一个脉宽30ms左右的脉冲计数,结果开始总是不对,后来才找到毛病。

      改配置文件的方法:

      1. 打开D:"Keil"C51"RTX_TINY目录下CONF_TNY.A51文件,修改两个参数

      2. 执行相同目录下的genrtx.bat文件,执行成功后会生成Rtx51tny.lib文件

      3. D:"Keil"C51"LIB下的Rtx51tny.lib作个备份,再将第2步中生成的Rtx51tny.lib拷贝到D:"Keil"C51"LIB目录下覆盖原有文件即可

      4. 重新编译你的工程

    • 如果使用timesharing,则一个延时函数的执行时间=(Tint+Ttimesharing)*任务数+delay/fos
    任务的状态:
    1 运行态(running):只有一个
    2 就绪态(read):通过调用延时函数后超时就处于该状态
    3.阻塞(blocked):调用延时函数但未超时,或者调用任务切换函数后的状态。
    4 休眠(sleeping):任务声明但未使用或者已经删除过的任务。
    任务的主动切换:
    void os_switch_task (void)//同时切换到的任务必须就绪,否则也不能运行。
    os_delete和os_wait
    主动设置任务就绪:os_set_ready isr_set_ready 函数,用于让那些等待超时、时间间隔、等待信号的任务设置就绪标志以运行
    任务间通讯:os_send_signal isr_send_signal 函数


    关于os_wait的三类参数:K_TMO、K_IVL和K_SIG,可以是前两个与信号的组合(或逻辑)。其返回值表明发生的事件,SIG_EVENT(os_send_signal isr_send_signal产生),RDY_EVENT(由 os_set_ready isr_set_ready引起 TMO_EVENT(由超时或时间间隔到达引起)
    延时的实际时间只与基本时间片INT_CLOCK有关,与timesharing无关(而任务的执行时间=timesharing/INT_CLOCK).延时函数只是延迟一定时间后让其就绪并不保证它马上运行,所以真正的延时时间还与当前执行任务的状况和总的任务数有关。
    K_TMO:超时信号不累计,在任务重的时候可能误差较大
    K_IVL:周期信号,可累计保证信号不丢失。
    K_SIG
    任务的独占:
    方法1:禁止循环任务调度调度:TIMESHARING=0(适应于实时性不高)、关中断(EA=0/关TO中断但时间不能太长)
    方法2:模仿FULL_RTX51编写申请和释放信号量,参考 https://blog.csdn.net/dkr269944905/article/details/72822959
    注意事项:
    1高优先级中断任务执行执行过长:原则高优先级中断的ISR应该尽量简洁(避免系统滴答中断的重入),或者让系统滴答的周期中断时间长一些(但这样实时性不好);最好的方法是LONG_USR_ISR=1,此时OS就会保护再入系统滴答中断的代码当然会增加开销。
    2 空闲任务:SJMP $ //某些兼容的8051有低功耗模式,tinyos支持低功耗,在定时器滴答中断或者其它中断时MCU恢复运行。 CPU_IDLE 宏 其实就是置位PCON的空闲模式位降低功耗
    3 优化:尽可能禁止循环任务切换,而主动使用os_switch_taskos_wait来主动切换降低13个字节的栈空间保护,同时避免系统滴答周期太快,任务从0开始。

    三 函数:
    3.1 创建任务:os_create_task(taskID);,对应的删除任务os_delete_task (taskID);而具体的任务函数时无参数无返回的
    3.2发送信号:char isr_send_signal(unsigned char task_id)、 os_send_signal/os_clear_signal ,前者由中断函数使用,返回-1表示任务不存在,0表示成功。
    3.3设置就绪:char isr_set_ready{ unsigned char task_id} 、os_set_ready
    3.4任务的切换:char os_switch_task(void)
    3.5等待:char os_wait1(unsigned char event_sel) 、char os_wait2(unsigned char event_sel, /* 要等待的事件 */unsigned char ticks);
    char os_wait(
    unsigned char event_sel, /* 要等待的事件 */
    unsigned char ticks, /* 要等待的滴答数 */
    unsigned int dammy) ,前者只能等待信号是后者的简化版


    3.4纠正当任务调用OS_Wait(K_IVL| K_SIG )同时等待一个信号和周期任务,在 K_SIG到达OS_Wait退出而时间间隔并没有调整而引起后续调用OS_Wait的时间不准问题,:void os_reset_interval(unsigned char ticks) ,使用方法:
    switch(os_wait2(KSIG|K_IVL,100))
    {
      case TMO_EVENT:
        /* 发生了超时,不需要 Os_reset_interval*/
        break;
      case SIG_EVCENT:
      /* 收到信号,需要 Os_reset_interval*/
      os_reset_interval(100);
        /* 依信号执行的其它操作 */
      break;
    }
    … 3.5增加任务优先级?http://bbs.21ic.com/icview-309676-1-1.html





    四调试:
    Peripherals 菜单选择 RTX51 Tiny T asklist 显示该对话框 TID 是在任务定义中指定的任务 ID
    Task Name 是任务函数的名字。
    State 是任务当前的状态。
    Wait for Event 指出任务正在等待什么事件。
    Sig 显示任务信号标志的状态( 1 为置位)。
    Timer 指示任务距超时的滴答数, 这是一个自由运行的定时器, 仅在任务等待超时和时间间隔时使用。
    Stack 指示任务栈的起始地址。


  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/jieruishu/p/9291214.html
Copyright © 2011-2022 走看看