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

歷史上的今天

今天是:2025年04月25日(星期五)

2019年04月25日 | UCOSIII任務堆棧、控制塊及就緒表

發布者:EtherealGrace 來源: eefocus關鍵字:UCOSIII  任務堆棧  控制塊  就緒表 手機看文章 掃描二維碼
隨時隨地手機看文章

一、UCOSIII任務堆棧


1、任務堆棧的創建


堆棧是在RAM中按照“先進先出(FIFO)”的原則組織的一塊連續的存儲空間。為了滿足任務切換和響應中斷時保存CPU寄存器中的內容及任務調用其它函數時的需要,每個任務都應該有自己的堆棧。


如何創建?


#define START_STK_SIZE           512  //堆棧大小


CPU_STK START_TASK_STK[START_STK_SIZE];   //定義一個數組來作為任務堆棧


可查看main.c的29行,跳轉可知堆棧大小:


CPU_STK為CPU_INT32U類型,也就是unsigned int類型,為4字節的,那么任務堆棧START_TASK_STK的大小就為:512 X 4=2048字節!


2、任務堆棧的初始化


任務如何才能切換回上一個任務并且還能接著從上次被中斷的地方開始運行?


恢復現場即可,現場就是CPU的內部各個寄存器。因此在創建一個新任務時,必須把系統啟動這個任務時所需的CPU各個寄存器初始值事先存放在任務堆棧中。這樣當任務獲得CPU使用權時,就把任務堆棧的內容復制到CPU的各個寄存器,從而可以任務順利地啟動并運行。


把任務初始數據存放到任務堆棧的工作就叫做任務堆棧的初始化,UCOSIII提供了完成堆棧初始化的函數:OSTaskStkInit():


CPU_STK  *OSTaskStkInit (OS_TASK_PTR    p_task,

                         void          *p_arg,

                         CPU_STK       *p_stk_base,

                         CPU_STK       *p_stk_limit,

                         CPU_STK_SIZE   stk_size,

                         OS_OPT         opt)

用戶一般不會直接操作堆棧初始化函數,任務堆棧初始化函數由任務創建函數OSTaskCreate()調用。不同的CPU對于的寄存器和對堆棧的操作方式不同,因此在移植UCOSIII的時候需要用戶根據各自所選的CPU來編寫任務堆棧初始化函數。


可查看UCOSIII_PORT中的os_cpu_c.c中227行


3、如何使用創建的任務堆棧?


作為任務創建函數OSTaskCreate()的參數,函數OSTaskCreate()如下:


void  OSTaskCreate (OS_TCB         *p_tcb,             //任務控制塊

                    CPU_CHAR     *p_name,         //任務名字

                    OS_TASK_PTR   p_task,             //任務函數

                    void           *p_arg,             //傳遞給任務函數的參數

                    OS_PRIO        prio,               //任務優先級

                    CPU_STK       *p_stk_base,    //任務堆棧基地址 一般0

                    CPU_STK_SIZE   stk_limit,   //任務堆棧棧深 一般堆棧大小/10

                    CPU_STK_SIZE   stk_size,    //任務堆棧大小            前面創建的

                    OS_MSG_QTY   q_size,

                    OS_TICK        time_quanta,

                    void           *p_ext,      //用戶補充的存儲區

                    OS_OPT        opt,

                    OS_ERR        *p_err)      //存放該函數錯誤時的返回值

可查看main.c中79行的任務開始函數


4、堆棧增長方式


函數OSTaskCreate()中的參數p_stk_base如何確定?


根據堆棧的增長方式,堆棧有兩種增長方式:


向上增長:堆棧的增長方向從低地址向高地址增長。


向下增長:堆棧的增長方向從高地址向低地址增長。


函數OSTaskCreate()中的參數p_stk_base是任務堆棧基地址,那么如果CPU的堆棧是向上增長的話那么基地址就&START_TASK_STK[0],如果CPU堆棧是向下增長的話基地址就是&START_TASK_STK[START_STK_SIZE-1]STM32的堆棧是向下增長的!


二、UCOSIII任務控制塊


1、任務控制塊結構


任務控制塊是用來記錄與任務相關的信息的數據結構,每個任務都要有自己的任務控制塊。任務控制塊由用戶自行創建,如下代碼為創建一個任務控制塊:


OS_TCB StartTaskTCB;  //創建一個任務控制塊


OS_TCB為一個結構體,描述了任務控制塊,任務控制塊中的成員變量用戶不能直接訪問,更不可能改變他們。


OS_TCB為一個結構體,其中有些成員采用了條件編譯的方式來確定


struct os_tcb

 

{

 

    CPU_STK             *StkPtr;  //指向當前任務堆棧棧頂                         

 

    void                *ExtPtr; //指向用戶可定義的數據取                           

 

