娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年07月10日(星期三)

正在發生

2019年04月25日 | UCOIII中任務的調度和切換

發布者:SparklingStar 來源: eefocus關鍵字:UCOIII  任務  調度  切換 手機看文章 掃描二維碼
隨時隨地手機看文章

一、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為一個結構體,其中有些成員采用了條件編譯的方式來確定


關鍵字:UCOIII  任務  調度  切換 引用地址:UCOIII中任務的調度和切換

上一篇:UCOSIII任務創建、刪除、掛起和恢復
下一篇:UCOSIII系統初始化和啟動

推薦閱讀

“模塊化”是室內設計的熱門詞匯,如今這種理念已滲透到許多家居元素,如模塊化儲物箱、模塊化床,模塊化廚房以及今天要介紹的這款模塊化冰箱。Heewoong Chai設計了這款名為AddiTIon的全新家電。這是一套多功能冰箱系統,可根據使用者需要任意組合并調整尺寸,可以隨需求的增加而不斷擴充。另外,這款冰箱具備雙向鉸鏈,可以輕松改變向左或向右開門方向,...
專注于引入新品推動行業創新的電子元器件分銷商貿澤電子(Mouser Electronics)于今日在深圳大中華喜來登酒店舉辦“2019貿澤電子技術創新論壇暨5G+智能安防技術研討會”。本次大會以“物聯網遇上5G,安防應用新布局”為主題,展示物聯網新技術,探討智慧安防新格局,現場更有行業專業人士帶來精彩演講,詳細解讀5G+智能安防。這是2019年貿澤電子六大城市巡...
#include "tim4.h"#include "stm8s_tim4.h"#define TIM4_PERIOD 124void Dely1ms(void){TIM4_DeInit();/* Time base configuration */// 8M/64=125000HZ// (x + 1)/125000=0.001s = 1ms// x = 124TIM4_TimeBaseInit(TIM4_PRESCALER_64, TIM4_PERIOD);/* Clear TIM4 update flag */TIM4_ClearFlag(TIM4_FLAG_UPDATE);/* Enable u...
韓國首爾2021年4月23日 /美通社/ -- 斗山機器人(Doosan Robotics Inc.)宣布發布與最新ROS 2 Foxy Fitzroy兼容的斗山ROS 2包。斗山機器人于2021年初發布了ROS 2程序包,成為業界首家操作由最新版本ROS 2驅動的協作機器人的公司。斗山機器人斗山機器人宣布Doosan ROS2 程序包亮相,該程序包支持最新版ROS 2 Foxy Fitzroy 。斗山機器...

史海拾趣

問答坊 | AI 解惑

在Linux下些驅動程序,求助!

小弟現在C語言寫的還可以吧,IBM-PC8086匯編語言也學習了,當年也學習得很認真,也還算可以。準備轉向Linux下驅動程序開發上去 現在工具:s3c2410arm開發板 三星的 書籍:嵌入式LInux應用開發完全是手冊(韋東山 編著)      &n ...…

查看全部問答∨

windows CE下如果想實現收短信的功能,應該用什么API啊?

我用的是EVC,如何讀取SIM卡中的短信呢?工作方式是定時掃描還是有短信到來會觸發什么事件呢?哪位有經驗指點一二…

查看全部問答∨

問一個EVC開發環境的問題

我有兩個機器,都是XP的。 兩個機器裝EVC+SP4都可以,使用EVC默認模擬器都可以運行。 后來為了運行中文程序,下載了eeworld上sunrain_hjb上傳的CHSEmulator_SDK.msi。 (這里感謝一下sunrain_hjb) 兩個機器安裝以后,一個可以正常使用這個中文 ...…

查看全部問答∨

CSpinButtonCtrl使用問題

設置spin的范圍為 0-1000,顯示為0.0-100 處理方法如下: 在OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)         strValue.Format(L"%3.1f",   (double)nPos/10.0);    ...…

查看全部問答∨

產品開發

開發的產品大致如下:          產品由單片機、步進電機、泵,液晶觸摸屏等組成。單片機操控泵,步進電機。步進電機速度不用變,液晶觸摸屏顯示狀態的數據和更改數據,有樣品,        &nbs ...…

查看全部問答∨

2008,新年快樂!

                                 希望新的一年,我們能夠取得更大的進步,交到更多的朋友!…

查看全部問答∨

求助stm32晶振

我做的一個stm32的小系統,最近總出現程序不能下載的問題,換晶振后就好了,但是用過幾次后還是出現不能下載,換晶振換到焊盤都快壞了。打開jlink commander之后就是附件里的樣子,請問高手可能是什么問題?晶振質量不好?我并的是20pf的電容 ...…

查看全部問答∨

求助 STM8S103K3無法用ST-LINK仿真?

環境:IAR FOR STM8+STLINK.    STM8S103K3 做了2塊最小化系統板,STM8S103K3和STM8L152C6. STM8L152C6的最小化系統板可以用STLINK仿真. STM8S103K3的最小化系統板,可以用官方的編程軟件STVP下載程序并 ...…

查看全部問答∨

求教代死區的MOSFET驅動芯片都有哪些

我知道 IR公司的IR2130系列 還有別的嗎…

查看全部問答∨

誰有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…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 吉林省| 浠水县| 天峻县| 玉田县| 甘南县| 博野县| 伊宁市| 阳山县| 永定县| 中西区| 铜梁县| 南皮县| 兰州市| 泸州市| 乌兰县| 威宁| 平阴县| 大兴区| 大新县| 东城区| 嘉善县| 南宁市| 易门县| 青铜峡市| 伊川县| 来宾市| 从江县| 改则县| 阿克苏市| 浮山县| 克什克腾旗| 徐水县| 黑龙江省| 聂荣县| 福泉市| 道孚县| 象州县| 湖州市| 和田县| 通山县| 翼城县|