关于Easy51RTOS

将一个任务分成若干段,确保每段需要CPU 关照时长小于定时器
中断节拍长,这样CPU在处理这些长任务时,就不会影响到其它任务的执行。
Easy51RTOS
正是基于以上程序设计思想,总结完善后提出一种耗费资源特别少并且不使用堆栈的多
线程操作系统,这个操作系统以纯C语言实现,无硬件依赖性,需要单片机的资源极少。起
名为 Easy51RTOS,特别适合初学者学习使用。有任务优先级,通过技巧可以任务间延时,
缺点是高优先级任务不具有抢占功能,一个具有抢占功能的操作系统,一定要涉及到现场保
护与恢复,需要更多的 RAM 资源,涉及到堆栈知识,文件系统将很复杂,初学者学习难度
大。
为了便于初学者学习,将代码文件压缩至 4 个文件。
Easy51RTOS.Uv2 Keil工程文件,KEIL用户很熟悉的
main.c    main函数和用户任务 task 函数文件
os_c.c    Easy51RTOS相关函数文件
os_cfg.h    Easy51RTOS相关配置参数头文件
文件解读如下:
os_cfg.h
#include "reg51.h"
#define TIME_PER_SEC 200    //定义任务时钟频率,200Hz
#define CLOCK 22118400    //定义时钟晶振,单位Hz
#define MAX_TASK 4      //定义任务数量  
//函数变量声明,在需要用以下函数或变量的文件中包含此头文件即可
extern void task0(void);
extern void task1(void);
extern void task2(void);
extern void task3(void);
extern unsigned char task_delay[MAX_TASK];
extern void run(void (*ptask)());
extern void os_timer0_init(void);

os_c.c
#include "os_cfg.h"
unsigned char task_delay[MAX_TASK];  //定义任务延时量变量
//定时器0初始化
void os_timer0_init(void)
{
    unsigned char i;
   for(i=0;i<MAX_TASK;i++) task_delay=0;
    TMOD = (TMOD & 0XF0) | 0X01;    //定时器 0工作在模式 1,16Bit 定时器模式  (TMOD & 0XF0)表示将TMOD第四位置零,在将最低位置一!
    TH0 = 255-CLOCK/TIME_PER_SEC/12/256;   
//CRY_OSC,TIME_PER_SEC在 os_cfg.h中定义
    TL0 = 255-CLOCK/TIME_PER_SEC/12%256;   
   TR0 =1;  
ET0 =1;         //开启定时器和中断
}

// 系统 OS定时中断服务
void os_timer0(void) interrupt 1
{
    unsigned char i;
    TH0 = 255-CLOCK/TIME_PER_SEC/12/256;
    TL0 = 255-CLOCK/TIME_PER_SEC/12%256;        
    for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;  
//每节拍对任务延时变量减1 ,减至 0  后,任务就绪。   
}

//指向函数的指针函数
void run(void (*ptask)())
{  
   (*ptask)();  
}

main.c
#include "os_cfg.h"  
#define TASK_DELAY0 TIME_PER_SEC/1      //任务执行频度为1Hz
#define TASK_DELAY1 TIME_PER_SEC/2      //任务执行频度为2Hz
#define TASK_DELAY2 TIME_PER_SEC/10      //任务执行频度为10Hz
#define TASK_DELAY3 TIME_PER_SEC/20     //任务执行频度为20Hz
void (* code task[])() = {task0,task1,task2,task3};  //获得任务PC指针

sbit LED0 = P1^0;  //演示用 LED接口定义
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;

/*main主函数*/
void main(void)
{
    unsigned char i;   
    os_timer0_init();   //节拍发生器定时器初始化
    EA = 1;       //开总中断
   
   while(1)
   {
     for(i=0;i<MAX_TASK;i++)  
   if (task_delay==0) {run(task); break;}  //就绪任务调度
   }  //上一行 break有特殊作用,详细解释见后文
}

void task0(void)  //任务 0
{   
    LED0 = !LED0;   
task_delay[0] = TASK_DELAY0;
}

void task1(void)  //任务 1
{   
    LED1 = !LED1;   
task_delay[1] = TASK_DELAY1;
}

void task2(void)  //任务 2
{   
    LED2 = !LED2;   
task_delay[2] = TASK_DELAY2;
}

void task3(void)  //任务内分段设计  
{   
      static unsigned char state=0;  //定义静态局部变量
switch (state)
{
  case 0:
   LED3 = !LED3;   
   state = 1;
   task_delay[3] = TASK_DELAY3;
   break;

case 1:
   LED3 = !LED3;   
   state = 2;
   task_delay[3] = TASK_DELAY3*2;
   break;

case 2:
   LED3 = !LED3;   
   state = 0;
   task_delay[3] = TASK_DELAY3*4;
   break;

default:
   state = 0;
   task_delay[3] = TASK_DELAY3;
   break;
}  
}

时间: 2024-11-26 01:28:15

关于Easy51RTOS的相关文章

Easy51RTOS入门级初略分析

1 main.c 2 3 #include "reg51.h" 4 #include "os_cfg.h" 5 #define TASK_DELAY0 TIME_PER_SEC/1 //任务执行频度为1Hz 6 #define TASK_DELAY1 TIME_PER_SEC/2 //任务执行频度为2Hz 7 #define TASK_DELAY2 TIME_PER_SEC/10 //任务执行频度为10Hz 8 #define TASK_DELAY3 TIME_PE

STC8

一 时钟: IRC:24MHZ;LSI:32.768KHZ;HSE:4~33MHZ,外设可分频 二 2种低功耗模式: IDLE:[email protected],外设可唤醒. STOP: 三:ISP下载更新模式:无需专用仿真器 四:C51开发模式: 众多的寄存器:IO设置/中断设置/外设,引脚分时复用功能选择的功能切换寄存器. 五:串口的4个模式: 模式0:同步移位模式,TXD:为同步时钟:RXD为DATA_IO 模式1:8为可变波特率,常用模式,需要定时器提供波特率 模式2:9位固定波特率