《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 混合式調(diào)度器C51源代碼及相關(guān)注釋
混合式調(diào)度器C51源代碼及相關(guān)注釋
摘要: 這是調(diào)度器的中斷服務(wù)程序,初始化函數(shù)中的定時器設(shè)置決定了它的調(diào)度頻率,這個版本的調(diào)度器由定時器2觸發(fā)中斷,定時器自動重裝。
Abstract:
Key words :

/*==============================================================

1ms時標(biāo) 混合式調(diào)度器(一個搶占式任務(wù),多個合作式任務(wù))

===============================================================*/

#include

#define uchar unsigned char

#define ushort unsigned short

#define SCH_MAX_TASKS 9

#define ERROR_SCH_TOO_MANY_TASKS 9

#define ERROR_SCH_CANOT_DELETE_TASK 0

#define RETURN_ERROR 0

#define RETURN_NORMAL 1

 

#define INTERRPT_Timer_2_Overflow 5

 

#define SCH_REPORT_ERRORS

#ifdef SCH_REPORT_ERRORS

#define Error_Port P1

#endif

 

typedef data struct

{

void (code *pTask)(void);

ushort Delay;

ushort Period;

ushort RunMe;

uchar Co_op;//如果任務(wù)是合作式的,設(shè)置為1,如果任務(wù)是搶占式的,設(shè)置為0

}sTask;

sTask SCH_tasks_G[SCH_MAX_TASKS];

 

void SCH_Init_T2(void);

uchar SCH_Add_Task(void (code * pFunction)(),const ushort Delay, ushort PERIOD);

// 函數(shù)名指針 延時的時標(biāo)數(shù) 執(zhí)行任務(wù)的時間間隔

// 為0則立即執(zhí)行 如果為0,表示單次任務(wù)

void SCH_Dispatch_Tasks(void);

void SCH_Start(void);

bit SCH_Delete_Task(const ushort TASK_INDEX);

void SCH_Go_To_Sleep(void);

void SCH_Report_Status(void);//報告系統(tǒng)狀況

void LED_Flash_Init(void);

void LED_Flash_Update_A(void);

void LED_Flash_Update_B(void);

void LED_Flash_Update_C(void);

void LED_Flash_Update_D(void);

void LED_Flash_Update_E(void);

void LED_Flash_Update_F(void);

void LED_Flash_Update_G(void);

void LED_Flash_Update_H(void);

 

uchar Error_code_G = 0;//

static ushort Error_tick_count_G;//記住自從上一次紀(jì)錄錯誤以來的時間

static uchar Last_error_code_G;//上次的錯誤代碼(在1分鐘之后復(fù)位)

 

uchar LED_State_G_A = 0;

uchar LED_State_G_B = 0;

uchar LED_State_G_C = 0;

uchar LED_State_G_D = 0;

uchar LED_State_G_E = 0;

uchar LED_State_G_F = 0;

uchar LED_State_G_G = 0;

uchar LED_State_G_H = 0;

 

sbit LED_pin_A = P1^0;

sbit LED_pin_B = P1^1;

sbit LED_pin_C = P1^2;

sbit LED_pin_D = P1^3;

sbit LED_pin_E = P1^4;

sbit LED_pin_F = P1^5;

sbit LED_pin_G = P1^6;

sbit LED_pin_H = P1^7;

 

//Error_code_G = ERROR_SCH_TOO_MANY_TASKS;

//Error_code_G = ERROR_SCH_WAITING_FOR_SLAVE_TO_ACK;

//Error_code_G = ERROR_SCH_WAITING_FOR_START_COMAND_FROM_MASTER;

//Error_code_G = ERROR_SCH_ONE_OR_MORE_SLAVES_DID_NOT_START;

//Error_code_G = ERROR_SCH_LOST_SLAVE;

//Error_code_G = ERROR_SCH_CAN_BUS_ERROR;

//Error_code_G = ERROR_I2C_WRITE_BYTE_AT24C64;

 

void main(void)

