一、UCOSIII任務調度
1、可剝奪型任務調度
定義:任務調度就是中止當前正在運行的任務轉而去執行其他的任務(UCOSIII是可剝奪型內核,因此當一個高優先級的任務準備就緒,并且此時發生了任務調度,那么這個高優先級的任務就會獲得CPU的使用權)
UCOSIII中的任務調度是由任務調度器來完成的,任務調度器有2種:任務級調度器和中斷級調度器。
任務級調度器為函數OSSched()。
//OSSched為任務級調度器,如果在中斷服務函數中不能使用
void OSSched (void)
{
CPU_SR_ALLOC();
//判斷OSSched是否在中斷服務函數中使用
if (OSIntNestingCtr > (OS_NESTING_CTR)0)
{
return;
}
//調度器是否上鎖
if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0)
{
return;
}
CPU_INT_DIS(); //關中斷
OSPrioHighRdy = OS_PrioGetHighest();//獲取任務就緒表中最高優先級任務
//獲取下次任務切換要運行的任務,OSTCBHighRdyPtr指向將要切換任務的OS_TCB
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
//判斷要運行的任務是否是正在運行的任務,是就不用切換
if (OSTCBHighRdyPtr == OSTCBCurPtr)
{
CPU_INT_EN();
return;
}
#if OS_CFG_TASK_PROFILE_EN > 0u
OSTCBHighRdyPtr->CtxSwCtr++;
#endif
OSTaskCtxSwCtr++;
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
OS_TLS_TaskSw();
#endif
OS_TASK_SW(); //執行任務切換
CPU_INT_EN(); //開中斷
}
中斷級調度器為函數OSIntExit(),當退出外部中斷服務函數的時候使用中斷級任務調度。
void OSIntExit (void)
{
CPU_SR_ALLOC();
if (OSRunning != OS_STATE_OS_RUNNING) //判斷UCOSIII,未運行就跳出
{
return;
}
CPU_INT_DIS();
if (OSIntNestingCtr == (OS_NESTING_CTR)0) //OSIntNestingCtr中斷嵌套計數器,判斷是否為0,確保退出時調用OSIntExit()后不會等于負數
{
CPU_INT_EN();//記錄中斷嵌套次數
return;
}
OSIntNestingCtr--;//3
if (OSIntNestingCtr > (OS_NESTING_CTR)0)//>0說明還有其他中斷發生,不做任務切換
{
CPU_INT_EN();
return;
}
if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0) //調度器是否加鎖
{
CPU_INT_EN();
return;
}
OSPrioHighRdy = OS_PrioGetHighest(); //取出最高優先級任務的控制塊
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
if (OSTCBHighRdyPtr == OSTCBCurPtr)
{
CPU_INT_EN();
return;
}
#if OS_CFG_TASK_PROFILE_EN > 0u
OSTCBHighRdyPtr->CtxSwCtr++;
#endif
OSTaskCtxSwCtr++;
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
OS_TLS_TaskSw();
#endif
OSIntCtxSw(); //調用中斷級任務切換函數
CPU_INT_EN();//開中斷
}
2、任務調度點(重點紅色)
(1)、釋放信號量或者發送消息,也可通過配置相應的參數不發生任務調度。
(2)、使用延時函數OSTimeDly()或者OSTimeDlyHMSM()。
(3)、任務等待的事情還沒發生(等待信號量,消息隊列等)。
(4)、任務取消等待。
(5)、創建任務。
(6)、刪除任務。
(7)、刪除一個內核對象。
(8)、任務改變自身的優先級或者其他任務的優先級。
(9)、任務通過調用OSTaskSuspend()將自身掛起。
(10)、任務解掛某個掛起的任務。
(11)、退出所有的嵌套中斷。
(12)、通過OSSchedUnlock()給調度器解鎖。
(13)、任務調用OSSchedRoundRobinYield()放棄其執行時間片。
(14)、用戶調用OSSched()。
3、調度器上鎖和解鎖:
有時候我們并不希望發生任務調度,因為始終有一些代碼的執行過程是不能被打斷的。此時我們就可以使用函數OSSchedLock()對調度器加鎖,當我們想要恢復任務調度的時候就可以使用函數OSSchedUnlock()給已經上鎖的任務調度器解鎖
4、時間片輪轉調度
UCOSIII允許一個優先級下有多個任務,每個任務可以執行指定的時間(時間片),然后輪到下一個任務,這個過程就是時間片輪轉調度,當一個任務不想在運行的時候就可以放棄其時間片。
時間片輪轉調度器為:OS_SchedRoundRobin()。
時間片輪轉調度示例:
二、UCOSIII任務切換
1、什么是任務切換?
當UCOSIII需要切換到另外一個任務時,它將保存當前任務的現場到當前任務的堆棧中,主要是CPU寄存器值,然后恢復新的現場并且執行新的任務,這個過程就是任務切換。
任務切換分為兩種:任務級切換和中斷級切換。
任務級切換函數為:OSCtxSw()。
中斷級切換函數為:OSIntCtxSw()。
2、任務控制塊結構
任務控制塊是用來記錄與任務相關的信息的數據結構,每個任務都要有自己的任務控制塊。任務控制塊由用戶自行創建,如下代碼為創建一個任務控制塊:
OS_TCB StartTaskTCB; //創建一個任務控制塊
OS_TCB為一個結構體,描述了任務控制塊,任務控制塊中的成員變量用戶不能直接訪問,更不可能改變他們。
OS_TCB為一個結構體,其中有些成員采用了條件編譯的方式來確定
上一篇:UCOSIII任務創建、刪除、掛起和恢復
下一篇:UCOSIII系統初始化和啟動
推薦閱讀
史海拾趣
在電子行業的浪潮中,ETEQ Microsystems Inc于XXXX年應運而生,創始人帶著對微型電子技術的深厚理解和遠見,立志打造一家具有創新精神的芯片設計企業。初創期,公司面臨資金短缺、人才匱乏和市場競爭激烈的挑戰。然而,通過精心研發的幾款高性能低功耗芯片,ETEQ Microsystems Inc迅速在市場上打開了局面,贏得了合作伙伴的認可。
DLP精工科技公司,一直秉承“品質至上”的經營理念,在DLP技術產品的設計和制造過程中嚴格把控品質。公司擁有一支專業的研發團隊和先進的生產設備,確保每一件產品都符合高標準的質量要求。通過不斷的技術創新和產品升級,DLP精工科技在電子行業中樹立了良好的品牌形象,贏得了消費者的信賴和認可。
除了技術創新外,創都公司還以其精準的市場策略著稱。在電子產品更新換代日益加快的背景下,公司市場部門深入分析了消費者的需求和市場趨勢,成功預測了未來一段時間內的產品走向。基于這些分析,創都公司提前布局,推出了多款符合市場趨勢的新產品。這些產品不僅滿足了消費者的需求,還引領了市場潮流,為公司帶來了豐厚的利潤。此外,創都公司還積極開展品牌推廣活動,通過線上線下多種渠道提升品牌知名度,進一步鞏固了市場地位。
隨著技術的不斷進步和市場需求的增長,ESPROS不斷擴展其產品線。例如,公司發布了160 x 60像素的epc635 3D ToF傳感器芯片,進一步完善了其3D ToF傳感器產品線。此外,ESPROS還發布了320 x 240像素的epc660 3D ToF傳感器,滿足了市場對QVGA分辨率的需求。這些新產品的推出,不僅豐富了ESPROS的產品線,也進一步鞏固了其在光電傳感器領域的領先地位。
隨著全球市場的不斷擴張,Bussmann也加快了其全球化布局的步伐。目前,Bussmann的產品已在全球170多個國家銷售,為各地的客戶提供優質的電路保護解決方案。同時,為了滿足不同客戶的需求,Bussmann不斷擴展其產品線,現已涵蓋電氣電源熔斷器、電子電路板及小型熔斷器、熔絲盒、熔絲座及斷開開關等多個品類。這些產品的推出不僅豐富了Bussmann的產品線,也使其能夠更好地滿足市場的多元化需求。
以上五個故事展示了Bussmann (Eaton)公司在電子行業發展的不同階段和關鍵節點,體現了其技術創新、市場拓展和全球化布局的重要歷程。這些故事不僅反映了Bussmann在電路保護領域的領先地位,也展示了其在應對市場變化和客戶需求方面的靈活性和實力。
小弟現在C語言寫的還可以吧,IBM-PC8086匯編語言也學習了,當年也學習得很認真,也還算可以。準備轉向Linux下驅動程序開發上去 現在工具:s3c2410arm開發板 三星的 書籍:嵌入式LInux應用開發完全是手冊(韋東山 編著) &n ...… 查看全部問答∨ |
|
我有兩個機器,都是XP的。 兩個機器裝EVC+SP4都可以,使用EVC默認模擬器都可以運行。 后來為了運行中文程序,下載了eeworld上sunrain_hjb上傳的CHSEmulator_SDK.msi。 (這里感謝一下sunrain_hjb) 兩個機器安裝以后,一個可以正常使用這個中文 ...… 查看全部問答∨ |
設置spin的范圍為 0-1000,顯示為0.0-100 處理方法如下: 在OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) strValue.Format(L"%3.1f", (double)nPos/10.0); ...… 查看全部問答∨ |
環境:IAR FOR STM8+STLINK. STM8S103K3 做了2塊最小化系統板,STM8S103K3和STM8L152C6. STM8L152C6的最小化系統板可以用STLINK仿真. STM8S103K3的最小化系統板,可以用官方的編程軟件STVP下載程序并 ...… 查看全部問答∨ |
|
誰有Foundations of Analog and Digital Electronic Circuits, 1st Edition課后答案? Foundations of Analog and Digital Electronic Circuits, 1st Edition 誰有習題答案? http://store.elsevier.com/product.jsp?isbn=9781558607354… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析