NuttX的學習筆記 10

2021-07-25 14:19:41 字數 4663 閱讀 8487

命名訊息佇列的介面

nuttx支援posix命名訊息佇列inter-task通訊。任何任務都能能通過命名訊息佇列傳送或接收訊息。中斷處理程式可以通過命名訊息佇列傳送訊息。我理解就是程序之間通訊需要乙個訊息通道,訊息佇列就是這樣乙個通道,而其標識就是這個「named」。

mqd_t mq_open(const char *mqname, int oflags, …);

oflags

意義o_rdonly

讀訪問o_wronly

寫訪問o_rdwr

讀和寫o_creat

如果不存在時建立訊息佇列。

o_excl

開啟時名稱必須不存在

o_nonblock

不要等待資料。 .

這是乙個引數數量可變的函式,根據標頭檔案中的描述,當o_creat這個oflags被使用時,該函式將另外需要兩個引數:mode_t modestruct mq_attr *attr

#define s_ixoth|  0000001 /* permissions for others: run only */

#define s_iwoth 0000002 /* permissions for others: write only */

#define s_iroth 0000004 /* permissions for others: read only */

#define s_irwxo 0000007 /* permissions for others: all */

#define s_ixgrp 0000010 /* group permissions: run only */

#define s_iwgrp 0000020 /* group permissions: write only */

#define s_irgrp 0000040 /* group permissions: read only */

#define s_irwxg 0000070 /* group permissions: all */

#define s_ixusr 0000100 /* owner permissions: run only */

#define s_iwusr 0000200 /* owner permissions: write only */

#define s_irusr 0000400 /* owner permissions: read only */

#define s_irwxu 0000700 /* owner permissions: all */

struct mq_attr *attr

可以找到定義:

struct mq_attr ;
看起來是一些屬性。

*我決定每乙個函式函式後都加上測試,然後發現這個直接上來就寫有點難,然後全工程搜尋,發現了乙個叫ostest的例子。細細一看,盡然包含了之前所有的函式,簡直沒天理啊。。將其下mqueue.c檔案中的**拷過來,加個巨集定義居然就能用了。我先試試開啟這個例子把。結果是完全能用,真後悔沒有早點發現這個例子。有空把前面的坑全都補上。包括那個等待所有子程序的坑。所有有關程序鎖,訊息佇列的例子**都在這個ostest裡面*

int mq_close(mqd_t mqdes);

這個函式是用來表明呼叫任務已經完成了指定描述符的訊息排隊。mq_close()收回分配任何系統資源分配的系統訊息佇列使用的這個任務。

簡單的來說就是關閉訊息佇列。通過引數也就是訊息佇列的描述符。

int mq_unlink(const char *mqname);

這個函式使用來刪除訊息佇列,如果訊息佇列已經被開啟,那麼將等到其被關閉時再刪除。

int mq_send(mqd_t mqdes, const void *msg, size_t msglen, int prio);

這個函式將乙個大小為msglen bytes的資訊(由msg指向的字串)新增到由訊息佇列描述符mqdes指定的訊息佇列中。最大長度不得超過由mq_getattr()獲得的長度。這裡,mq_getattr()返回的是乙個結構體:

struct mq_attr ;
這裡所指的是成員mq_msgsize

這裡對應三種情況:

正確返回ok;錯誤返回error並返回錯誤**:

errno

詳細eagain

訊息隊列為空,且o_nonblock置位

einval

引數有錯

eperm

訊息佇列開啟方式不可寫

emsgsize

長度超出

eintr

呼叫時被中斷

ssize_t mq_receive(mqd_t mqdes, void *msg, size_t msglen, int *prio);

函式將接受最高優先順序中存放時間最久的資訊。如果msg指向的空間不足以存放資訊,那麼函式將返回錯誤。否則,資訊將從佇列中移動到msg指向的空間內。

如果隊列為空且o_nonblock沒有置位,那麼函式將鎖定直到佇列中有資訊。如果有很多任務在等待,那麼只有等待時間最久的優先順序最高的任務才能解鎖。

如果隊列為空且o_nonblock置位,那麼函式將返回錯誤和錯誤引數。

errno

詳細eagain

訊息隊列為空,且o_nonblock置位

eperm

訊息佇列開啟方式不可寫

emsgsize

長度超出

eintr

呼叫時被中斷

einval

引數有錯

ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen, int *prio, const struct timespec *abstime);

函式將接受最高優先順序中存放時間最久的資訊。如果msg指向的空間不足以存放資訊,那麼函式將返回錯誤。否則,資訊將從佇列中移動到msg指向的空間內。

如果隊列為空且o_nonblock沒有置位,那麼函式將鎖定直到佇列中有資訊。如果有很多任務在等待,那麼只有等待時間最久的優先順序最高的任務才能解鎖。

唯一一點不同的是,如果o_nonblock沒有被啟用,那麼函式將會等待一段時間,由結構體abstime來確定,之後沒有訊息的話將立刻返回。

注意:這裡是絕對時間。要先獲取當前系統時間,然後在加上需要等待的時間。

errno

詳細eagain

訊息隊列為空,且o_nonblock置位

eperm

訊息佇列開啟方式不可寫

emsgsize

長度超出

eintr

呼叫時被中斷

einval

引數有錯

etimedout

超時

int mq_notify(mqd_t mqdes, const struct sigevent *notification);

呼叫該函式的任務將註冊為接受訊息佇列(由訊息佇列描述符mqdes指定)的通知。

如果notification輸入引數不為null,當訊息佇列從空狀態變為非空狀態時,函式將傳送乙個訊號到註冊該訊息佇列通知的任務。

如果notification輸入引數為null,那麼已存在的註冊將被分離(如果當前程序已經註冊為接收指定佇列的通知),訊息佇列將可用於註冊為其他訊號。

當訊號notification被傳送至程序後,該註冊將被移除,訊息佇列可用於新的註冊。

notification由實時訊號結構體sigevent定義:

struct sigevent ;
這裡解釋一下:

sigev_notify

意義sigev_signal

sigev_signo傳送到程序

sigev_none

空的通知

sigev_thread

根據後面的定義看起來,該方法沒有效果或者不可用,先忽略

由於這個ostest很重要,就先寫到這裡。有機會再補。

nuttx學習 0 模擬安裝

一.nuttx 模擬執行環境的安裝 1.2.環境要求 sudo apt get install git sudo apt get install vim sudo apt get install python sudo apt get install build essentials sudo ap...

學習筆記10

類與物件 物件 屬性 方法 用class定義python類,然後接類的名稱和冒號。python的self相當於c 的this指標。self是類中乙個額外的第乙個引數名稱 在呼叫方法時 無需明確提供與引數self相對應的引數。魔法方法 init self param1,param2 這個方法在類例項化...

學習筆記10

2.塊裝置i o棧 2.1基本概念 介紹塊裝置的i o棧之前,我們先來了解一下塊i o棧的幾個基本概念。1 bio bio是通用塊層i o請求的資料結構,表示上層提交的i o請求,乙個bio包含多個page,這些page必須對應磁碟上一段連續的空間。由於檔案在磁碟上並不連續存放,檔案i o提交到塊裝...