{

SCH_Init_T2();

LED_Flash_Init();

SCH_Add_Task(LED_Flash_Update_A,0,1000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_B,0,2000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_C,0,3000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_D,0,4000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_E,0,5000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_F,0,6000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_G,0,7000);//添加一個任務(wù)

SCH_Add_Task(LED_Flash_Update_H,0,8000);//添加一個任務(wù)

 

SCH_Start();//開全局中斷

while(1)

{

SCH_Dispatch_Tasks();

}

}

/*------------------------------------------------------------

這是調(diào)度器的中斷服務(wù)程序,初始化函數(shù)中的定時器設(shè)置決定了它

的調(diào)度頻率,這個版本的調(diào)度器由定時器2觸發(fā)中斷,定時器自動重裝。

-------------------------------------------------------------*/

void SCH_Update(void) interrupt INTERRPT_Timer_2_Overflow

{

//刷新任務(wù)隊列

uchar Index;

TF2 = 0;//必須手工清除

//注意:計算單位為時標(biāo)(不是毫秒)

for(Index = 0;Index < SCH_MAX_TASKS;Index++)

{ //檢測這里是否有任務(wù)

if(SCH_tasks_G[Index].pTask)

{

if(SCH_tasks_G[Index].Delay == 0)

{

//任務(wù)需要運(yùn)行,間隔的時間已經(jīng)到了

if(SCH_tasks_G[Index].Co_op)

{

//如果是合作式任務(wù),RunMe標(biāo)志加1

SCH_tasks_G[Index].RunMe += 1;//要執(zhí)行任務(wù)的標(biāo)志加1

}

else//如果它是搶占式任務(wù),立即運(yùn)行它

{

(*SCH_tasks_G[Index].pTask)();//運(yùn)行任務(wù)

SCH_tasks_G[Index].RunMe -= 1;

//周期性的任務(wù)將自動再次運(yùn)行,單次任務(wù)就刪除

if(SCH_tasks_G[Index].Period == 0)

{

SCH_tasks_G[Index].pTask = 0;

}

}

if(SCH_tasks_G[Index].Period)//時標(biāo)間隔不等于0

{

//調(diào)度周期性的任務(wù)再次運(yùn)行,每隔這個固定的時標(biāo)長度執(zhí)行一次任務(wù)

SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;

}

}

else //任務(wù)有延遲執(zhí)行要求,還沒到達(dá)延遲的時間

{

//還沒有準(zhǔn)備好運(yùn)行,延遲減1

SCH_tasks_G[Index].Delay -= 1;

}

}

}

}

 

void SCH_Init_T2(void)

