日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OS_CORE.C(3)

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OS_CORE.C(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ...無法獲得資源的話就將其掛起 */OS_STAT_MULTI; OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; //配置當前事件控制塊中的事件狀態標志為等待完成,因為這個事件即將被切換掉,進入掛起態OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB設置該任務掛起等待的時間為timeout時間,超時任務就被切換掉*/OS_EventTaskWaitMulti(pevents_pend); /* Suspend task until events or timeout occurs 暫停任務直到出現新的事件呼叫或者掛起時間到*/OS_EXIT_CRITICAL(); /*開中斷*/OS_Sched(); /* Find next highest priority task ready找下一個就緒的最高優先級任務 */OS_ENTER_CRITICAL(); /*關中斷*/switch (OSTCBCur->OSTCBStatPend) { /* Handle event posted, aborted, or timed-out對當前最高優先級的事件進行狀態判斷*/case OS_STAT_PEND_OK:case OS_STAT_PEND_ABORT: /*等待完成和等待終止都進行相同的處理*/pevent = OSTCBCur->OSTCBEventPtr; /*將當前任務控制塊中指向事件的指針賦值給pevent*/if (pevent != (OS_EVENT *)0) { /* If task event ptr != NULL, ...如果任務事件指針不為空,說明有任務就緒*/*pevents_rdy++ = pevent; /* ... return available event ..將這個事件返回到就緒事件數組*/*pevents_rdy = (OS_EVENT *)0; /* ... & NULL terminate return event array最后一個標志位結束符*/events_rdy_nbr++; /*將就緒事件的數目加1*/}else { /* Else NO event available, handle as timeout沒有事件是準備好的,按照超時處理*/OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;/*將此時任務控制塊掛起狀態設置為時間用完狀態*/OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);/*將任務從事件等待隊列中刪除*/}break;case OS_STAT_PEND_TO: /* If events timed out, ...如果事件的時間用完了*/default: /* ... remove task from events' wait lists 將任務從事件等待列表中刪除 */OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);break;}


//下面這個switch是用來返回消息的switch (OSTCBCur->OSTCBStatPend) { /*對當前最高優先級任務狀態進行判斷*/case OS_STAT_PEND_OK: /*狀態為等待完成(正常完成)*/switch (pevent->OSEventType) { /* Return event's message返回事件的消息*/ #if (OS_SEM_EN > 0u)case OS_EVENT_TYPE_SEM: /*如果事件類型為信號量,消息返回為0*/*pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores信號量沒有消息*/break; #endif#if ((OS_MBOX_EN > 0u) || \ /*如果是郵箱或者隊列,處理方法一致*/((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))case OS_EVENT_TYPE_MBOX: case OS_EVENT_TYPE_Q:*pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg; /* Return received message返回收到的消息*/break; #endifcase OS_EVENT_TYPE_MUTEX: /*如果是互斥量或是標志或是默認*/case OS_EVENT_TYPE_FLAG:default:OS_EXIT_CRITICAL(); /*開中斷*/*pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array將NULL返回給事件數組 */*perr = OS_ERR_EVENT_TYPE; /*將錯誤類型設置為OS_ERR_EVENT_TYPE*/return (events_rdy_nbr); /*返回就緒事件的數量*/}*perr = OS_ERR_NONE; /*如果不是互斥量或標志或默認,將錯誤類型設置為OS_ERR_NONE*/break;case OS_STAT_PEND_ABORT: /*如果當前最高優先級任務狀態為等待終止(取消等待)*/*pmsgs_rdy++ = (void *)0; /* NO message returned for abort沒有返回的消息*/*perr = OS_ERR_PEND_ABORT; /* Indicate that event aborted將錯誤信息設置為OS_ERR_PEND_ABORT,表示事件被取消*/break;case OS_STAT_PEND_TO: /*如果當前最高優先級任務狀態為超時*/default: /*默認狀態*/*pmsgs_rdy++ = (void *)0; /* NO message returned for timeout超時情況下沒有消息返回*/*perr = OS_ERR_TIMEOUT; /* Indicate that events timed out將錯誤信息設置為超時OS_ERR_TIMEOUT*/break;}OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready將當前任務控制塊的狀態設置為就緒態*/OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status將當前任務控制塊的掛起狀態設置為等待完成狀態(正常終止)*/OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers清除事件指針。將當前任務控制塊中指向事件的指針設置為0*/OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;/*將當前任務控制塊中指向多個事件的指針設置為0*/ #if ((OS_MBOX_EN > 0u) || \((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))OSTCBCur->OSTCBMsg = (void *)0; /* Clear task message清除任務消息。將當前任務控制塊中指向消息的指針設置為0*/ #endifOS_EXIT_CRITICAL(); /*開中斷*/return (events_rdy_nbr);/*返回就緒事件的數量*/ } #endif

第二個圖主要是來返回消息的,與第一個不同。

總結

以上是生活随笔為你收集整理的OS_CORE.C(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。