    CPU_STK             *StkLimitPtr;//可指向任務堆棧中的某個位置

 

    OS_TCB              *NextPtr; //NexPtr和PrevPtr用于在任務就緒表建立OS_TCB

 

    OS_TCB              *Prev

 

    ……                              //此處省略N個成員變量

 

 #if OS_CFG_DBG_EN > 0u

 

    OS_TCB              *DbgPrevPtr;//下面三個成員變量用于調試

 

    OS_TCB              *DbgNextPtr;

 

    CPU_CHAR            *DbgNamePtr;

 

 #endif

 

}

可查看main.c中26行進行跳轉,里面有很多的成員變量


2、任務控制塊初始化


函數OSTaskCreate()在創建任務的時候會對任務的任務控制塊進行初始化。


函數OS_TaskInitTCB()用與初始化任務控制塊。用戶不需要自行初始化任務控制塊。


可查看os_task.c中341行


三、UCOSIII任務就緒表


1、優先級:


UCOSIII中任務優先級數由宏OS_CFG_PRIO_MAX來配置,UCOSIII中數值越小,優先級越高,最低可用優先級就是OS_CFG_PRIO_MAX-1。


可查看UCOSIII_CONFIG中os_cfg.c中47行


2、就緒表


    UCOSIII中就緒表由2部分組成:


    1、優先級位映射表OSPrioTbl[]:用來記錄哪個優先級下有任務就緒。


    2、就緒任務列表OSRdyList[]:用來記錄每一個優先級下所有就緒的任務。


OSPrioTbl[]在os_prio.c中有定義:


CPU_DATA   OSPrioTbl[OS_PRIO_TBL_SIZE]; //UCOSIII_CORE中os_prio.c中41行


跳轉可知:


在STM32中CPU_DATA為unsigned int,有4個字節,32位。因此表OSPrioTbl每個參數有32位,其中每個位對應一個優先級。


OS_PRIO_TBL_SIZE=((OS_CFG_PRIO_MAX - 1u) / DEF_INT_CPU_NBR_BITS)+ 1)


其中OS_CFG_PRIO_MAX由用戶自行定義,默認為64。


DEF_INT_CPU_NBR_BITS= CPU_CFG_DATA_SIZE * DEF_OCTET_NBR_BITS


CPU_CFG_DATA_SIZE=CPU_WORD_SIZE_32=4。


DEF_OCTET_NBR_BITS=8。


所以,當系統有64個優先級的時候:


OS_PRIO_TBL_SIZE=((64-1)/(4*8)+1)=2。


2.1、如何找到已經就緒了的最高優先級的任務?


函數OS_PrioGetHighest()用于找到就緒了的最高優先級的任務:源碼在UCOSIII_CORE中os_prio.c中85行


OS_PRIO  OS_PrioGetHighest (void)

 

{

 

    CPU_DATA  *p_tbl;

 

    OS_PRIO    prio;

 

    prio  = (OS_PRIO)0;

 

    p_tbl = &OSPrioTbl[0];//從OSProTb[0]開始掃描映射表,一直遇到非零項

 

while (*p_tbl == (CPU_DATA)0) {

 

//當數組OSProTb[]中某個元素為0時,就繼續掃描下一個素組元素,prio加DEF_INT_CPU_NBR_BITS位

 

       prio += DEF_INT_CPU_NBR_BITS;

 

       p_tbl++;// p_tbl加一,繼續尋找OSProTb[]中下一個元素

 

}

 

//一旦找到一個非0項,再加上該項的前導0數量就找到了最高優先級任務了

 

    prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl); //計算前導0:計算0的個數

 

    return (prio);

2.2就緒任務列表


通過上一步我們已經知道了哪個優先級的任務已經就緒了,但是UCOSIII支持時間片輪轉調度,同一個優先級下可以有多個任務,因此我們還需要在確定是優先級下的哪個任務就緒了


struct  os_rdy_list {

 

    OS_TCB           *HeadPtr    //用于創建鏈表,指向鏈表頭

 

    OS_TCB           *TailPtr;   //用于創建鏈表,指向鏈表尾

 

    OS_OBJ_QTY       NbrEntries; //此優先級下的任務數量

 

};     //全局變量查找:在os.h中1184行  

     

同一優先級下如果有多個任務的話,最先運行的永遠是HeadPtr所指向的任務!達到左右任務輪詢執行。


UCOSIII內部使用的幾個函數:

關鍵字:UCOSIII  任務堆棧  控制塊  就緒表 引用地址:UCOSIII任務堆棧、控制塊及就緒表

上一篇:UCOSIII系統初始化和啟動
下一篇:UCOSIII任務管理中的幾個關鍵名詞解釋(任務及任務狀態)

推薦閱讀

