一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 10423|回复: 34
收起左侧

[其他综合] 小小调度器-C语言通用

[复制链接]
发表于 2014-8-25 09:01 | 显示全部楼层 |阅读模式
本帖最后由 smsetyl 于 2014-8-25 09:05 编辑

#include <stc89c51.h>
/****小小调度器开始**********************************************/
#define MAXTASKS 3
volatile unsigned char timers[MAXTASKS];
#define _SS static unsigned char _lc=0; switch(_lc){default:
#define _EE ;}; _lc=0; return 255;
#define WaitX(tickets)  do {_lc=(__LINE__%255)+1; return tickets ;} while(0); case (__LINE__%255)+1:

#define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); }  while(0);
#define RunTaskA(TaskName,TaskID) { if (timers[TaskID]==0) {timers[TaskID]=TaskName(); continue;} }   //前面的任务优先保证执行

#define CallSub(SubTaskName) do {unsigned char currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1:  currdt=SubTaskName(); if(currdt!=255) return currdt;} while(0);
#define InitTasks() {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; }
#define UpdateTimers() {unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=255)) timers[i-1]--;}}

#define SEM unsigned int
//初始化信号量
#define InitSem(sem) sem=0;
//等待信号量
#define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
//等待信号量或定时器溢出, 定时器tickets 最大为0xFFFE
#define WaitSemX(sem,tickets)  do { sem=tickets+1; WaitX(0); if(sem>1){ sem--;  return 1;} } while(0);
//发送信号量
#define SendSem(sem)  do {sem=0;} while(0);

/*****小小调度器结束*******************************************************/


sbit LED1 = P2^1;
sbit LED2 = P2^2;

sbit LED0 = P2^5;

unsigned char task0(){
_SS
  while(1){
   WaitX(50);
   LED0=!LED0;   
  }
_EE
}

unsigned char  task1(){
_SS
  while(1){
   WaitX(100);
   LED1=!LED1;   
  }
_EE
}

unsigned char  task2(){
_SS
  while(1){
   WaitX(100);
   LED2=!LED2;   
  }
_EE
}

void InitT0()
{
        TMOD = 0x21;
        IE |= 0x82;  // 12t
        TL0=0Xff;
        TH0=0XDB;
        TR0 = 1;
}

void INTT0(void) interrupt 1 using 1
{
    TL0=0Xff;    //10ms 重装
    TH0=0XDB;//b7;   

    UpdateTimers();

    RunTask(task0,0);//任务0具有精确按时获得执行的权限,要求:task0每次执行消耗时间<0.5个 ticket
}




void main()
{
        InitT0();
        InitTasks(); //初始化任务,实际上是给timers清零
        while(1){
//           RunTask(task0,0);
                RunTaskA(task1,1);//任务1具有比任务2高的运行权限                  
           RunTaskA(task2,2);//任务2具有低的运行权限                  
      }
}


评分

参与人数 3一乐金币 +48 收起 理由
gaojxp + 20 希望大家都能用起来
gw168sh + 20 最精简的操作系统
huchuan987 + 8 很给力!

查看全部评分

发表于 2014-8-25 10:36 | 显示全部楼层
用在什么上啊
发表于 2014-8-25 13:28 | 显示全部楼层
完全能看懂。不过还是推荐LZ直接用51rtx tiny系统算了
发表于 2014-8-25 15:40 | 显示全部楼层
是阿莫论坛里的 smset 吧,在那里看到的“ 再出个调度器,极小资源单片机值得一用”
 楼主| 发表于 2014-8-25 16:10 | 显示全部楼层
本帖最后由 smsetyl 于 2014-8-25 16:15 编辑

是的。  但amobbs那边我的帐号现在已经登陆不上了,所以不再更新了。
 楼主| 发表于 2014-8-25 16:11 | 显示全部楼层
384065902 发表于 2014-8-25 13:28
完全能看懂。不过还是推荐LZ直接用51rtx tiny系统算了

谢谢,不过小小调度器不只是能用与51上,几乎所有单片机都能用。
 楼主| 发表于 2014-8-25 16:12 | 显示全部楼层

用在单片机编程上。替代状态机,实现多任务。
发表于 2014-8-25 23:14 | 显示全部楼层
amo那边你被封了?不会吧
发表于 2014-8-26 08:36 | 显示全部楼层
那边的人还在等你写教程呢
发表于 2014-8-26 08:40 | 显示全部楼层
楼主能发个文本吗?
网页上有乱码

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-20 09:38 , Processed in 0.064889 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表