UCOS通訊機制

2021-10-06 09:50:47 字數 3320 閱讀 7374

就緒表:

u8  osrdygrp;用來記錄是第幾組有中斷

u8  osrdytbl[8],用來記錄第幾組中的哪一位會產生中斷

同步:同步是靠著多個任務之間進行法資訊來實現的

事件:使用訊號量、訊息佇列、資訊郵箱的事件曾為事件

任務等待表:

跟就緒表一樣,當任務就進入延時等待的時候,就會將任務寫入任務等待表:oseventtbl中

u8  oseventgrp;用來記錄是第幾組有中斷

u8  oseventtbl[8],用來記錄第幾組中的哪一位會產生等待

ecb:這是事件控制塊,用來描述事件,訊號量、資訊佇列、資訊郵箱這些事件

事件的總數是由os_max_events來決定的,在cfg.h中存在定義

事件的通用操作:

oseventwaitlisinit();初始化事件控制塊

oseventtaskrdy();將等待任務進入就緒狀態

oseventwait()將任務進入等待事件的狀態

oseventto();將超時任務切換至就緒狀態

關於訊號量的函式

os_event *ossemcreat(u16 cnt)

引數:cnt指的是資源的個數

作用:建立乙個訊號量:

void ossempend(os_event *pevent,intu16 out,intu8 *err)

引數:pevent:資料指標

out:等待時間

err:返回的錯誤資訊

作用:請求獲得資源

int8u ossempost(os_event *pevent)

pevent:事件指標

作用:釋放資源

ossemaccept()

無等待地請求訊號量時,如果訊號無效的話那就簡單返回,一般在中斷中使用

查詢乙個訊號:ossemquery()

當請求訊號的時候,如果訊號量為0,那麼他將會進行等待

os_event *osmboxpost(os_event *pevent,coid *mesg)

作用:向資訊佇列傳送資訊

void *osmboxpend (os_event *pevent, int16u timeout, int8u *err) 

作用:檢視郵箱指標oseventptr 是否為null。如果不是,則把郵箱中的訊息指標返回給呼叫函式的任務;如果是,則使任務進入等待狀態,並引發一次任務排程

原型:int8u osmboxquery (os_event *pevent, os_mbox_data *pdata) 

osmboxquery()函式使應用程式可以隨時查詢乙個郵箱的當前狀態。

兩個引數:乙個是指向郵箱的指標pevent。該指標是在建立該郵箱時,由osmboxcreate()函式返回的;另乙個是指向用來儲存有關郵箱的資訊的os_mbox_data(見ucos_ii.h)資料結構的指標pdata。在呼叫osmboxcreate()函式之前,必須先定義該結構變數,用來儲存有關郵箱的資訊。 

void *osmboxaccept (os_event *pevent)

作用:無等待從郵箱得到也已資料,就算失敗也不會進行等待

任務可以呼叫函式osmboxdel()來刪除乙個郵箱

os_event osmboxdel(os_event  *pevent,int8u  opt,int8u  *err);

作用:刪除乙個郵箱

關於資訊佇列:

資訊佇列的組成:事件控制塊,資訊佇列,訊息

當把事件控制塊成員oseventtype設定成os_event_type_q 時,該事件控制塊描述的就是乙個訊息佇列

資訊佇列:訊息佇列相當於乙個共用乙個任務等待列表的訊息郵箱陣列,oseventptr指向乙個叫做佇列控制塊os_q的結構,該結構管理乙個陣列msgtbl[ ],該陣列的元素都是一些指向訊息的指標,msgtbl[ ]儲存的是所謂的資訊

os_q的資料結構:

.osqstart是指向訊息佇列的指標陣列的起始位址的指標。

.osqend是指向訊息佇列結束單元的下乙個位址的指標。該指標使得訊息佇列構成乙個迴圈的緩衝區。

.osqin是指向訊息佇列中插入下一條訊息的位置的指標。當.osqin和.osqend相等時,.osqin被調整指向訊息佇列的起始單元。

.osqout是指向訊息佇列中下乙個取出訊息的位置的指標。當.osqout和.osqend相等時,.osqout被調整指向訊息佇列的起始單元。

.osqsize是訊息佇列中總的單元數。該值是在建立訊息佇列時由使用者應用程式決定的。在μc/os-ii中,該值最大可以是65,535。

.osqentries是訊息佇列中當前的訊息數量。當訊息佇列是空的時,該值為0。當訊息佇列滿了以後,該值和.osqsize值一樣。 在訊息佇列剛剛建立時,該值為0。

控制塊的個數

os_cfg.h中的配置常數os_max_qs定義os_max_qs個佇列控制塊,並用佇列控制塊中的指標osqptr將所以佇列控制塊鏈結為鍊錶。由於這時還沒有使用它們,因此這個鍊錶叫做空佇列控制塊鍊錶。

函式原型:

os_event *osqcreate (void **start,int16u size  )

函式中的引數start為存放訊息緩衝區指標陣列的位址;引數size為該陣列的大小。函式的返回值是訊息佇列的指標。函式首先從空閒佇列控制塊鍊錶中摘取有乙個控制塊並按引數填寫逐項,然後把訊息佇列初始化為空。 

函式原型:

void *osqpend (

os_event *pevent, //所請求訊息佇列的指標

int16u timeout,

int8u *err) 

引數:pevent是要訪問的訊息佇列事件控制塊的指標;timeout是任務等待的時限。

返回值:訊息指標

osqpost()以fifo先進先出的方式

osqpostfront()以lifo後進先出的方式

函式原型:

int8u osqpost (

os_event *pevent,//訊息佇列的指標

void *msg)  //訊息指標

和int8u osqpostfront (

os_event *pevent,

void *msg)

清空訊息佇列osqflush()

原型:int8u osqflush (

os_event *pevent);//訊息佇列指標 

查詢訊息佇列osqquery()

int8u osqquery (

os_event *pevent, 

os_q_data *pdata) 

引數pdata是os_q_data *pdata型別的指標,他的結構是:

typedef structos_q_data;

UC OS 學習 任務的同步與通訊

事件 uc os中,通過使用訊號量 郵箱 訊息郵箱 和訊息佇列來實現任務之間的通訊,這些環節統稱為 事件 訊號量 訊號量通過ossemcreate函式來建立。引數為應用計數器,一般設定為1。請求任務時採用 ossempend 帶超時函式的請求和ossemaccept 無等待的函式,這兩個函式進入以後...

CUDA通訊機制

cuda體系架構支援怎麼樣的通訊方法呢?往下看嘍 1.syncthreads block 內的執行緒同步。block 內所有執行緒都執行到這一位置 bar指令 先到的要等後來的,到齊了後再繼續後面的任務。執行結果對 block 內所有執行緒可見 2.memory fence l threadfenc...

Socket通訊機制

socket套接字起源於美國泊克利大學.方便了開發網路應用程式.tcp面向連線的可靠傳輸協議,具有資料確認和資料重傳機制.保證了傳送資料一定能到達通訊的對方.對資料完整性要求比較高的場合使用 upd協議無連線,不可靠的傳輸協議.不具有資料確認和資料重傳機制,對資料完整性要求比較低的場合使用 ip 網...