参考文档 :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_task、os_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 指示任务栈的起始地址。

RTX51 Tiny的更多相关文章

  1. RTX51 Tiny实时操作系统学习笔记—初识RTX51 Tiny

     一,RTX51 Tiny简单介绍    RTX51 Tiny是一种实时操作系统(RTOS),能够用它来建立多个任务(函数)同一时候运行的应用(从宏观上看是同一时候运行的,但从微观上看,还是独立运行的 ...

  2. 一个简单而经典的RTX51 Tiny应用实例

    关于RTX51 Tiny嵌入式实时操作系统的描写叙述请參考本人的上一篇博文(RTX51 Tiny实时操作系统学习笔记-初识RTX51 Tiny). 本篇博文.我将通过一个实例代码,带大家深入了解一下R ...

  3. [转]keil使用详解

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  4. 在keil 4中添加stc系列芯片的方法--【sky原创】

    在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...

  5. KeilC51使用详解 (一)

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  6. Keil C51 与 ARM 并存的方法

    很多朋友都在想,怎么让keil C51与ARM能够并存使用.有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作:安好ARM后再安C51,ARM不能正常工作. 网上也有相关解决办法,不过 ...

  7. Keil uVision4 for ARM 下增加支持C51,C5x

    原文链接:http://blog.csdn.net/skertone/article/details/7046447 第一步编辑 TOOLS.ini 找到Keil安装目录, 用记事本修改 TOOLS. ...

  8. keil c51笔记

    第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...

  9. arm的开发工具

    网上有free的ide可以开发arm cortex的芯片,可以参考List of ARM Cortex-M development tools,Wikipedia,里面有emIDE,embitz等,虽 ...

随机推荐

  1. Xshell 主机和远程机之间的文件传输

    (1)宿主机传输文件到远程机 方法1:直接拖动文件至xshell远程机命令行界面 方法2:远程机命令行输入rz打开文件选择框 (2)远程机传输文件到宿主机 远程机命令行界面上输入sz xxx.txt( ...

  2. bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...

  3. WCF知识点(应用WCF支持原生Socket访问, 原始字节流传输)

    最近在做区域医疗中PIX时, 需要让PIX Manager同时支持HL7的V2和V3版本.思路是利用WCF来同时支持V2版本的c/s架构式的消息协议和V3版本WebService的Soap协议.  实 ...

  4. mina2中的线程池

    一.Mina中的线程池模型 前面介绍了Mina总体的层次结构,那么在Mina里面是怎么使用Java NIO和进行线程调度的呢?这是提高IO处理性能的关键所在.Mina的线程调度原理主要如下图所示: A ...

  5. Windows平台Python编程必会模块之pywin32

    在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了. 不过,python模块虽多,也不可能满足开发者的所有需 ...

  6. object类型转换为Array类型

    var obj = {a: 1, b: 2, c: 3}; // .... var arr = []; for(var key in obj){ if(!obj.hasOwnProperty(key) ...

  7. ElementRef, @ViewChild & Renderer

    ElementRef: In Angular2 Doc, it suggest to "avoid" using ElementRef. It access DOM directl ...

  8. sublime text3设置

    我的sublime的设置,ps:这个博文只是为了我自己的一个记录 { "color_scheme": "Packages/Theme - Solarized Flat/S ...

  9. c# 鼠标点击控件即拖动窗体

    在编程中,有时打开的窗体没有边框,但是我们仍然想在鼠标放在窗体上就能拖动窗体,这样我们只需要以窗体中的一个控件为参考,我们在这里以panel为例子: public class PanelNew : P ...

  10. day6 面向对象(3)

    继承 1.1   类和类之间的常见关系. 1:既然继承是描述类和类之间的关系,就需要先来了解类和类之间的常见关系 1.1.1   现实生活的整体与部分 举例说明 1:现实生活 1:学生   是人 2: ...