{

uchar i;

for(i=0;i {

SCH_Delete_Task(i);

}

Error_code_G = 0;

T2CON = 0x04;

TMOD = 0x00;

TH2 = 0xfc;

RCAP2H = 0xfc;

TL2 = 0x18;

RCAP2L = 0x18;

ET2 = 1;

TR2 = 1;

}

/*----------------------------------------------------------------------------

任務(wù)函數(shù)每隔一定時間間隔或在用戶定義的延遲之后運(yùn)行

pFunction -- 將被調(diào)用的函數(shù)名稱。注意:被調(diào)函數(shù)必須是“void void”型

DELAY -- 在任務(wù)第一次被執(zhí)行之前的間隔

PERIOD -- 如果它為0,則只調(diào)用該函數(shù)一次,由DELAY確定其調(diào)用的時間

如果非0,那么它就是被重復(fù)調(diào)用的時間間隔

Co_op -- 如果是合作式任務(wù)則設(shè)置為1,如果是搶占式任務(wù)則設(shè)置為0.

 

注意:如果以后要刪除任務(wù),將需要返回值

例子:

Task_ID = SCH_Add_Task(Do_X,1000,0,0);

使函數(shù)Do_X()在1000個調(diào)度器時標(biāo)之后運(yùn)行一次(搶占式任務(wù))

Task_ID = SCH_Add_Task(Do_X,0,1000,1);

使函數(shù)Do_X()每隔1000個調(diào)度器時標(biāo)運(yùn)行一次(合作式任務(wù))

Task_ID = SCH_Add_Task(Do_X,300,1000,0);

使函數(shù)Do_X()每隔1000個調(diào)度器時標(biāo)運(yùn)行一次,任務(wù)首先在T=300個時標(biāo)時被執(zhí)行

然后是1300個時標(biāo).........(搶占式任務(wù))

 

-----------------------------------------------------------------------------*/

uchar SCH_Add_Task(void (code * pFunction)(),const ushort DELAY, ushort PERIOD,bit Co_op)

{

uchar Index = 0;

//首先在隊列中找到一個空隙(如果有的話,否則就不添加新任務(wù))

while((SCH_tasks_G[Index].pTask != 0)&&(Index < SCH_MAX_TASKS))

{

Index++;//當(dāng)一個新任務(wù)被添加,且沒有超過任務(wù)上限

}

//是否達(dá)到任務(wù)隊列的結(jié)尾?

if(Index == SCH_MAX_TASKS)//任務(wù)數(shù)量達(dá)到上限

{

Error_code_G = ERROR_SCH_TOO_MANY_TASKS;

return SCH_MAX_TASKS;//直接返回,不添加這個新任務(wù)

}

//如果能運(yùn)行到這里,說明任務(wù)隊列中有空隙,添加任務(wù)。

SCH_tasks_G[Index].pTask = pFunction;

SCH_tasks_G[Index].Delay = DELAY;

SCH_tasks_G[Index].Period = PERIOD;

SCH_tasks_G[Index].Co_op = Co_op;

SCH_tasks_G[Index].RunMe = 0;

return Index;//返回任務(wù)的位置(以便以后刪除)

}

 

void SCH_Dispatch_Tasks(void)

{

uchar Index;

//調(diào)度(運(yùn)行)下一個任務(wù)(如果有任務(wù)就緒)

for(Index = 0;Index < SCH_MAX_TASKS;Index++)

{

//只調(diào)度合作式任務(wù)

if((SCH_tasks_G[Index].RunMe > 0)&&(SCH_tasks_G[Index].Co_op))

{

(*SCH_tasks_G[Index].pTask)();//執(zhí)行任務(wù)

SCH_tasks_G[Index].RunMe -= 1;//清除任務(wù)需要執(zhí)行的標(biāo)志

}

//如果這是個“單次”任務(wù),將它從隊列中刪除

if(SCH_tasks_G[Index].Period == 0)

{

SCH_tasks_G[Index].pTask = 0;// 比通過調(diào)用來刪除任務(wù)更快SCH_Delete_Task(Index);

}

}

SCH_Report_Status();//報告系統(tǒng)狀況

SCH_Go_To_Sleep();

}

 

void SCH_Start(void)

{

EA = 1;

}

 

bit SCH_Delete_Task(const ushort TASK_INDEX)

{

bit Return_code;

if(SCH_tasks_G[TASK_INDEX].pTask == 0)

{

//這里沒有任務(wù)。。。設(shè)置全局錯誤變量

Error_code_G = ERROR_SCH_CANOT_DELETE_TASK;

Return_code = RETURN_ERROR;//返回錯誤代碼

}

else

{

Return_code = RETURN_NORMAL;

}

//刪除任務(wù)

SCH_tasks_G[TASK_INDEX].pTask = 0x0000;

SCH_tasks_G[TASK_INDEX].Delay = 0;

SCH_tasks_G[TASK_INDEX].Period = 0;

SCH_tasks_G[TASK_INDEX].RunMe = 0;

return Return_code;

}

 

void SCH_Go_To_Sleep()

{

PCON |= 0x01;//進(jìn)入休眠模式

}

 

void SCH_Report_Status(void)

{

/* #ifdef SCH_REPORT_ERRORS

if(Error_code_G != Last_error_code_G)

{

Error_Port = 255 - Error_code_G;

Last_error_code_G = Error_code_G;

if(Error_code_G != 0)

{

Error_tick_count_G = 60000;

}

else

{

Error_tick_count_G = 0;

}

}

else

{

if(Error_tick_count_G != 0)

{

if(--Error_count_G == 0)

{

Error_code_G = 0;

}

}

}

#endif */

}

 

void LED_Flash_Update_A(void)

{

if(LED_State_G_A == 1)

{

LED_State_G_A = 0;

LED_pin_A = 0;

}

else

{

LED_State_G_A = 1;

LED_pin_A = 1;

}

}

 

void LED_Flash_Update_B(void)

{

if(LED_State_G_B == 1)

{

LED_State_G_B = 0;

LED_pin_B = 0;

}

else

 

{

LED_State_G_B = 1;

LED_pin_B = 1;

}

}

 

 

 

void LED_Flash_Update_C(void)

{

if(LED_State_G_C == 1)

{

LED_State_G_C = 0;

LED_pin_C = 0;

}

else

{

LED_State_G_C = 1;

LED_pin_C = 1;

}

}

void LED_Flash_Update_D(void)

{

if(LED_State_G_D == 1)

{

LED_State_G_D = 0;

LED_pin_D = 0;

}

else

{

LED_State_G_D = 1;

LED_pin_D = 1;

}

}

void LED_Flash_Update_E(void)

{

if(LED_State_G_E == 1)

{

LED_State_G_E = 0;

LED_pin_E = 0;

}

else

{

LED_State_G_E = 1;

LED_pin_E = 1;

}

}

void LED_Flash_Update_F(void)

{

if(LED_State_G_F == 1)

{

LED_State_G_F = 0;

LED_pin_F = 0;

}

else

{

LED_State_G_F = 1;

LED_pin_F = 1;

}

}

void LED_Flash_Update_G(void)

{

if(LED_State_G_G == 1)

{

LED_State_G_G = 0;

LED_pin_G = 0;

}

else

{

LED_State_G_G = 1;

LED_pin_G = 1;

}

}

void LED_Flash_Update_H(void)

{

if(LED_State_G_H == 1)

{

LED_State_G_H = 0;

LED_pin_H = 0;

}

else

{

LED_State_G_H = 1;

LED_pin_H = 1;

}

}

 

void LED_Flash_Init(void)

{

LED_State_G_A= 0;//初始化LED狀態(tài)

LED_State_G_B= 0;//初始化LED狀態(tài)

LED_State_G_C= 0;//初始化LED狀態(tài)

}

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久亚洲电影| 91久久精品国产| 久久久久久久波多野高潮日日| 亚洲一区二区在线免费观看视频| 国产精品久久久久aaaa九色| 欧美一区二区三区在线看| 午夜亚洲激情| 影音先锋另类| 欧美激情1区| 亚洲一区二区三区高清不卡| 亚洲欧美久久久| 国产综合色产在线精品| 欧美成人首页| 亚洲一区二区在线视频| 99国产精品久久久| 亚洲网站在线看| 韩国精品久久久999| 欧美日韩第一区| 性欧美1819sex性高清| 亚洲第一综合天堂另类专| 亚洲精品在线免费观看视频| 国产精品国产精品| 国产精品久线观看视频| 久久综合九色欧美综合狠狠| 在线亚洲欧美视频| 欧美一区二区三区免费看| 亚洲国产欧美日韩精品| 国产精品看片资源| 国产精品免费一区豆花| 国产精品欧美日韩| 国产人成精品一区二区三| 欧美久久久久中文字幕| 欧美在线视频导航| 夜夜嗨av一区二区三区| 性欧美超级视频| 日韩写真视频在线观看| 国内精品久久久久久久影视麻豆| 国产一区二区久久| 欧美视频久久| 欧美成人精品一区| 欧美精品久久99| 久久夜色精品国产| 蜜臀av一级做a爰片久久| 欧美夜福利tv在线| 欧美一区永久视频免费观看| 久久久久久久久久久一区| 久久资源av| 欧美精品v日韩精品v韩国精品v| 欧美激情一区二区三区全黄 | 久久综合激情| 欧美另类人妖| 国产精品一区二区三区四区 | 久久精品30| 亚洲伊人伊色伊影伊综合网| 亚洲国产一成人久久精品| 亚洲精品在线免费| 亚洲欧美日韩综合| 亚洲激情影视| 亚洲午夜91| 一本色道久久88精品综合| 亚洲在线中文字幕| 久久精品一区二区三区四区| 亚洲欧美中文日韩在线| 亚洲精品美女免费| 亚洲大片在线| 午夜免费电影一区在线观看| 亚洲高清资源综合久久精品| 亚洲视频在线观看三级| 久久国产毛片| 欧美一区二区在线看| 久久综合给合| 国产精品国产三级国产aⅴ入口| 国产中文一区二区三区| av成人手机在线| 99国产一区二区三精品乱码| 欧美一级二区| 在线视频欧美日韩精品| 亚洲无线视频| 久久综合久久美利坚合众国| 国产精品v一区二区三区| 欧美性色综合| 伊人久久综合97精品| 亚洲自拍电影| 中文一区在线| 免费观看不卡av| 国产精品一二一区| 国产日韩欧美不卡在线| 亚洲免费观看高清在线观看 | 午夜精品一区二区三区电影天堂 | 久久国产精品一区二区三区四区| 欧美日本三级| 欲色影视综合吧| 午夜在线观看欧美| 亚洲自拍偷拍福利| 亚洲自拍三区| 欧美激情一区二区三区全黄| 韩国视频理论视频久久| 亚洲直播在线一区| 制服丝袜激情欧洲亚洲| 欧美电影免费| 亚洲福利视频在线| 亚洲美女中出| 亚洲欧洲日产国产网站| 久久久精品五月天| 国产日产欧美精品| 亚洲午夜激情网站| 亚洲午夜国产成人av电影男同| 欧美成人蜜桃| 在线观看国产欧美| 久久精品一区中文字幕| 性18欧美另类| 国产精品欧美经典| 一本色道久久综合| 一区二区欧美日韩视频| 欧美日韩国产大片| 伊人天天综合| 亚洲国产一区二区三区a毛片| 日韩视频一区二区三区在线播放| 久热精品视频| 黑人一区二区| 久久精品亚洲精品国产欧美kt∨| 久久大逼视频| 国产日韩欧美一区二区三区四区| 影音先锋久久久| 亚洲电影在线免费观看| 久久嫩草精品久久久精品一| 国产亚洲精品aa午夜观看| 亚洲欧美另类中文字幕| 亚洲男人天堂2024| 国产精品成人v| 一区二区三区鲁丝不卡| 久久国产99| 9i看片成人免费高清| 欧美丰满高潮xxxx喷水动漫| 亚洲黄色影院| 亚洲天堂av在线免费观看| 欧美亚一区二区| 亚洲一区二区视频| 久久不射网站| 国产综合欧美| 91久久线看在观草草青青| 欧美大片在线观看一区二区| 最新亚洲视频| 性一交一乱一区二区洋洋av| 欧美自拍丝袜亚洲| 国产一区在线播放| 亚洲国产精品一区二区第四页av| 免费欧美在线| 国产欧美日本| 欧美一区二区三区久久精品茉莉花 | 亚洲私人影院在线观看| 欧美系列精品| 亚洲欧美日韩中文播放| 久久综合色播五月| 亚洲精品自在久久| 午夜精品一区二区三区四区| 国产亚洲在线| 亚洲精品在线一区二区| 性欧美8khd高清极品| 国产一区二区三区无遮挡| 亚洲国产激情| 欧美日韩国产bt| 亚洲一区二区三区成人在线视频精品| 久久av一区二区| 在线看日韩av| 欧美一区二区在线| 免费久久99精品国产| 亚洲美女少妇无套啪啪呻吟| 亚洲欧美一区二区激情| 在线播放一区| 亚洲一区二区三区午夜| 国产自产2019最新不卡| 一级成人国产| 国产一区视频在线观看免费| 日韩一区二区精品葵司在线| 国产精品久久久久高潮| 亚洲福利在线观看| 欧美日韩中文另类| 亚洲精品乱码久久久久久蜜桃91| 亚洲在线观看免费| 伊人久久大香线| 久久成人免费网| 欧美激情一区二区在线 | 欧美一区精品| 欧美日韩中文字幕| 亚洲第一在线综合在线| 国产精品国产自产拍高清av| 亚洲国产一成人久久精品| 国产精品久久久久久久电影| 亚洲黄色小视频| 国产精品热久久久久夜色精品三区 | 1000部精品久久久久久久久| 亚洲免费网址| 最新亚洲一区| 老司机67194精品线观看| 亚洲一区二区三区午夜| 欧美精品v日韩精品v国产精品| 欧美一区二区三区的| 欧美新色视频| 亚洲毛片在线观看|