過去我們一直以為造芯是硬件公司的事兒,但從國外谷歌微軟到Facebook,再到國內的BAT,互聯網巨頭已經開啟了新一輪的造芯潮。AI芯片領域 BAT或投資或自研,動作頻頻在中興被美國商務部制裁、輿論發酵的時間點,上周四阿里對外宣布,其新近成立的研發機構——探索冒險動量和展望學院——將致力于研發名為Ali-NPU的人工智能芯片,該芯片可供任何人通過公共...
這場斗爭遠未結束,中國的作用可能至關重要 未來,也許騎馬都會比駕駛一輛沒有自動駕駛功能的汽車有用。這句話來自一向喜歡虛張聲勢的特斯拉CEO埃隆·馬斯克(Elon Musk)。 隨著車企向自動駕駛汽車技術投入數十億美元資金,即使他們可能會對馬斯克的夸夸其談避而遠之,但似乎很少有競爭對手會不同意這位億萬富翁的預測。 確實,汽車廠商希望,在不久的將...
1、編譯時出現.ubsct size overflow--http://blog.sina.com.cn/s/blog_817a5eb601018186.html----------- Project roewe - STM8 Cosmic - Configuration Debug -------------Running Linkerclnk -l"C:Program FilesCOSMICCXSTM8Lib" -o Debugroewe.sm8 -mDebugroewe.map Debugroewe.lkf#error clnk Debugroewe.lkf:1 segment .ubsc...
4月25日午間消息,第四屆數字中國建設峰會今日開幕,期間,中興通訊對外公布了公司最新的全球專利數、5G必要標準數以及技術價值等數據。  據中興通訊介紹,截至2021年3月,中興通訊擁有8萬余件全球專利申請,歷年全球累積授權專利3.8萬余件,其中芯片專利申請4270件,授權超過1800件。根據國際知名專利數據公司IPLytics 2021年2月發布的《5G專利競賽的...

史海拾趣

問答坊 | AI 解惑

AVR系列單片機C語言編程與應用實例2

AVR系列單片機C語言編程與應用實例2…

查看全部問答∨

如何關閉對話框

我用WTL開發界面,用DoMode()調用對話框,但用EndDialog(0)關閉對話框時出現錯誤。 顯示IsWindow(m_hWnd) 這是為什么 請教高手…

查看全部問答∨

uClinux在ARM開發板44b0芯片上運行程序,提示中斷異常錯誤?

請教高人,在44B0的ARM開發板上uClinux操作系統下,調試ADC與LCD應用程序。     兩個程序分別運行的時候,都正常。但是把ADC與LCD應用程序都加入到一個文件work中,編譯后運行,就提示如下問題: Unhandled fault: alignment exception ...…

查看全部問答∨

如何在WinCE里加入 ping命令?

如何在WinCE里加入 ping命令?…

查看全部問答∨

100分:最新的新手請教最基礎的問題

大家好,剛剛接觸WINCE,什么都不懂,現請教幾個問題: 我使用一個軟件(西門子WinCC flexible)來開發監控程序,然后下載到觸摸屏(MP370)上。下載程序的功能是WinCC flexible自身提供的。 在觸摸屏上運行的是windows se 3.1英文系統。觸摸屏提供了RS2 ...…

查看全部問答∨

EE_FPGA 2.0版本出爐!狂多PCB!

      迫不及待地焊接了一個     …

查看全部問答∨

PWM輸出的占空比如何改變

void TIM_Configuration(void)//TIM初始化函數{   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定時器初始化結構  TIM_OCInitTypeDef  TIM_OCInitStructure;//通道輸出初始化結構 //TIM3初始化  TIM_DeInit(TIM2) ...…

查看全部問答∨

(轉自深度技術)讓Ubuntu也能運行Windows程序-Wine的安裝與使用

花了這么多心血才搞好的,我覺得此貼已經具備了置頂的素質,望版主把此貼置頂,讓更多的人能來學習Linux,用好Linux。轉載請注明出處。   安好了ubuntu,擺弄了幾天,基本上手了,已經愛上了Linux,但因為用Windows這么長時間了 ...…

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

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 馆陶县| 德兴市| 西贡区| 偏关县| 汝阳县| 上虞市| 天祝| 昭平县| 池州市| 屏东市| 万山特区| 揭阳市| 辽中县| 定安县| 南皮县| 大新县| 怀仁县| 乌审旗| 湘乡市| 荃湾区| 温州市| 重庆市| 英吉沙县| 饶阳县| 乐清市| 惠安县| 雷波县| 邯郸市| 晋城| 壶关县| 庄河市| 东乌珠穆沁旗| 菏泽市| 和政县| 徐水县| 富川| 奈曼旗| 清水河县| 二连浩特市| 南陵县| 广饶县|