?? os_core.c
字號:
*
* 輸入參數 : 無
*
* 返回值 : 無
*
* 注釋 : OSStartHighRdy() 必須是:
* a) 調用 OSTaskSwHook() ,
* b) 設定 OSRunning 為真
* c) 裝載由 OSTCBHighRdy 指向的任務寄存器的內容
* d)執行任務
*********************************************************************************************************
*/
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE)
{
y = OSUnMapTbl[OSRdyGrp]; /* 尋找最高優先級任務的優先級別 */
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* 指向最高優先級的任務準備運行 */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* 執行啟動任務的指定代碼 */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 統計初始化
*
* 函數描述: 該函數由應用程序調用,通過首先確定32位計數器在1秒內如果沒有其他任務運行,它的使用率為多高來
* 建立CPU的使用率。 之后,CPU 使用率由一個較低的任務決定, 該任務每秒跟蹤這個32位計數器,當有其
* 他任務運行時除外,CPU 的使用率由下面的公式決定
*
* OSIdleCtr
* CPU Usage (%) = 100 * (1 - ------------)
* OSIdleCtrMax
*
* 輸入參數 : 無
*
* 返回值 : 無
*********************************************************************************************************
*/
#if OS_TASK_STAT_EN > 0
void OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
OSTimeDly(2); /* 和時鐘節拍同步 */
OS_ENTER_CRITICAL();
OSIdleCtr = 0L; /* 清零空閑計數器 */
OS_EXIT_CRITICAL();
OSTimeDly(OS_TICKS_PER_SEC); /* 確定1秒內最大空閑計數器的值 */
OS_ENTER_CRITICAL();
OSIdleCtrMax = OSIdleCtr; /* 存儲1秒內的最在空閑計數器的值 */
OSStatRdy = TRUE;
OS_EXIT_CRITICAL();
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 處理系統節拍
*
* 函數描述: 該函數用于用信號通知 uC/OS-II 系統節拍的產生(也稱為時鐘節拍)。該函數應被節拍式的中斷服務子程序
* 調用,也能被高優先級任務調用。
*
* 輸入參數 : 無
*
* 返回值 : 無
*********************************************************************************************************
*/
void OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
OSTimeTickHook(); /* 調用用戶定義的鉤子函數 */
#if OS_TIME_GET_SET_EN > 0
OS_ENTER_CRITICAL(); /* 更新32位節拍計數器 */
OSTime++;
OS_EXIT_CRITICAL();
#endif
if (OSRunning == TRUE)
{
ptcb = OSTCBList; /* 指向第一個任務控制塊*/
while (ptcb->OSTCBPrio != OS_IDLE_PRIO) /* 作完所有的任務控制塊*/
{
OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0)
{ /* 用延時等待事件 */
if (--ptcb->OSTCBDly == 0) /* 減少節拍計數到延時結束 */
{
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) /* 任務掛起了嗎? */
{
OSRdyGrp |= ptcb->OSTCBBitY; /* 沒有,Make task R-to-R (timed out)*/
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
}
else
{ /* 對, 剩下1個節拍保護 ... */
ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
} /* ... 掛起被清除 */
}
}
ptcb = ptcb->OSTCBNext; /* 指向任務控制塊列表中的下一個任務控制塊 */
OS_EXIT_CRITICAL();
}
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 得到版本號
*
* 函數描述: 本函數用于返回 uC/OS-II的版本號. 返回值對應著的uC/OS-II的乘以100的版本號。
* 換句話說,版本號為2.00的返回值為200。
*
* 輸入參數 : 無
*
* 返回值 : uC/OS-II 的版本號乘以100的值
*********************************************************************************************************
*/
INT16U OSVersion (void)
{
return (OS_VERSION);
}
/*$PAGE*/
/*
*********************************************************************************************************
* 啞函數
*
* 函數描述: 該函數不做任何事情它由 OSTaskDel()調用
*
* 輸入參數 : 無
*
* 返回值 : 無
*********************************************************************************************************
*/
#if OS_TASK_DEL_EN > 0
void OS_Dummy (void)
{
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 事件發生使任務就緒運行
*
* 函數描述: 該函數由其他 uC/OS-II 服務函數調用并且用于使等待事件發生的任務就緒以運行。
*
* 輸入參數 : pevent 指向對應于事件的事件控制塊的指針
*
* msg 指向消息的指針。 該指針用于指向消息服務,如郵箱、隊列。不用于其他服務函數。
*
* msk 用于清除任務控制塊的狀態字節位的掩碼. 例如 OSSemPost() 將使用 OS_STAT_SEM
* OSMboxPost()將使用 OS_STAT_MBOX 等
*
* 返回值 : prio 就緒任務的優先級
*
* 注釋 : 該函數是 uC/OS-II的內部函數,應用程序不該調用。
*********************************************************************************************************
*/
#if OS_EVENT_EN > 0
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
{
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U prio;
y = OSUnMapTbl[pevent->OSEventGrp]; /* 尋找等待消息的最高優先級任務 */
bity = OSMapTbl[y];
x = OSUnMapTbl[pevent->OSEventTbl[y]];
bitx = OSMapTbl[x];
prio = (INT8U)((y << 3) + x); /* 找到得到消息的任務的優先級別 */
if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) /* 從等待列表中刪除最高優先級任務 */
{
pevent->OSEventGrp &= ~bity; /* 如果只是任務掛起則清除組位 */
}
ptcb = OSTCBPrioTbl[prio]; /* 指向任務的任務控制塊的指針 */
ptcb->OSTCBDly = 0; /* 防止 OSTimeTick() 就緒任務 */
ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* 從該任務中解開事件任務塊 */
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
ptcb->OSTCBMsg = msg; /* 直接發送消息給等待的任務 */
#else
msg = msg; /* 如果沒有使用避免編譯器發出警告 */
#endif
ptcb->OSTCBStat &= ~msk; /* 清除相關于事件類型的位 */
if (ptcb->OSTCBStat == OS_STAT_RDY)
{ /* 如果任務就緒 (可能被掛起) */
OSRdyGrp |= bity; /* 把任務放在就緒待運行列表中 */
OSRdyTbl[y] |= bitx;
}
return (prio);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 使任務進入等待事件發生的狀態
*
* 函數描述: 該函數由其他 uC/OS-II 服務函數調用,由于沒有事件發生,任務被掛起。
*
* 輸入函數 : pevent 指向任務等待的事件控制塊的指針
*
* 返回值 : 無
*
* 注釋 : 該函數為 uC/OS-II的內部函數,應用程序不該調用。
**********************************************************************************************************
*/
#if OS_EVENT_EN > 0
void OS_EventTaskWait (OS_EVENT *pevent)
{
OSTCBCur->OSTCBEventPtr = pevent; /* 存儲在任務控制塊中指向事件控制塊的指針 */
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) /* 任務脫離就緒 */
{
OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* 如果僅是任務掛起清除事件組位 */
}
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* 把任務放到等待列表中 */
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 由于等待事件超時,使任務處于就緒態
*
* 函數描述: 該函數由于超時發生由其他 uC/OS-II 服務函數調用使任務就緒。
*
* 輸入參數 : pevent 指向就緒一個任務的事件控制塊的指針
*
* 返回值 : 無
*
* 注釋 : 該函數為 uC/OS-II的內部函數,應用程序不該調用。
*********************************************************************************************************
*/
#if OS_EVENT_EN > 0
void OS_EventTO (OS_EVENT *pevent)
{
if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00)
{
pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY; /* 從ECB 的任務等待列表中刪除該任務 */
}
OSTCBCur->OSTCBStat = OS_STAT_RDY; /* 設定就緒狀態 */
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* 任務脫離等待事件 */
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化事件控制塊的等待任務的列表
*
* 函數描述: 該函數由其他的uC/OS-II 服務函數調用以初始化事件等待任務的列表。
*
* 輸入參數 : pevent 指向分配給事件的事件控制塊的指針
*
* 返回值 : 無
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -