㈠ ucos-ii的系統函數有哪些啊有什麼特殊的嗎山東
UC/OSⅡ 基本函數
************************************************************************************************
* 事件標志管理 (EVENT FLAGS MANAGEMENT)
*
* OSFlagAccept() 檢查事件標志組函數(標志組的指針、事件標志位、等待事件標志位的方式、錯誤碼指針)
* OSFlagCreate() 建立一個事件標志組(初值、錯誤碼)
* OSFlagDel() 刪除一個事件標志組(指針、條件值、錯誤值)
* OSFlagPend() 等待事件標志組的事件標志位(事件組指針、需要檢查的標志位、等待事件標志位的方式、
* 允許等待的時鍾節拍、出錯代碼的時鍾節拍)
* OSFlagPost() 置位或清0事件標志組中的標志位(指針、標志位、條件值、錯誤碼)
* OSFlagQuery() 查詢事件標志組的當前事件標志狀態(事件標志組的指針、錯誤代碼的指針)
************************************************************************************************
************************************************************************************************
* 消息郵箱管理 (MESSAGE MAILBOX MANAGEMENT)
*
* OSMboxAccept () 查看消息郵箱(消息郵箱指針)
* OSMboxCreate () 建立並初始化一個消息郵箱(msg 參數不為空含內容)
* OSMboxDel () 刪除消息郵箱(消息郵箱指針、刪除條件、出錯代碼指針)
* OSMboxPend () 等待一個消息郵箱函數(消息郵箱指針、允許等待的時鍾節拍、代碼錯誤指針)
* OSMboxPost () 發送消息函數(消息郵箱指針、即將實際發送給任務的消息)
* OSMboxPostOpt () 向郵箱發送一則消息(郵箱指針、消息、條件)
* OSMboxQuery () 查詢一個郵箱的當前狀態(信號量指針、狀態數據結構指針)
************************************************************************************************
************************************************************************************************
* 內存管理項 (MEMORY MANAGEMENT)
* OSMemCreate () 建立並初始化一塊內存區(起始地址、需要的內存塊數目、內存塊大小、返回錯誤的指針)
* OSMemGet () 從內存區分配一個內存塊
* OSMemPut () 釋放一個內存塊,內存塊必須釋放回原先申請的內存區
* OSMemQuery () 得到內存區的信息
************************************************************************************************
************************************************************************************************
* 互斥型信號量項管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT)
*
* OSMutexAccept () 無等待地獲取互斥型信號量[任務不掛起](信號量指針、錯誤代碼)
* OSMutexCreate () 建立並初始化一個互斥型信號量(優先順序繼承優先順序(PIP)、出錯代碼指針)
* OSMutexDel () 刪除互斥型信號量(信號指針、刪除條件、錯誤指針)
* OSMutexPend () 等待一個互斥型信號量(指針、等待超時時限、出錯代碼指針)
* OSMutexPost () 釋放一個互斥型信號量(互斥型信號量指針)
* OSMutexQuery () 查詢一個互斥型信號量的當前狀態(互斥型信號量指針、狀態數據結構指針)
************************************************************************************************
************************************************************************************************
* 消息隊列管理 (MESSAGE QUEUE MANAGEMENT)
*
* OSQAccept () 檢查消息隊列中是否已經有需要的消息(消息隊列的指針)
* OSQCreate () 建立一個消息隊列(消息內存區的基地址(指針數組)、消息內存區的大小)
* OSQDel () 刪除一個消息隊列(消息隊列指針、刪除條件、錯誤指針)
* OSQFlush () 清空消息隊列(指向得到消息隊列的指針)
* OSQPend () 任務等待消息隊列中的消息(消息隊列指針、允許等待的時鍾節拍、代碼錯誤指針)
* OSQPost () 向消息隊列發送一則消息FIFO(消息隊列指針、發送的消息)
* OSQPostFront () 向消息隊列發送一則消息LIFO(消息隊列指針、發送的消息)
* OSQPostOpt () 向消息隊列發送一則消息LIFO(消息隊列指針、發送的消息、發送條件)
* OSQQuery () 查詢一個消息隊列的當前狀態(信號量指針、狀態數據結構指針)
************************************************************************************************
/***********************************************************************************************
* 消息隊列數據 (MESSAGE QUEUE DATA)
************************************************************************************************
*/
隊列控制塊是一個用於維護消息隊列信息的數據結構,它包含了以下的一些域。這里,仍然在各個變數前加入
一個[.]來表示它們是數據結構中的一個域。
* 1).OSQPtr: 在空閑隊列控制塊中鏈接所有的隊列控制塊。一旦建立了消息隊列,該域就不再有用了。
* 2).OSQStart: 是指向消息隊列的指針數組的起始地址的指針。用戶應用程序在使用消息隊列之前必須先定義該數組
* 3).OSQEnd: 是指向消息隊列結束單元的下一個地址的指針。該指針使得消息隊列構成一個循環的緩沖區。
* 4).OSQIn: 是指向消息隊列中插入下一條消息的位置的指針。當.OSQIn和.OSQEnd相等時,.OSQIn被調整指向
消息隊列的起始單元。
* 5).OSQOut: 是指向消息隊列中下一個取出消息的位置的指針。當.OSQOut和.OSQEnd相等時,.OSQOut被調整指向消息隊列的起始單元。
* 6).OSQSize: 是消息隊列中總的單元數。該值是在建立消息隊列時由用戶應用程序決定的。在uC/OS-II中,該值最大可以是65,535。
* 7).OSQEntries: 是消息隊列中當前的消息數量。當消息隊列是空的時,該值為0。當消息隊列滿了以後,該值和 .OSQSize值一樣。 在消息隊列剛剛建立時,該值為0。
***********************************************************************************************
*/
/***********************************************************************************************
* 信號量管理 (SEMAPHORE MANAGEMENT)
*
* OSSemAccept() 無條件地等待請求一個信號量函數
* OSSemCreate() 建立並初始化一個信號量(輸入一個信號量值)
* OSSemDel() 刪除一個信號量(信號指針、刪除條件、錯誤指針)
* OSSemPend () 等待一個信號量函數(信號量指針、允許等待的時鍾節拍、代碼錯誤指針)
* OSSemPost () 發出一個信號量函數(信號量指針)
* OSSemQuery () 查詢一個信號量的當前狀態(信號量指針、狀態數據結構指針)
*/
/*
************************************************************************************************
* 任務管理 (TASK MANAGEMENT)
*
* OSTaskChangePrio () 改變一個任務的優先順序(任務舊的優先順序、任務新的優先順序)
* OSTaskCreate () 建立任務(任務代碼指針、傳遞參數指針、分配任務堆棧棧頂指針、任務優先順序)
* OSTaskCreateExt () 建立擴展任務(任務代碼指針/傳遞參數指針/分配任務堆棧棧頂指針/分配任務優先順序
* //(未來的)優先順序標識(與優先順序相同)/分配任務堆棧棧底指針/指定堆棧的容量(檢驗用)
* //指向用戶附加的數據域的指針/建立任務設定選項)
* OSTaskDel () 刪除任務(任務的優先順序)
* OSTaskDelReq () 請求一個任務刪除其它任務或自身?(任務的優先順序)
* OSTaskResume () 喚醒一個用OSTaskSuspend()函數掛起的任務(任務的優先順序)
* OSTaskStkChk () 檢查任務堆棧狀態(任務優先順序、檢驗堆棧數據結構)
* OSTaskSuspend () 無條件掛起一個任務(任務優先順序)
* OSTaskQuery () 獲取任務信息(任務指針、保存數據結構指針)
************************************************************************************************
*/
/*
************************************************************************************************
* 時鍾管理項 (TIME MANAGEMENT)
*
* OSTimeDly () 任務延時函數(時鍾節拍數)
* OSTimeDlyHMSM () 將一個任務延時若干時間(設定時、分、秒、毫秒)
* OSTimeDlyResume () 喚醒一個用OSTimeDly()或OSTimeDlyHMSM()函數的任務(優先順序)
* OSTimeGet () 獲取當前系統時鍾數值
* OSTimeSet () 設置當前系統時鍾數值
************************************************************************************************
*/
/***********************************************************************************************
* 混雜函數定義
*
* OSInit() 初始化UCOS-II函數
* OSIntEnter() 中斷函數正在執行
* OSIntExit() 中斷函數已經完成(脫離中斷)
* OSSchedLock() 給調度器上鎖
* OSSchedUnlock() 給調度器解鎖
* OSStart() 啟動多個任務
* OSStatInit() 統計任務初始化
* OSVersion() 獲得版本號
************************************************************************************************/
/***********************************************************************************************
* 內部函數原型 INTERNAL FUNCTION PROTOTYPES
* 你在應用程序中不能使用它們 (Your application MUST NOT call these functions)
*
* OS_Dummy() 建立一個虛擬函數
* OS_EventTaskRdy() 使一個任務進入就緒態(OS_EVENT *pevent, void *msg, INT8U msk)
* OS_EventTaskWait() 使一個任務進入等待某事件發生狀態(ECB指針)
* OS_EventTO() 由於超時而將任務置為就緒態(ECB指針)
* OS_EventWaitListInit() 事件控制塊列表初始化(事件控制塊指針)
* OS_FlagInit() 初始化事件標志結構
* OS_FlagUnlink() 把這個OS_FLAG_NODE從事件標志組的等待任務鏈表中刪除(OS_FLAG_NODE *pnode)
* OS_MemInit() 初始化內存分區
* OS_QInit() 初始化事件隊列結構
* OS_Sched() 任務調度函數
* OS_TaskIdle() 空閑任務函數(指向一個數據結構)
* OS_TaskStat() 統計任務(指向一個數據結構)
* OS_TCBInit() 初始化任務控制塊TCB(優先順序指針、棧頂指針、棧底指針、任務標志符、
* 堆棧容量、擴展指針、選擇項)
************************************************************************************************
*/
■
㈡ uCOS編程,請教各位大蝦, 在中斷裡面可以不可以調用OSFlagPost發送事件,請各位大蝦指點
應該是所有的POST函數都不可以在中斷中調用的,因為執行POST函數後會產生一次任務調度,而任務調度就不能再中斷中執行,你仔細看OS_Sched 函數,中有個語句是if ((OSIntNesting == 0) && (OSLockNesting == 0)) 。而OSIntNesting 在中斷的時候是不會等於0的,至少也會等於1,因此就不會產生調度,自然就出錯了。
㈢ 請大俠解釋一下,C語言中該語句: int flag=O_CREAT|O_TRUNC|O_WRONLY;
O_CREAT :Creates and opens a new file for writing; this has no effect if the file specified by filename exists
O_TRUNC :Opens and truncates an existing file to zero length; the file must have write permission. The contents of the file are destroyed. If this flag is given, you cannot specify O_RDONLY.
O_WRONLY:Opens file for writing only; if this flag is given, neither O_RDONLY nor O_RDWR can be given.
意思就是在以上這三種方式的任意一種都可以操作文件。
㈣ OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[STACKSIZE - 1], 5); 其中(void*)0是什麼意
傳參數給task_1函數用的,對於任何形式的函數參數集合都可以轉換成一個結構體,然後用結構體指針去傳遞,void *可以用來傳遞任何類型的指針。這里由於沒有指針要傳遞所以傳遞空指針過去,為了不出現warning,在0前面先做強制類型轉換
㈤ ucos系統什麼函數能替換taskidverify
UC/OSⅡ 基本函數 ************************************************************************************************ * 事件標志管理 (EVENT FLAGS MANAGEMENT) * * OSFlagAccept() 檢查事件標志組函數(標志組的指針、事件標志位、等待事件標志位的方式、錯誤碼指針) * OSFlagCreate() 建立一個事件標志組(初值、錯誤碼) * OSFlagDel() 刪除一個事件標志組(指針、條件值、錯誤值) * OSFlagPend() 等待事件標志組的事件標志位(事件組指針、需要檢查的標志位、等待事件標志位的方式、 * 允許等待的時鍾節拍、出錯代碼的時鍾節拍) * OSFlagPost() 置位或清0事件標志組中的標志位(指針、標志位、條件值、錯誤碼) * OSFlagQuery() 查詢事件標志組的當前事件標志狀態(事件標志組的指針、錯誤代碼的指針) ************************************************************************************************ ************************************************************************************************ * 消息郵箱管理 (MESSAGE MAILBOX MANAGEMENT) * * OSMboxAccept () 查看消息郵箱(消息郵箱指針) * OSMboxCreate () 建立並初始化一個消息郵箱(msg 參數不為空含內容) * OSMboxDel () 刪除消息郵箱(消息郵箱指針、刪除條件、出錯代碼指針) * OSMboxPend () 等待一個消息郵箱函數(消息郵箱指針、允許等待的時鍾節拍、代碼錯誤指針) * OSMboxPost () 發送消息函數(消息郵箱指針、即將實際發送給任務的消息) * OSMboxPostOpt () 向郵箱發送一則消息(郵箱指針、消息、條件) * OSMboxQuery () 查詢一個郵箱的當前狀態(信號量指針、狀態數據結構指針) ************************************************************************************************ ************************************************************************************************ * 內存管理項 (MEMORY MANAGEMENT) * OSMemCreate () 建立並初始化一塊內存區(起始地址、需要的內存塊數目、內存塊大小、返回錯誤的指針) * OSMemGet () 從內存區分配一個內存塊 * OSMemPut () 釋放一個內存塊,內存塊必須釋放回原先申請的內存區 * OSMemQuery () 得到內存區的信息 ************************************************************************************************ ************************************************************************************************ * 互斥型信號量項管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT) * * OSMutexAccept () 無等待地獲取互斥型信號量[任務不掛起](信號量指針、錯誤代碼) * OSMutexCreate () 建立並初始化一個互斥型信號量(優先順序繼承優先順序(PIP)、出錯代碼指針) * OSMutexDel () 刪除互斥型信號量(信號指針、刪除條件、錯誤指針) * OSMutexPend () 等待一個互斥型信號量(指針、等待超時時限、出錯代碼指針) * OSMutexPost () 釋放一個互斥型信號量(互斥型信號量指針) * OSMutexQuery () 查詢一個互斥型信號量的當前狀態(互斥型信號量指針、狀態數據結構指針) ************************************************************************************************ ************************************************************************************************ * 消息隊列管理 (MESSAGE QUEUE MANAGEMENT) * * OSQAccept () 檢查消息隊列中是否已經有需要的消息(消息隊列的指針) * OSQCreate () 建立一個消息隊列(消息內存區的基地址(指針數組)、消息內存區的大小) * OSQDel () 刪除一個消息隊列(消息隊列指針、刪除條件、錯誤指針) * OSQFlush () 清空消息隊列(指向得到消息隊列的指針) * OSQPend () 任務等待消息隊列中的消息(消息隊列指針、允許等待的時鍾節拍、代碼錯誤指針) * OSQPost () 向消息隊列發送一則消息FIFO(消息隊列指針、發送的消息) * OSQPostFront () 向消息隊列發送一則消息LIFO(消息隊列指針、發送的消息) * OSQPostOpt () 向消息隊列發送一則消息LIFO(消息隊列指針、發送的消息、發送條件) * OSQQuery () 查詢一個消息隊列的當前狀態(信號量指針、狀態數據結構指針) ************************************************************************************************ /*********************************************************************************************** * 消息隊列數據 (MESSAGE QUEUE DATA) ************************************************************************************************ */ 隊列控制塊是一個用於維護消息隊列信息的數據結構,它包含了以下的一些域。這里,仍然在各個變數前加入 一個[.]來表示它們是數據結構中的一個域。 * 1).OSQPtr: 在空閑隊列控制塊中鏈接所有的隊列控制塊。一旦建立了消息隊列,該域就不再有用了。 * 2).OSQStart: 是指向消息隊列的指針數組的起始地址的指針。用戶應用程序在使用消息隊列之前必須先定義該數組 * 3).OSQEnd: 是指向消息隊列結束單元的下一個地址的指針。該指針使得消息隊列構成一個循環的緩沖區。 * 4).OSQIn: 是指向消息隊列中插入下一條消息的位置的指針。當.OSQIn和.OSQEnd相等時,.OSQIn被調整指向 消息隊列的起始單元。 * 5).OSQOut: 是指向消息隊列中下一個取出消息的位置的指針。當.OSQOut和.OSQEnd相等時,.OSQOut被調整指向消息隊列的起始單元。 * 6).OSQSize: 是消息隊列中總的單元數。該值是在建立消息隊列時由用戶應用程序決定的。在uC/OS-II中,該值最大可以是65,535。 * 7).OSQEntries: 是消息隊列中當前的消息數量。當消息隊列是空的時,該值為0。當消息隊列滿了以後,該值和 .OSQSize值一樣。 在消息隊列剛剛建立時,該值為0。 *********************************************************************************************** */ /*********************************************************************************************** * 信號量管理 (SEMAPHORE MANAGEMENT) * * OSSemAccept() 無條件地等待請求一個信號量函數 * OSSemCreate() 建立並初始化一個信號量(輸入一個信號量值) * OSSemDel() 刪除一個信號量(信號指針、刪除條件、錯誤指針) * OSSemPend () 等待一個信號量函數(信號量指針、允許等待的時鍾節拍、代碼錯誤指針) * OSSemPost () 發出一個信號量函數(信號量指針) * OSSemQuery () 查詢一個信號量的當前狀態(信號量指針、狀態數據結構指針) */ /* ************************************************************************************************ * 任務管理 (TASK MANAGEMENT) * * OSTaskChangePrio () 改變一個任務的優先順序(任務舊的優先順序、任務新的優先順序) * OSTaskCreate () 建立任務(任務代碼指針、傳遞參數指針、分配任務堆棧棧頂指針、任務優先順序) * OSTaskCreateExt () 建立擴展任務(任務代碼指針/傳遞參數指針/分配任務堆棧棧頂指針/分配任務優先順序 * //(未來的)優先順序標識(與優先順序相同)/分配任務堆棧棧底指針/指定堆棧的容量(檢驗用) * //指向用戶附加的數據域的指針/建立任務設定選項) * OSTaskDel () 刪除任務(任務的優先順序) * OSTaskDelReq () 請求一個任務刪除其它任務或自身?(任務的優先順序) * OSTaskResume () 喚醒一個用OSTaskSuspend()函數掛起的任務(任務的優先順序) * OSTaskStkChk () 檢查任務堆棧狀態(任務優先順序、檢驗堆棧數據結構) * OSTaskSuspend () 無條件掛起一個任務(任務優先順序) * OSTaskQuery () 獲取任務信息(任務指針、保存數據結構指針) ************************************************************************************************ */ /* ************************************************************************************************ * 時鍾管理項 (TIME MANAGEMENT) * * OSTimeDly () 任務延時函數(時鍾節拍數) * OSTimeDlyHMSM () 將一個任務延時若干時間(設定時、分、秒、毫秒) * OSTimeDlyResume () 喚醒一個用OSTimeDly()或OSTimeDlyHMSM()函數的任務(優先順序) * OSTimeGet () 獲取當前系統時鍾數值 * OSTimeSet () 設置當前系統時鍾數值 ************************************************************************************************ */ /*********************************************************************************************** * 混雜函數定義 * * OSInit() 初始化UCOS-II函數 * OSIntEnter() 中斷函數正在執行 * OSIntExit() 中斷函數已經完成(脫離中斷) * OSSchedLock() 給調度器上鎖 * OSSchedUnlock() 給調度器解鎖 * OSStart() 啟動多個任務 * OSStatInit() 統計任務初始化 * OSVersion() 獲得版本號 ************************************************************************************************/ /*********************************************************************************************** * 內部函數原型 INTERNAL FUNCTION PROTOTYPES * 你在應用程序中不能使用它們 (Your application MUST NOT call these functions) * * OS_Dummy() 建立一個虛擬函數 * OS_EventTaskRdy() 使一個任務進入就緒態(OS_EVENT *pevent, void *msg, INT8U msk) * OS_EventTaskWait() 使一個任務進入等待某事件發生狀態(ECB指針) * OS_EventTO() 由於超時而將任務置為就緒態(ECB指針) * OS_EventWaitListInit() 事件控制塊列表初始化(事件控制塊指針) * OS_FlagInit() 初始化事件標志結構 * OS_FlagUnlink() 把這個OS_FLAG_NODE從事件標志組的等待任務鏈表中刪除(OS_FLAG_NODE *pnode) * OS_MemInit() 初始化內存分區 * OS_QInit() 初始化事件隊列結構 * OS_Sched() 任務調度函數 * OS_TaskIdle() 空閑任務函數(指向一個數據結構) * OS_TaskStat() 統計任務(指向一個數據結構) * OS_TCBInit() 初始化任務控制塊TCB(優先順序指針、棧頂指針、棧底指針、任務標志符、 * 堆棧容量、擴展指針、選擇項) ************************************************************************************************ */
㈥ 請教UC/OS中任務創建函數ostaskcreate的參數意義
(void(*task)(void *pd) 函數指針 對應的就是你要創建的任務函數
task 任務名稱 pd 任務函數的參數
㈦ 關於ucos系統中OSTaskCreateExt( )函數的問題。
堆棧檢驗是調用這個函數,看它的返回值
*********************************************************************************************************
* STACK CHECKING
*
* Description: This function is called to check the amount of free memory left on the specified task's
* stack.
*
* Arguments : prio is the task priority
*
* pdata is a pointer to a data structure of type OS_STK_DATA.
*
* Returns : OS_NO_ERR upon success
* OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
* (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
* OS_TASK_NOT_EXIST if the desired task has not been created
* OS_TASK_OPT_ERR if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created
*********************************************************************************************************
*/
INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
㈧ ostaskdel源代碼
#if OS_TASK_DEL_EN > 0
INT8U OSTaskDel (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
#if OS_EVENT_EN > 0
OS_EVENT *pevent;
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FLAG_NODE *pnode;
#endif
OS_TCB *ptcb;
BOOLEAN self;
if (OSIntNesting > 0) { /* See if trying to delete from ISR */
return (OS_TASK_DEL_ISR);
}
#if OS_ARG_CHK_EN > 0
if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */
return (OS_TASK_DEL_IDLE);
}
if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready */
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
#if OS_EVENT_EN > 0
pevent = ptcb->OSTCBEventPtr;
if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
}
}
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
pnode = ptcb->OSTCBFlagNode;
if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
OS_FlagUnlink(pnode); /* Remove from wait list */
}
#endif
ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
if (OSLockNesting < 255) {
OSLockNesting++;
}
OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
OS_Dummy(); /* ... Dummy ensures that INTs will be */
OS_ENTER_CRITICAL(); /* ... disabled HERE! */
if (OSLockNesting > 0) {
OSLockNesting--;
}
OSTaskDelHook(ptcb); /* Call user defined hook */
OSTaskCtr--; /* One less task being managed */
OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
OSTCBList = ptcb->OSTCBNext;
} else {
ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
}
ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
OSTCBFreeList = ptcb;
OS_EXIT_CRITICAL();
OS_Sched(); /* Find new highest priority task */
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_TASK_DEL_ERR);
}
#endif