【原創】xenomai內核解析--xenomai與普通linux進程之間通訊XDDP(三)--實時與非實時數據交互

前面兩篇文章我們看了xddp在xenomai內核裏涉及的數據結構、RTDM對於協議類實時設備的管理方式,以及實時端創建一個XDDP通道後(xddp必須由實時端來創建),實時端與非實時端是如何聯繫起來的,本文從linux端打開創建好的xddp通道開始,來詳細看整個通訊過程。

目錄

1.概述

【原創】實時IPC概述
【原創】xenomai與普通linux進程之間通訊XDDP(一)--實時端socket創建流程
【原創】xenomai與普通linux進程之間通訊XDDP(二)--實時與非實時關聯(bind流程)

前面兩篇文章我們看了xddp在xenomai內核裏涉及的數據結構、RTDM對於協議類實時設備的管理方式,以及實時端創建一個XDDP通道後(xddp必須由實時端來創建),實時端與非實時端是如何聯繫起來的。

rtipc-arch

以上工作做好後,下面可以進行數據交互了,本文從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://www.cnblogs.com/wsg1100/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章