标题:
单片机小小调度器源程序 操作系统相关
[打印本页]
作者:
年华七堇1
时间:
2019-5-11 08:45
标题:
单片机小小调度器源程序 操作系统相关
一个简易的调度器
0.png
(7.51 KB, 下载次数: 76)
下载附件
2019-5-17 06:24 上传
单片机源程序如下:
#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__+((__LINE__%256)==0))%256; return tickets ;} while(0); case (__LINE__+((__LINE__%256)==0))%256:
#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__+((__LINE__%256)==0))%256; return 0; case (__LINE__+((__LINE__%256)==0))%256:??currdt=SubTaskName(); if(currdt!=255) return currdt;} while(0);
#define InitTasks() {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i]=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具有低的运行权限
}
}
复制代码
所有资料51hei提供下载:
小小调度器.zip
(11.96 KB, 下载次数: 40)
2019-5-11 08:44 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
51hei团团
时间:
2019-5-17 06:25
好资料,51黑有你更精彩!!!
作者:
mmlyy2001
时间:
2022-12-7 14:21
编译后出现test.c(99): warning C294: unreachable code。这个怎么消除呢?
作者:
_风云无忌_
时间:
2022-12-7 19:38
楼主棒棒的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1