码迷,mamicode.com
首页 > 其他好文 > 详细

51单片机上实时多任务操作系统-教程

时间:2016-06-23 06:26:45      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:

 

  • RTX51是用与8051系列的实时多任务RTOS 1。
  • RTX 两个版本区别:
    1. RTX51 FULL:允许4个优先任务循环和切换,并行利用终端,支持邮箱系统的信号和消息传递
    2. RTX TINY 子集,不支持占先式任务切换,不能进行信息处理
  • RTX的循环任务调度
    • 准并行
    • 利用内部定时器的中断实现定时
    • 使用时不需要包含main()函数,自动从任务0开始
    • 如果包含main()函数,则需要利用os-start-system 或 os-creat-task来启动

Example1:

    ps:注意事项:

    关于Keil报错 *** FATAL ERROR L210: I/O ERROR ON INPUT FILE:缺少RTX51.LIB 

    需要在项目里面选择操作系统,RTX-51TINY

    

例子:

 程序启动时从任务0开始,同时创建任务1,任务 1等待任务0产生信号0,信号量为0时任务挂起,为1时清除信号标准并继续执行任务-》启动任务2,任务2执行一段时间后删除自身任务。

  

#include <rtx51tny.h>
#include <stc.H>
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
long cnt;
job0() _task_ 0
{
    os_create_task(1);
    while(1)
    {
        LED1=~LED1;
        os_wait2(K_TMO,10);
        cnt++;
        if(cnt==20)
            os_send_signal(1);
    }
}
job1() _task_ 1
{
    while(1)
    {
        LED2=~LED2;
        os_wait(K_SIG,0,0);
        os_create_task(2);
        cnt=0;
    }
}
job2() _task_ 2
{
        LED3=0;
        os_wait2(K_TMO,50);
        LED3=1;
        os_delete_task(2);
        return 0;
}

 

  • 优先级:

  当job0 发送信号到job1之后,job1并不是立即执行,而是等待job0的超时出现后才开始执行,默认情况下。所有优先级均为0

    优先级可以定为0-3;

重新定义如下:

  

job1() _task_ 1 _priority_1
{

}

此时,当1个信号量到达之后,将马上开始执行。
  • 中断

  RXT51可以与中断并行工作,中断函数可以与RTX51通讯,向RTX51的任务发送信号或消息

  RTX51-Tiny 本身不包括任何中断管理,对中断允许寄存器的操作同普通一样。

  由于内部使用了定时器0,因此不允许禁止定时器0中断  

    isr_send_message /isr_recv_messge 从中断中发送或接受信息

  • 时间片切换

  时间片的持续时间可以通过配置文件conf_tny.a51中变了TIMESHARING来设置

  • RTX51 TINY配置

  1. INT_CLOCK 时钟间隔
  2. TIMESHARING 循环任务切换时间片
  3. INT_REGBANK 定义哪一个寄存器作为中断 默认组1
  4. RANTOP 定义TINY使用内部RAM的最高地址 STC系列可以使用FFH
  5. FREE_STACK 定义自由栈区的大小,以字节为单位,默认值20
  6. STACK_ERROR 当RTX检测到栈区出错时,将启用该宏

51单片机上实时多任务操作系统-教程

标签:

原文地址:http://www.cnblogs.com/expli/p/5609166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!