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

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

目錄

1.概述

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

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

rtipc-arch

以上工做作好後,下面能夠進行數據交互了,本文從linux端打開建立好的xddp通道開始,來詳細看整個通信過程。socket

  1. 實時端建立xddp socket,經過bind指定socket使用的端口號,或者給socket設置一個label,端口號自動分配。實時與非實時經過socke使用的端口號來關聯,在linux端,端口號即xnpip設備的次設備號。code

  2. 經過指定端口通信時,linux經過直接讀寫xnpipe設備(/dev/rtpN,N爲端口號)來通信。使用label時,因爲實時端端口號爲自動分配,因此只能linux端只能經過讀寫文件/proc/xenomai/registry/rtipc/xddp/%s來通信,%s爲通信使用的label。htm

  3. 非實時向實時端發送數據:通信過程當中,因爲xnpipe可看作一個全雙工設備,有兩個數據鏈表,命名以實時端爲主,inq表示接收數據報鏈表(NRT->RT),outq爲發送數據報鏈表(RT->NRT)。對於linux端,每次發送的數據都做爲一個數據報節點插入到鏈表inq尾,實時端讀取時從鏈表頭取數據,符合FIFO。blog

  4. 實時向非實時發送數據,分三種數據:進程

    • 不帶標識的數據包會做爲一個單獨的數據報節點插入鏈表outq尾。
    • 使用MSG_OOB標識時,表示這是一個緊急的數據,須要優先被linux端讀取,這時會做爲一個單獨的數據報節點插入鏈表outq。liunx端讀取時從鏈表頭取數據,因此除MSG_OOB標識的數據外,符合FIFO。
    • 使用MSG_MORE標識時,表示還有數據要與該數據一塊兒發送,暫時不做爲單獨數據包發送(不放到outq),先積累到數據緩衝區,待緩衝區滿或者發送的數據沒有MSG_MORE時,將整個緩衝區做爲一個大的數據包插入鏈表outq尾。

    整個XDDP使用過程當中:ip

    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/內存

相關文章
相關標籤/搜索