?? sch.c
字號:
/*------------------------------------------------------------------*-
版權說明:
1、此程序應稱作“時間觸發多任務調度器”。
2、程序摘自《時間觸發嵌入式系統設計模式
使用8051系統微控制器開發可靠應用》。
在本站好書推薦中有對此書的說明。
3、原作者在書中對版權進行了說明:
只要購買了本書就可以使用書中源程序。
4、在項目中多次用到此程序,感覺很不錯。
此處提供的調度器程序是我簡化過的。
移植說明:
1、代碼全部用標準C語言編寫,可以方便的插
入到項目中。
2、內核唯一需要硬件支持的是定時器,需要開
一個定時器,為內核提供調度周期信號。
-*------------------------------------------------------------------*/
#include "AFA.h"
s_task SCH_task_array[SCH_MAX_TASKS]; /*定義任務隊列*/
/*------------------------------------------------------------------*-
SCH_Init_Time()
調度器初始化
1、準備調度器數據結構并且設置定時器以所需的
頻率中斷。
2、必須在使用調度器之前調用這個函數。
-*------------------------------------------------------------------*/
void SCH_Init_Time(void)
{
for (uchar i=0; i< SCH_MAX_TASKS; i++)/*清空任務隊列*/ //sch_max_tasks=6;
{
SCH_Delete_Task(i);
}
OCR1A = 1250; /*計數周期為10mS,F=1M*/
TIMSK1 = 0x02; /*比較中斷A允許 */
SREG = 0x80;
TCCR1A = 0x00;
TCCR1B = 0x08; /*運行于CTC模式*/
TCCR1B |= 0x02; /*設置8分頻*/
}
/*------------------------------------------------------------------*-
SCH_Start()
啟動調度器
1、啟動調度器,也就允許調度器運行。
2、主要是允許中,因為任務狀態是在中斷中
刷新的。
-*------------------------------------------------------------------*/
void SCH_Start(void)
{
SEI(); /*開全局中斷*/
}
/*------------------------------------------------------------------*-
SCH_Add_Task()
任務添加
1、將任務添加到任務隊列中,并設置執行條件。
2、任務添加成功將返回,任務被添加的位置。
3、任務添加失敗將返回0。
4、變量說明:
pFunction 函數指針,指向要添加的函數。
delay 任務運行等待時間。
period 任務運行周期時間,此處用于需要
周期性運行的任務。
如只要運行一次,則此值應為0
-*------------------------------------------------------------------*/
uchar SCH_Add_Task(void (* pFunction)(), uint delay, uint period)
{
static uchar k=0;
while((SCH_task_array[k].task != 0) && (k < SCH_MAX_TASKS)) //指針為0就表示沒有任務,則加載
{ // 不為0時就已有, 則退出
k++;
}
if (k == SCH_MAX_TASKS)/*檢查任務隊列溢出*/
return 0; /*溢出處理*/
SCH_task_array[k].task = pFunction; /*加載任務*/
SCH_task_array[k].delay = delay; /*任務運行等待時間*/
SCH_task_array[k].period = period; /*任務運行周期時間,此處用于需要
周期性運行的任務。
如只要運行一次,則此值應為0
*/
SCH_task_array[k].run = 0x00; /*停止執行*/
return k; /*返回任務ID號*/
}
/*------------------------------------------------------------------*-
SCH_Update()
任務刷新
1、定時器T1,A組比較中斷。 10ms中斷一次
2、對任務定時時間進行刷新。
3、任務定時時間到,設置任務運行標志。
-*------------------------------------------------------------------*/
#pragma vector=TIMER1_OVF_vect
__interrupt void SCH_Update(void)
{
for(static uchar i=0; i<SCH_MAX_TASKS; i++)
{
if (SCH_task_array[i].task) /*檢測任務是否存在*/
{
if(SCH_task_array[i].delay == 0) /*任務時間是否到*/
{
SCH_task_array[i].run ++; /*設置運行標志 */
if(SCH_task_array[i].period) /*是否為循環任務*/
{
SCH_task_array[i].delay = SCH_task_array[i].period;/*重載任務定時器*/
}
}
else
{
SCH_task_array[i].delay --;/*刷新任務等待時間*/
}
}
}
}
/*------------------------------------------------------------------*-
SCH_Dispatch_Tasks()
任務調度
1、調度程序,當任務需要運行時,由本程序調用。
2、這個函數必須重復運行。
-*------------------------------------------------------------------*/
void SCH_Dispatch_Tasks(void)
{
for( static uchar j=0; j<SCH_MAX_TASKS; j++) /*查詢任務隊列*/
{
if (SCH_task_array[j].run > 0) /*運行任務*/
{
(*SCH_task_array[j].task)();
SCH_task_array[j].run --; /*運行標志自減*/
if (SCH_task_array[j].period == 0) /*刪除單周期任務*/
{
SCH_Delete_Task(j);
}
}
}
}
/*------------------------------------------------------------------*-
SCH_Delete_Task()
任務刪除
1、刪除指定任務。
2、要刪除任務的ID,此ID在任務添加時給出。
-*------------------------------------------------------------------*/
void SCH_Delete_Task(uchar task_id)/*清除任務*/
{
SCH_task_array[task_id].task = 0x00;
SCH_task_array[task_id].delay = 0x00;
SCH_task_array[task_id].period = 0x00;
SCH_task_array[task_id].run = 0x00;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -