1. 程式人生 > >uC/OS-II核心架構解析---uC/OS-II通訊與同步

uC/OS-II核心架構解析---uC/OS-II通訊與同步

1. 訊息郵箱Mbox

      Mbox用於多工間單一訊息的傳遞,uC/OS-II使用ECB管理Mbox的基本資訊,OSEventPtr指向建立Mbox時指定的記憶體空間。事件的建立由具體的事件管理程式實現。主要包含在C原始檔OS_MBOX.C中。

  • OS_EVENT *OSMboxCreate(void *msg);
  • void *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  • void *OSMboxAccept(OS_EVENT *pevent);
  • INT8U OSMboxPost(OS_EVENT *pevent, void *msg);
  • INT8U OSMboxPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
  • OS_EVENT *OSMboxDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
  • INT8U OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *);

 

2. 訊息佇列msgQ

(1) msgQ基本內容

      msgQ是uC/OS-II任務間通訊的機制,可實現多條訊息傳遞,即可以同時儲存多條訊息。uC/OS-II使用迴圈佇列管理機制。主要包含在C原始檔OS_Q.C中。

      msgQ管理:使用指標陣列儲存所有訊息的位置;使用QCB標識指標陣列中訊息的基本資訊;使用ECB管理整個msgQ。QCB在編譯時分配空間,即當前系統中可用的msgQ個數是預先設定的,系統執行時不能修改。

 

(2) msgQ全域性變數

  • OS_EXT OS_Q *OSQTbl[OS_MAX_QS];   //QCB結構體陣列
  • OS_EXT OS_Q *OSQFreeList;                    //空閒QCB頭指標
  • typedef struct os_q{                                //訊息佇列控制塊

      struct os_q *OSQPtr;        //用於構建空閒QCB連結串列

      void **OSQStart;              //指向msgQ指標陣列的起始位置

      void **OSQEnd;               //指向msgQ指標陣列的結束位置

      void **OSQIn;    //指向msgQ指標陣列下一個可以插入訊息的位置

      void **OSQOut; //指向msgQ指標陣列下一個可以讀出訊息的位置

      INT16U OSQSize;            //msgQ指標陣列的大小

      INT16U OSQEntries;              //msgQ指標陣列當前可以讀取的訊息個數

              }OS_Q;

 

(3) msgQ管理函式

  • OS_EVENT *OSQCreate(void **start, INT16U size);
  • INT8U OSQPost(OS_EVENT *pevent, void *msg); //傳送訊息到隊尾
  • INT8U OSQPostFront(OS_EVENT *pevent, void *msg);      //msg至隊首
  • INT8U OSQPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
  • void *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  • void *OSQAccept(OS_EVENT *pevent, INT8U *err);
  • OS_EVENT *OSQDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
  • INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA*);
  • INT8U OSQFlush(OS_EVENT *pevent);

 

(4) msgQ幾個問題

      uC/OS-II中,什麼是事件?事件是uC/OS-II管理任務間同步與通訊的機制。

      事件是處理事件的物件感興趣的,能夠感知或捕獲到一種事件狀態的改變。

3. 訊號量Sem

      Sem主要用來實現任務間同步及標識某類資源的可用個數,即某個特定資源可供多少任務同時使用。主要包含在C原始檔OS_SEM.C中。

  • OS_EVENT *OSSemCreate(INT16U cnt);
  • void OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  • INT16U OSSemAccept(OS_EVENT *pevent);
  • INT8U OSSemPost(OS_EVENT *pevent);
  • OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
  • INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA*);
  • void OSSemSet(OS_EVENT *pevent, INT16U cnt, INT8U *err);

 

4. 互斥鎖Mutex

(1) Mutex基本原理

      Mutex用來實現對資源的排他性訪問,可能引起優先順序反轉。任何任務在佔有某個互斥鎖事件時,都不能阻塞等待其它任何事件,否則會造成死鎖。主要包含在C原始檔OS_MUTEX.C中。

      優先順序反轉是指,低優先順序任務佔有高優先順序任務執行所需的資源,而使高優先順序不得不等低優先順序任務把資源釋放才能執行。

      uC/OS-II使用ECB管理Mutex,其成員變數OSEventCnt:高8位儲存Mutex被使用時提供給任務的prio;低8位在沒有任務佔有Mutex時為0xFF,否則為佔有任務的prio。

      優先順序反轉優先順序反轉避免分別如下圖所示:

(2) 提升/恢復優先順序

    a) 提升Mutex擁有者任務的優先順序的相關操作:

  • 如果該任務原來處於就緒狀態,則從就緒表中將其刪除;如果該任務正在等待某個事件,則從該事件的任務等待表中將其刪除;
  • 修改擁有Mutex的TCB,將其OSTCBPrio修改為欲提升的優先順序;
  • 如果該任務處於就緒狀態,則將提升的優先順序載入到任務就緒表中;如果該任務未就緒且正在等待某個事件,則將提升的優先順序新增到該事件的任務等待表中,並修改TCB中OSTCBEventPtr;
  • 修改TCB中與優先順序相關的成員變數。

    b) 恢復Mutex擁有任務的優先順序的相關操作:

  • 從任務就緒表中刪除提升過的優先順序值,修改當前TCB中與優先順序相關的所有成員變數;
  • 再次保留提升的優先順序值控制塊入口,避免將其分配給其它任務。

(3)Mutex管理函式

  • #define  OS_MUTEX_KEEP_LOWER_8   0x00FF
  • #define  OS_MUTEX_KEEP_UPPER_8   0xFF00
  • #define  OS_MUTEX_AVAILABLE      0x00FF
  • OS_EVENT *OSMutexCreate(INT8U prio, INT8U *err);
  • void OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  • INT8U OSMutexAccept(OS_EVENT *pevent, INT8U *err);
  • INT8U OSMutexPost(OS_EVENT *pevent);
  • OS_EVENT *OSMutexDel(OS_EVENT*, INT8U opt, INT8U *err);
  • INT8U OSMutexQuery(OS_EVENT*, OS_MUTEX_DATA*);

5. 事件組標誌Flag

(1) Flag基本原理

      uC/OS-II提供事件組標誌實現多事件管理。Flag只是使用0/1來表示某個事件是否發生過,而不能直接被用來傳遞資料和訊息。可以選擇性地設定一個Flag最多可以管理的任務同步狀態。主要包含在C原始檔OS_FLAG.C中。

 

(2) Flag資料結構

  • #define OS_FLAGS_NBITS 8/16/32     //定義OS_FLAGS的位數
  • FCB結構體:

   typedef struct os_flag_grp{

          INT8U OSFlagType;                        //事件型別

          void *OSFlagWaitList;                      //指向等待的任務連結串列

          OS_FLAGS OSFlagFlags;               //訊號列表

          INT8U OSFlagName[OS_FLAG_NAME_SIZE];

    }OS_FLAG_GRP;

  • 事件標誌等待連結串列結點

   typedef struct os_flag_node{

          void *OSFlagNodeNext;

          void *OSFlagNodePrev;

          void *OSFlagNodeTCB;

          void *OSFlagNodeFlagGrp;          //指向此任務所等待的事件組標誌

          OS_FLAGS OSFlagNodeFlags;     //等待的事件

          INT8U OSFlagNodeWaitType;       //等待方式

    }OS_FLAG_NODE;

  • OS_EXT OS_FLAG_GRP OSFlagTbl[OS_MAX_FLAGS];
  • OS_EXT OS_FLAG_GRP *OSFlagFreeList;
  • OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags, INT8U *err);
  • OS_FLAGS OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags,

(3) Flag管理函式

  • INT8U wait_type, INT16U timeout, INT8U *err);
  • static void OS_FlagBlock(OS_FLAG_GRP *pgrp, 

            OS_FLAG_NODE *pnode,

            OS_FLAGS flags,

            INT8U wait_type,    //掛起任務,

            INT16U timeout);     //直到等待的事件或超時

              類似於:OS_EventTaskWait();

  • void OS_FlagUnlink(OS_FLAG_NODE *pnode);   //等待超時刪除結點

      類似於:OS_EventTO();

  • OS_FLAGS OSFlagAccept(OS_FLAG_GRP *pgrp,

            OS_FLAGS flags,

            INT8U wait_type,

            INT8U *err);

  • OS_FLAGS OSFlagPost(OS_FLAG_GRP *pgrp,

            OS_FLAGS flags,

            INT8U opt,

            INT8U *err);

  • static BOOLEAN OS_FLAGTaskRdy(OS_FLAG_NODE *pnode,

            OS_FLAGS flags_rdy);

  • OS_FLAG_GRP *OSFlagDel(OS_FLAG_GRP*, INT8U opt, INT8U *err);
  • OS_FLAGS OSFlagPendGetFlagsRdy(void);    //獲取任務就緒標誌
  • OS_FLAGS OSFlagQuery(OS_FLAG_GRP*, INT8U *err);
  • INT8U OSFlagNameGet(OS_FLAG_GRP*, INT8U *pname, INT8U *err);
  • void OSFlagNameSet(OS_FLAG_GRP*, INT8U *pname, INT8U *err);

 

6. Task就緒狀態判斷???

    a) OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX != 0

        如:函式OSMutexPend()

    b) (ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY

        如:函式OSTimeTick()

    c) ptcb->OSTCBStat == OS_STAT_RDY

        如:函式OS_EventTaskRdy()

相關推薦

uC/OS-II核心架構解析---uC/OS-II通訊同步

1. 訊息郵箱Mbox       Mbox用於多工間單一訊息的傳遞,uC/OS-II使用ECB管理Mbox的基本資訊,OSEventPtr指向建立Mbox時指定的記憶體空間。事件的建立由具體的事件管理程式實現。主要包含在C原始檔OS_MBOX.C中。 OS_EVENT

µC/OS-II核心任務排程模組的擴充套件

  摘 要:µC/OS-II是一個實時作業系統核心,支援64種不同優先順序的任務。以簡單實用為原則,借用核心中的兩個優先順序任務,充當時鐘源和輪詢引擎,讓同級任務在最低優先順序任務下輪流執行。這在不失實時性的前提下,讓核心支援多達192個同級任務,極大地擴充套件了µC/OS

netty原始碼解解析(4.0)-1 核心架構

netty是java開源社群的一個優秀的網路框架。使用netty,我們可以迅速地開發出穩定,高效能,安全的,擴充套件性良好的伺服器應用程式。netty封裝簡化了在伺服器開發領域的一些有挑戰性的問題:jdk nio的使用;多執行緒併發;擴充套件性。它還提供了多種應用層協議的支援:http/https/web

netty源碼解解析(4.0)-1 核心架構

coder style out ava 默認 mage 網絡框架 分享圖片 輸入 netty是java開源社區的一個優秀的網絡框架。使用netty,我們可以迅速地開發出穩定,高性能,安全的,擴展性良好的服務器應用程序。netty封裝簡化了在服務器開發領域的一些有挑戰性的問題

Tensorflow原始碼解析1 -- 核心架構和原始碼結構

1 主流深度學習框架對比 當今的軟體開發基本都是分層化和模組化的,應用層開發會基於框架層。比如開發Linux Driver會基於Linux kernel,開發Android app會基於Android Framework。深度學習也不例外,框架層為上層模型開發提

螞蟻金服 mPaaS 服務端核心元件:億級併發下的移動端到端網路接入架構解析

根據《mPaaS 服務端核心元件體系概述:移動 API 閘道器 MGS》,我們已經初步瞭解 mPaaS 服務端眾多元件中移動 API 閘道器 MGS 的具體架構設計和簡介。 本文結合賈島在 TGO 鯤鵬會舉辦的「走進螞蟻金服:雙十一背後的螞蟻金服技術支援」活動現場分享內容《億級併發下的螞蟻移動端到端網路接入

第五章:Mac OS X核心故事之從32位到64位

第五章:Mac OS X核心故事之從32位到64位      自從標配4G記憶體的筆記本面市以來,我就非常關心預裝作業系統是32位還是64位的,因為雖然理論上32位Win可以用到4G記憶體,但由於一部分記憶體要給系統和其他硬體裝置預留,使用者可見的記憶體並沒有4G,大概只

[Mac OS X] 核心、驅動除錯

Kernel Debug Kit是蘋果官方提供的除錯工具包。 每個正式版本的系統都會有對應的Kernel Debug Kit,裡面包括以下內容 1.系統所有驅動及其符號表(.dSYM格式) 2.系統核心及其符號表(.dSYM格式),還有個debug kernel,debug

Mac OS X核心程式設計,MAC驅動開發資源彙總

一.Mac  OS  X核心程式設計開發官方文件: I/O Kit Fundamentals: I/O Kit基礎 - Mac OS X系統核心程式設計 Threading Programming Guide:MAC OS X 執行緒程式設計指南 - Mac OS

開篇和第一章:Mac OS X核心故事之“N國語言”

開篇宣告:      1、寫作動機和熱情來自兩方面:一是自喬幫主迴歸後,蘋果公司經歷了從瀕臨破產到全球市值第一的華麗轉身,其產品風靡全球。我本人當了4年的蘋果使用者,3年的weiphoner,在罈子上看到每天都有大量新人加入Mac/iOS大家庭,但是長期處於Win統治之下的

三星KNOX中Trustzone核心完整性動態度量方案(TIMA架構)解析

三星TIMA方案利用Trustzone安全模組對普通世界作業系統核心提供執行時完整性保護,即使作業系統被攻擊者控制,也無法(1)修改原有合法核心程式碼(2)注入新的核心惡意程式碼(3)實施return-to-user攻擊,將使用者空間惡意程式碼在核心層執行。 這種設計思路的

Mac OS X 核心Rootkit開發指南

1.引言 1.1 背景介紹         困 擾著不同作業系統的Rootkit已經由來已久,Linux,Windiws,還有各種類BSD等系統都受到了Rootkit的極大危害。目前廣泛使用的 一類“核心Rootkit”,是原來“檔案轉移Rootkit”的衍生和發展。這種發

Zephys OS nano 核心篇:環形緩衝 Ring Buffer

Zephyr OS 所有的學習筆記已託管到 Github,CSDN 部落格裡的內容只是 Github 裡內容的拷貝,因此連結會有錯誤,請諒解。 與棧有點類似,環形緩衝的大小也是在初始化時就固定了。 環形緩衝的型別定義 s

[轉]畢設- 深入HBase架構解析(一)

mil https 文件存儲 back 高效 索引 asa dia 隨機 深入HBase架構解析(一) 前記 公司內部使用的是MapR版本的Hadoop生態系統,因而從MapR的官網看到了這篇文文章:An In-Depth Look at the HBase Ar

[轉]畢設- 深入HBase架構解析(二)

node 角度 發送 under 收集 .org fig 服務器 url 深入HBase架構解析(二) 前言 這是《深入HBase架構解析(一)》的續,不多廢話,繼續。。。。 HBase讀的實現 通過前文的描述,我們知道在HBase寫時,相同Cell(RowKe

Android核心服務解析篇(三)——Android系統的啟動

onf med cin gets get lld 系統屬性 基本 安裝模塊 從大的方面來說。Android系統的啟動能夠分為兩個部分:第一部分是Linux核心的啟動,第二部分是Android系統的啟動。第一部分主要包含系統引導,核心和驅動程序等,因為它們不屬於本篇要講的

通過自動回復機器人學Mybatis(搭建核心架構

root -c 驅動 ear resource any 異常 cep driver imooc視頻學習筆記 ----> URL:http://www.imooc.com/learn/154 MessageDao.java package com.imooc.d

python中os路徑相關的函數 os.mkdir和os.makedirs

sdn art fun str dir() python indent net oar 傳送門:http://blog.csdn.net/shennongzhaizhu/article/details/51455063 在Python中可以使用os.mkdir()函數創

[轉]GeoHash核心原理解析

解析 知識 比較 lpad 文章 target .org 情況 作者 註:最近做項目需要這方面的知識,恰逢此文,甚喜。我轉的文章也是轉別人的,未找到原作者。 引子 機機是個好動又好學的孩子,平日裏就喜歡拿著手機地圖點點按按來查詢一些好玩的東西。某一天機機到北海公園

LAMP原理架構解析(三):LAMP編譯安裝

mariadbCentos7.3編譯安裝LAMP目錄:編譯環境LAMP編譯安裝一.環境準備 征信數據庫數據事件不一致導致數據(RAC集群)混亂,PLSQL查詢時間和數據庫時間不一致,嚴重影響業務本文出自 “每天進步一點點,自律” 博客,請務必保留此出處http://wbxue.blog.51cto.