欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
適合51單片機(jī)跑的極小任務(wù)調(diào)度器
[打印本頁(yè)]
作者:
李牧林
時(shí)間:
2019-9-14 16:39
標(biāo)題:
適合51單片機(jī)跑的極小任務(wù)調(diào)度器
這個(gè)是阿莫論壇看到的,原作者在阿莫論壇的網(wǎng)名為
smset。
要注意以下三個(gè)問(wèn)題:
1) 任務(wù)函數(shù)內(nèi)部變量,建議都用靜態(tài)局部變量來(lái)定義。
2) 任務(wù)函數(shù)內(nèi)不能用switch語(yǔ)句。
3) 任務(wù)函數(shù)內(nèi),不能用return語(yǔ)句。 因?yàn)閞eturn已經(jīng)被賦予任務(wù)延時(shí)的特定意義。(這是返回型任務(wù)函數(shù)版本的一個(gè)強(qiáng)制要求)
有了以上三個(gè)要求,所以這個(gè)調(diào)度器并不是完美的,根據(jù)場(chǎng)合決定是否使用吧。
#include <stc89c51.h>
/****小小調(diào)度器開(kāi)始**********************************************/
//內(nèi)部不能使用switch函數(shù)!
#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;} } //前面的任務(wù)優(yōu)先保證執(zhí)行
#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-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
//初始化信號(hào)量
#define InitSem(sem) sem=0;
//等待信號(hào)量
#define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
//等待信號(hào)量或定時(shí)器溢出, 定時(shí)器tickets 最大為0xFFFE
#define WaitSemX(sem,tickets) do { sem=tickets+1; WaitX(0); if(sem>1){ sem--; return 1;} } while(0);
//發(fā)送信號(hào)量
#define SendSem(sem) do {sem=0;} while(0);
/*****小小調(diào)度器結(jié)束*******************************************************/
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);//任務(wù)0具有精確按時(shí)獲得執(zhí)行的權(quán)限,要求:task0每次執(zhí)行消耗時(shí)間<0.5個(gè) ticket
}
void main()
{
InitT0();
InitTasks(); //初始化任務(wù),實(shí)際上是給timers清零
while(1){
// RunTask(task0,0);
RunTaskA(task1,1);//任務(wù)1具有比任務(wù)2高的運(yùn)行權(quán)限
RunTaskA(task2,2);//任務(wù)2具有低的運(yùn)行權(quán)限
}
}
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1