1. 程式人生 > >【原創】xenomai核心解析--xenomai與普通linux程序之間通訊XDDP(三)--實時與非實時資料互動

【原創】xenomai核心解析--xenomai與普通linux程序之間通訊XDDP(三)--實時與非實時資料互動

前面兩篇文章我們看了xddp在xenomai核心裡涉及的資料結構、RTDM對於協議類實時裝置的管理方式,以及實時端建立一個XDDP通道後(xddp必須由實時端來建立),實時端與非實時端是如何聯絡起來的,本文從linux端開啟建立好的xddp通道開始,來詳細看整個通訊過程。 [TOC] # 1.概述 [【原創】實時IPC概述](https://www.cnblogs.com/wsg1100/p/13758250.html) [【原創】xenomai與普通linux程序之間通訊XDDP(一)--實時端socket建立流程 ](https://www.cnblogs.com/wsg1100/p/13758767.html) [【原創】xenomai與普通linux程序之間通訊XDDP(二)--實時與非實時關聯(bind流程) ](https://www.cnblogs.com/wsg1100/p/13782711.html) 前面兩篇文章我們看了xddp在xenomai核心裡涉及的資料結構、RTDM對於協議類實時裝置的管理方式,以及實時端建立一個XDDP通道後(xddp必須由實時端來建立),實時端與非實時端是如何聯絡起來的。 ![rtipc-arch](https://wsg-blogs-pic.oss-cn-beijing.aliyuncs.com/xenomai/rtipc-arch.png) 以上工作做好後,下面可以進行資料互動了,本文從linux端開啟建立好的xddp通道開始,來詳細看整個通訊過程。 1. 實時端建立xddp socket,通過bind指定socket使用的埠號,或者給socket設定一個label,埠號自動分配。實時與非實時通過socke使用的埠號來關聯,在linux端,埠號即xnpip裝置的次裝置號。 2. 通過指定埠通訊時,linux通過直接讀寫xnpipe裝置(`/dev/rtpN`,N為埠號)來通訊。使用label時,由於實時端埠號為自動分配,所以只能linux端只能通過讀寫檔案`/proc/xenomai/registry/rtipc/xddp/%s`來通訊,`%s`為通訊使用的label。 3. 非實時向實時端傳送資料:通訊過程中,由於xnpipe可看做一個全雙工裝置,有兩個資料鏈表,命名以實時端為主,`inq`表示接收資料報連結串列(NRT->RT),`outq`為傳送資料報連結串列(RT->NRT)。對於linux端,每次傳送的資料都作為一個數據報節點插入到連結串列`inq`尾,實時端讀取時從連結串列頭取資料,符合FIFO。 4. 實時向非實時傳送資料,分三種資料: - 不帶標識的資料包會作為一個單獨的資料報節點插入連結串列`outq`尾。 - 使用MSG_OOB標識時,表示這是一個緊急的資料,需要優先被linux端讀取,這時會作為一個單獨的資料報節點插入連結串列`outq`**頭**。liunx端讀取時從連結串列頭取資料,所以除MSG_OOB標識的資料外,符合FIFO。 - 使用MSG_MORE標識時,表示還有資料要與該資料一起傳送,暫時不作為單獨資料包傳送(不放到`outq`),先積累到資料緩衝區,待緩衝區滿或者傳送的資料沒有MSG_MORE時,將整個緩衝區作為一個大的資料包插入連結串列`outq`尾。 整個XDDP使用過程中: 1. 建立xddp通道時,所有資料結構需要的記憶體均已申請。資料收發過程中,資料互動使用的記憶體從xnheap申請釋放,同步、互斥、喚醒使用的是xenomai核心機制,所以整個通訊由xenomai核心管理,保證了xenomai的實時性; 2. 對於linux向xenomai傳送的資料,xenomai任務在xenomai的排程下能很快讀取,看任務具體優先順序等。 3. 對於xenomai傳送給linux的資料,如果非實時任務阻塞讀,會使用ipip虛擬中斷機制APC來通知linux喚醒該任務,待linux得到cpu時,自會處理虛擬中斷APC,喚醒接收的非實時任務處理資料,整體框圖如下。 ![xddp_global](https://wsg-blogs-pic.oss-cn-beijing.aliyuncs.com/xenomai/xddp_global.png) 詳細的過程見下文。 版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有問題,歡迎指正。部落格地址:https://www.cnblogs.com/