?? os_task.c
字號:
}
else
{
err = OS_TASK_NOT_EXIST; /* 任務被刪除 */
}
OS_EXIT_CRITICAL();
return (err);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 恢復一個掛起的任務
*
* 函數描述: 該函數恢復以前被掛起的任務。被掛起的任務只能通過調用函數恢復。
*
* 輸入函數 : prio 待恢復任務的優先級
*
* 返回值 : OS_NO_ERR 請求的任務被恢復
* OS_PRIO_INVALID 指定的優先級是否高于允許的最大值。
* (例如 >= OS_LOWEST_PRIO)
* OS_TASK_RESUME_PRIO 待恢復的任務優先級并不存在
* OS_TASK_NOT_SUSPENDED 待恢復的任務沒有被掛起
*********************************************************************************************************
*/
#if OS_TASK_SUSPEND_EN > 0
INT8U OSTaskResume (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
#if OS_ARG_CHK_EN > 0
if (prio >= OS_LOWEST_PRIO)
{ /* 任務優先級是否有效 ? */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0)
{ /* 被掛起的任務是否存在? */
OS_EXIT_CRITICAL();
return (OS_TASK_RESUME_PRIO);
}
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY)
{ /* 任務是否被掛起 */
if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* 清除ptcb->OSTCBStat中 */
(ptcb->OSTCBDly == 0)) /* 的OS_STAT_SUSPEND 位 */
{ /* 沒有延時 */
OSRdyGrp |= ptcb->OSTCBBitY; /* 使任務就緒 */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_EXIT_CRITICAL();
OS_Sched(); // 有延時則消除延時后,就緒!
}
else
{
OS_EXIT_CRITICAL();
}
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_TASK_NOT_SUSPENDED);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 堆棧檢驗
*
* 函數描述: 該函數用于檢驗指定的任務堆棧中空余存儲單元的數量。
*
*
* 輸入參數 : prio 任務的優先級
*
* pdata 指向 OS_STK_DATA型的數據結構.
*
* 返回值 : OS_NO_ERR 成功
* OS_PRIO_INVALID 如果優先級高于許可的最大值
* (例如 > OS_LOWEST_PRIO) 或沒有指定 OS_PRIO_SELF.
* OS_TASK_NOT_EXIST 期望的任務沒創建
* OS_TASK_OPT_ERR 任務創建時未指定 OS_TASK_OPT_STK_CHK
*********************************************************************************************************
*/
#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
OS_STK *pchk;
INT32U free;
INT32U size;
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF)
{ /* 確認優先級未被其他任務占用 */
return (OS_PRIO_INVALID);
}
#endif
pdata->OSFree = 0; /* 如果失敗,設定為0尺寸 */
pdata->OSUsed = 0;
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF)
{ /* 賦給自身的優先級 */
prio = OSTCBCur->OSTCBPrio;
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0)
{ /* 確認任務存在 */
OS_EXIT_CRITICAL();
return (OS_TASK_NOT_EXIST);
}
if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0)
{ /* 確認堆棧檢驗選擇是否設定 */
OS_EXIT_CRITICAL();
return (OS_TASK_OPT_ERR);
}
free = 0;
size = ptcb->OSTCBStkSize;
pchk = ptcb->OSTCBStkBottom;
OS_EXIT_CRITICAL();
#if OS_STK_GROWTH == 1
while (*pchk++ == (OS_STK)0) { /* 計算堆棧中0的個數 */
free++;
}
#else
while (*pchk-- == (OS_STK)0) {
free++;
}
#endif
pdata->OSFree = free * sizeof(OS_STK); /* 計算堆棧中空余字節的數量 */
pdata->OSUsed = (size - free) * sizeof(OS_STK); /* 計算堆棧中已用字節的數量 */
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 掛起一個任務以等待
*
* 函數描述: 該函數用于掛起一個任務。任務可以掛起自身或者其他任務。
*
* 輸入函數: prio 待掛起的任務。如果指定為 OS_PRIO_SELF,調用任務將掛起自身,重新調度將發生。
*
* 返回值 : OS_NO_ERR 請求任務被掛起
* OS_TASK_SUSPEND_IDLE 不允許掛起空閑任務
* OS_PRIO_INVALID 如果優先級高于許可的最大值
* (例如 > OS_LOWEST_PRIO) 或沒有指定 OS_PRIO_SELF.
* OS_TASK_SUSPEND_PRIO 被掛起的任務不存在
*
* 注釋 : 使用該函數要慎重。如果要掛起的任務在等待事件(例如消息、信號量、隊列等),當事件到達時,將
* 阻礙任務運行。
*********************************************************************************************************
*/
#if OS_TASK_SUSPEND_EN > 0
INT8U OSTaskSuspend (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
BOOLEAN self;
OS_TCB *ptcb;
#if OS_ARG_CHK_EN > 0
if (prio == OS_IDLE_PRIO)
{ /* 不許掛起空閑任務 */
return (OS_TASK_SUSPEND_IDLE);
}
if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF)
{ /* 任務優先級是否有效 ? */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF)
{ /* 賦給自身的優先級 */
prio = OSTCBCur->OSTCBPrio;
self = TRUE;
}
else if (prio == OSTCBCur->OSTCBPrio)
{ /* 判斷優先級 */
self = TRUE;
}
else
{
self = FALSE; /* 沒有掛起其他任務 */
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0)
{ /* 被掛起的任務是否存在? */
OS_EXIT_CRITICAL();
return (OS_TASK_SUSPEND_PRIO);
}
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00)
{ /* 讓任務脫離就緒 */
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* 任務掛起的狀態 */
OS_EXIT_CRITICAL();
if (self == TRUE)
{ /* 只有SELF為真時,發生任務切換 */
OS_Sched();
}
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 獲得任務信息
*
* 函數描述: 該函數用于獲得任務的控制塊信息。
*
* 輸入參數 : prio 所需信息對應任務的優先級
*
* 返回值 : OS_NO_ERR 請求的任務是否被掛起
* OS_PRIO_INVALID 如果優先級高于許可的最大值
* (例如 > OS_LOWEST_PRIO) 或沒有指定 OS_PRIO_SELF.
* OS_PRIO_ERR 所期望的任務不存在
*********************************************************************************************************
*/
#if OS_TASK_QUERY_EN > 0
INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* 為CPU狀態寄存器分配存儲變量 */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF)
{ /* 任務優先級是否有效 ? */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF)
{ /* 賦給自身的優先級 */
prio = OSTCBCur->OSTCBPrio;
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0)
{ /* 請求的任務是否存在? */
OS_EXIT_CRITICAL();
return (OS_PRIO_ERR);
}
memcpy(pdata, ptcb, sizeof(OS_TCB)); /* 復制任務控制塊到用戶存儲區 */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -