色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于RTLinux實時應用程序開發模式實現通信接口的設計和使用方式

牽手一起夢 ? 來源:單片機與嵌入式系統應用 ? 作者:盧綺閩 , 舒嶸 ? 2020-10-04 18:00 ? 次閱讀

RTLinux作為Linux最為通用的幾種硬實時擴展之一,表現了良好的硬實時性。同時,為了更有效地為各種實時應用服務,提供了多種與Linux中非實時進行通信接口,主要有共享內存、RT_FIFO和線程信號驅動機制,三者的應用重點各不相同。其中前兩種較為常用。由于不的實現機理,這兩種接口的應用范疇各有側重。經過實踐,認為將以上兩種接口有機地結合,利用共享內存傳送大容量、對讀/寫時序要求不高的數據信息;同時,利用RT_FIFO輔助實現對該共享內存的同步控制,能夠綜合兩者的優勢,是RTLinux下一種十分有效的實時應用通信模式。

1 RTLinux的結構和應用程序開發模式

作為Linux的硬實時擴展,RTLinux一個重要的計準則在于:盡可能多地利用Linux內核所能提供的功能。

顯示、記錄、設備初始化、阻塞式動態資源分配和模塊化內核管理等無實時要求或者與硬實時性要求相悖的服務均由Linux提供。RTLinux內核則主要為實時任務提供對硬件的直接訪問,使得它們具有最小的延遲和最優先的處理器利用權。

基于RTLinux實時應用程序開發模式實現通信接口的設計和使用方式

基于以上準則,RTLinux中的實時應用程序開發通常具有一個通用的模式,如圖1所示。按照運行環境和對實時要求的嚴格程度分為實時和非實時兩個模塊。非實時模塊的功能包括結果數據顯示。用戶交互、數據存儲等;實時模塊主要負責響應數據采集外設的中斷,結果數據的采集。兩者通過RT_FIFO或者共享內存進行通信,組成一個完整的實時數據采集程序。

2 RTLinux中的兩種通信接口

RTLinux提供了RT_FIFO和共享內存兩種標準通信接口,用于實時任務和非實時任務之間的交互。

2.1 RT_FIFO

RT_FIFO(First-In-First-Out,先進先出)是一種提案隊列機制組織的字符設備。在Linux文件系統中,主設備號為150。一個系統平臺中能夠同加載FIFO的模塊數RTF_NO定義在rt_fifo_new.c中,一般為64,在文件系統中分別對慶設備文件/dev/rtf0..63。在系統資源允許的情況下,一個用戶進程所能同時使用的FIFO數和每個FIFO的容量是沒限制的。

RT_FIFO具有如下特征:

*隊列中的數據傳送采用數據流形式,必須自行定義數據邊界監測機制,尤其對于不定長度數據的傳輸。

*具備完善的同步阻塞機制,利用同一FIFO進行通信的兩進程間無需自行增加同步控制。

*一種點對點的通信通道,不支持單生產者、多消費者的使用模式。

作為一個完善的隊列模塊,RT_FIFO的使用簡便易行,具體實現主要包括創建、讀/寫操作、釋放三個步驟。在Linux文件系統中,RT_FIFO是一個字符設備文件,所以在非實時線程中訪問RT_FIFO時,使用標準的字符設備讀/寫函數即可(read、write、open、close,etc)。以上函數的調用方式均為阻塞式調用:當FIFO中有數據可讀時,立即返回;否則,會陷入無限等待之中。

從RT進程中訪問RT_FIFO,所涉及到的RTLAPI如下:

#include

[創建]

int rtf_create(unsigned int fifo,int size);

內核空間中,為編號fifo的RT_FIFO設備分配size字節的緩沖區。fifo對應于所使用RT_FIFO的次設備號。

[釋放]

int rtf_destroy(unsigned int fifo);

釋放內核空間中次設備號為fifo的RT_FIFO設備緩沖區。

注意:以上兩個函數涉及到內核空間的緩沖區分配,必須分別在Linux的init_module()和cleanup_module()中調用,或者在用戶空間通過PSC(the user-level real-time signal library,用戶級實時庫函數)進行調用。

[讀/寫操作]

int rtl_get(unsigned int fifo,char *buf,int count);

從FIFO中讀出長度為count字節的數據,存放buf之中。

Int rtf_put(unsigned int fifo,char * buf,int count);

將長度為count字節的數據寫入FIFO中。

Int rtf_create_handle(unsigned int fifo,int(%26;amp;handler)(unsigned int fifo));

創建一個回調函數句柄,當FIFO被Linux進程讀/寫時,被調用。通常與rtl_get結合使用,用于異步的從Linux進程中接收數據,從而避免采用輪詢的方式。

2.2 共享內存

共享內存是指被閑置出來專用于內核空間和用戶空間進行通信的內存區域。相對于FIFO具有如下特點:

*應用程序必須自己定義相應的協議,對于寫入共享數據區域的有數據進行保護,如同步控制等。

*數據可以既定格式讀/寫,各個數據域的更新十分便易。

*不是點對點的通信通道,可以支持多生產者、多消費者的使用模式,能夠同時被多個線程訪問。

在RTLinux下,共享內存的使用可采用以下兩種方式:

(1)利用RTLinux中附帶的mbuff模塊

在使用mbuff之前,要求系統中已經加載了mbuff.o模塊。該模塊中的兩個函數被分別用于分配和釋放所需的內存空間。

#include

[分配]

void * mbuff_alloc(const char * name,int size);

從內核空間中分配一塊與name相連,大小為size字節的內存空間,返回地址指針,設備這塊空間的引用標識為1。如與name相連的內存空間已經存在,就僅僅返回指向該空間的地址指針,同時將其引用標識加1。

[釋放]

void mbuff_free(const char * name,int size);

將mbuff的引用標識減1。當引用標識被減為0時,釋放mbuff。

注意:①mbuff_alloc使用了vmalloc函數,由于分配內核空間的需要,會交換出一系列的內核空間頁面,所以在實時線程、中斷處理線程、定時器中斷線程中調用這個函數是十分危險的。

②在進程結束前,一定要調用mbuff_free函數。Mbuff所占內存空間不會因為其引用進程的結束而自行釋放。

(2)高地址空間物理內存的直接隔離

在系統啟動時,隔離出一定大小的高地址空間物理內存,使其脫離系統運行環境,作為專用的共享內存區域。

圖4 共享內存互斥操作流程圖

在Linux啟動配置文件中,插入一行以append關鍵字起始的命令行,即可實現高端內存空間的隔離。修改后的/etc/lilo.conf文件如下所示:

image=/boot/zImage

label=rtlinuxX.X

root=/dev/hda2

read_only

append=“mem=Xm”

其中,mem的值對應于被隔離空間的起始地址,可以由物理內存總容量減去所需共享空間容量得到。但是必須注意,被隔離出的共享空間的容量必須小于/usr/include/asm/param.h文件中定義的頁面長度。Intel Pentium系列芯片的頁面長度為4MB。

對共享內存空間的存取操作通過訪問其基址來實現。必須首先定義共享內存空間的基址。

#define BASE_ADDRESS(127%26;#215;0x100000)

在實時和非實時模塊中有不同的基址訪問方法。寫時模塊運行于內核地址空間,可以直接將基址作為地址指針進行存取,使用語句如下:

unsigned short * sharemem;

sharemem=(unsigned short *)__va(BASE_ADDRESS);

非實時模塊運行于用戶地址空間,必須先將該物理地址映射入該進程虛擬地址空間后,才能對其進行存取。使用命令如下:

#include

#include

#include

int fd;

unsigned short * sharemem;

fd=open(“/dev/mem”,O_RDWR); ①

sharemem=(unsigned short *)mmap(0,buflen,

PROT_READ|PROT_WRITE,

MAP_FILE|MAP_SHARED,

Fd,BASE_ADDRESS); ②

注①:訪問物理內存必須打開與其對應的設備文件/dev/mem。

注②:mmap命令的作用是將設備文件fd中,從當前進程的虛擬地址空間,其返回值可被非實時進程存取。

以上兩種方式在實現機理上的不同之處在于,mbuff利用vmalloc從內核地址空間分配的共享內存空間僅僅在邏輯上連續,空間的大小不受實際物理內存空間的限制;而直接隔離物理內存所獲取的緩沖區物理上連續,但是大小受到物理內存空間和當前系統狀況的限制。共同之處在于,所獲得的內存均被隔離于系統內核的運行環境之外,不會在頁面交換中被換出,所以以上兩種方法均適用于實時應用之中。

3 兩種通信接口的結合

以上兩種通信接口具有不同的適用范疇,為了實現一個完整的實時應用,通常需要將兩者結合,以一個實時數據采集程序為例,實時模塊和非實時模塊之間通常需要傳送兩種類型的數據;結果數據和控制信息。

結果數據:由實時模塊周期性產生。非實時模塊用于顯示和存儲,對讀/寫的時序性要求不高,但是通常需要由多個用戶共享,因此,利用共享內存模塊傳輸比較適合。

控制信息:主要用于實現非實時模塊和實時模塊之間的交互控制,數據量小,但是比較注重信號讀/寫的時序性和通信過程中實時性,采用RT_FIFO實現比較適合。

圖2為通用的抽象數據流圖。

3.1 共享內存的內步控制和RT_FIFO的使用

由于對共享內存的存取通過直接訪問指針來實現,操作系統不會為其提供任何同步控制,應用程序必須自行提供握手機制,來保證讀/寫進程之間同步。

實現同步的一種方式是接收方和發送方利用消息通信來實現握手。接收方對共享內存以輪詢的方式監測新數據的到來,然后發送接收信息。為了實現握手,發送方對于每條接收消息都必須回復一個確認消息,新的接收消息只有在收到確認消息以后才能發出。

這種方式在實時模塊和非實時模塊中均須要采用輪詢的方式監測新數據和消息的到來,因此會占用較多的處理器資源。所以,可以考慮利用RT_FIFO實現實時模塊和非實時模塊之間對共享內存的存取同步。利用RT_FIFO所提供的句柄功能能夠避免實時模塊對接收消息的輪詢監測,在一定程度上提高程序運行效率。

具體實現,可以通過利用RT_FIFO實時傳輸當前所寫入或被讀出的共享內存塊序號,實現實時進程和非實時進程之間的步。因為RT_FIFO是一種單向傳輸隊列,為了實現交互,需要兩個傳輸方向相反的RT_FIFO,連接于兩個模塊之間,如圖3所示。

圖3中,BufNo為筆者自行定義的隊列。它的使用主要是為了避免由于RT_FIFO引起的實時部分和非實時部分之間的死鎖。

實時部分和非實時部分的各線程路之間對共享內存的訪問為異步進行;同時,RTLinux中對RT_FIFO的進行讀/寫的API函數,為阻塞式操作。當FIFO0中目前沒有可讀數據時,對rtf_get函數的調用會使程序陷入無限等待之中,很容易造成實時模塊和非實時模塊之間的死鎖。

為了避免這種情況,可以將BufNo作為緩沖區與FIFO0的句柄結合使用,臨時存放FIFO0中被非實時線程寫入的塊序號。實時模塊不再對FIFO0進行讀/寫,而是改由BufNo隊列中獲取當前有效的共享內存序號。如果當前無可用數據,則進入周期等待狀態。

3.2 共享內存訪問的互斥

對共享內存訪問的互斥操作,包括兩個方面:實時模塊與非實時模塊之間的互斥、非實時模塊中各采集線程之間的互斥。

(1)實時模塊與非實時模塊之間的互斥

多線程之間對共享資源訪問的互斥,是操作系統中一個重要的研究分支。但是在實時模塊和非實時模塊之間,問題變得相對簡單。因為,在實時進程和非實時進程之中,實時進程和非實時進程運行的環境區別很大。工作于RTLinux環境下的實時進程具有最高的優先級,不可能被非實時進程中斷。所以,在實現互斥時,只須保護非實時進程對共享資源的訪問即可。

抽象流程如圖4所示。利用共享內存區域的第一個字節作為訪問標識,實現非實時模塊對實時模塊的互斥。

非實時進程開始訪問共享區域時,將此標識置位;訪問結束時,復位。實時進程在訪問共享區域前先檢測該標識,如果標識允許訪問,則執行寫入操作;反之,掛起等待標識位復位,按既定周期T輪詢。

實時進程的既定周期T的設置十分重要,周期過長,會增加發生沖突后的等時間,導致共享內存狀態改變時,無法被及時寫入;周期過短,增加了系統的輪詢次數,加重實時系統的負擔。筆者在已實現的數據采集程序中,對T的不同設置,所獲得的平均數據采集率進行了統計,結果如圖5所示。

注:以上實驗的測試平臺為PentiumIII 667,5400轉普通硬盤,RTLinux3.1、Linux kernel 2.4.4,數據流向為數據采集外設至共享內存然后存放硬盤,數據的產生頻率為10ms。

(2)非實時模塊之間的互斥

非實時模塊中異步執行的各采集線程之間,可以利用互斥變量的加鎖和解鎖實現對共享內存訪問的互斥。由于互斥區的執行體內,每次只允許一個線程進入,為了保證程序的執行效率,在互斥區中不宜使用耗時較長或阻塞式調用的函數。

4 結論

在RTLinux提供的實時模塊和非實時模塊之間的通信接口中,RT_FIFO和共享內存較為常用,分別適用于不同的數據類型通信。本文提出的這種方法,能充分利用兩者的優點,方便地實現實時與非實時之間海量數據通信。目前已在rtLinux3.1、Linux kernel 2.4.4系統平臺上成功實現,并取得了令人滿意的效果。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19312

    瀏覽量

    230035
  • Linux
    +關注

    關注

    87

    文章

    11312

    瀏覽量

    209702
  • 通信接口
    +關注

    關注

    3

    文章

    239

    瀏覽量

    31000
收藏 人收藏

    評論

    相關推薦

    實時RTlinux系統配置

    更多技術干貨,歡迎掃碼關注博主微信公眾號:HowieXue,一起學習探討軟硬件技術知識經驗,關注就有海量學習資料免費領哦:硬實時RTlinux系統配置1. Linux內核下載2. 下載與Linux
    發表于 09-14 06:43

    基于RTlinux的硬實時性研究

    L inux若作為一個操作系統,它無法滿足實時系統嚴格的實時性要求。RTlinux是在L inux內核的下層實現所得的一個簡單的硬實時內核,
    發表于 04-24 10:30 ?10次下載

    RTLinux 下的一種實時應用通信機制

    介紹RTLinux實時應用程序開發模式;詳細說明兩種在實時模塊與非
    發表于 05-15 13:20 ?10次下載

    嵌入式Linux NFS方式應用程序實現

    嵌入式Linux NFS方式應用程序實現:本文在以ARM9 內核芯片,處理器為S3C2410 構造的開發板系統上,詳細討論了如何配置嵌入式Linux NFS
    發表于 08-02 14:48 ?39次下載

    RTLinux調度策略的研究

    RTLinux 是Linux 的嵌入式實時內核,本文首先分析了RTLinux 的工作原理和兩種典型的實時調度算法(RMS 和EDF),然后深入分析了
    發表于 08-31 10:59 ?13次下載

    基于VC的網絡實時通信系統的設計與實現

    采用Client/Server 模式,設計了網絡實時通信系統的網絡結構和運行方式,并以VC++為開發工具,通過調用Winsock,
    發表于 10-27 15:31 ?26次下載

    基于API實現通信程序的設計

    Windows API(應用程序接口實現通信程序的設計。 API(Application Programming Interface,應用程序
    發表于 09-08 14:23 ?2次下載
    基于API<b class='flag-5'>實現</b><b class='flag-5'>通信</b><b class='flag-5'>程序</b>的設計

    利用USBXpress開發包簡化應用程序實現USB通信設計

    傳統的USB設備驅動程序編寫異常復雜,程序員往往很難入手。SILICON Laboratories公司提供的USBXpress開發包大大簡化了USB通信的應用和相關驅動
    的頭像 發表于 01-14 08:02 ?2640次閱讀
    利用USBXpress<b class='flag-5'>開發</b>包簡化<b class='flag-5'>應用程序</b><b class='flag-5'>實現</b>USB<b class='flag-5'>通信</b>設計

    如何利用RTLinux進行嵌入式應用程序開發

    在進一步探討實時FIFO的細節之前,還要回顧一下實時應用程序結構的某些部分(圖1)。有效的嵌入式應用程序設計方法是將實時部分與固有的非
    的頭像 發表于 11-01 09:06 ?5234次閱讀
    如何利用<b class='flag-5'>RTLinux</b>進行嵌入式<b class='flag-5'>應用程序</b>的<b class='flag-5'>開發</b>

    利用RTLinux開發嵌入式應用程序

    對于中國工程師來說,利用實時Linux開發嵌入式應用程序是他們面臨的困難之一,本文以RTLinux為例,并結合最為業界關注的是RTAI進行討論,盡管這兩種
    發表于 04-02 14:37 ?270次閱讀

    RTLinux下的一種實時應用通信機制

    ? 摘要:RTLinux實時應用程序開發模式;詳細說明兩種在實時模塊與非
    發表于 04-02 14:43 ?343次閱讀

    Linux下開發應用程序的兩種接口實現

    在Linux下開發應用程序可以調用兩種接口實現,一種是直接調用系統調用接口,另一種是調用庫函數來實現
    的頭像 發表于 09-08 13:52 ?3616次閱讀
    Linux下<b class='flag-5'>開發</b><b class='flag-5'>應用程序</b>的兩種<b class='flag-5'>接口</b>來<b class='flag-5'>實現</b>

    嵌入式Linux應用程序開發-(9)UDP網絡通信應用程序(UDP-Socket)

    基于UDP協議的網絡通信應用程序(UDP-Socket)前兩篇文章介紹了基于TCP/IP協議的網絡通信應用程序。嵌入式Linux應用程序
    發表于 11-02 12:21 ?35次下載
    嵌入式Linux<b class='flag-5'>應用程序</b><b class='flag-5'>開發</b>-(9)UDP網絡<b class='flag-5'>通信</b><b class='flag-5'>應用程序</b>(UDP-Socket)

    使用NVIDIA Maxine改善實時通信應用程序

      實時通信應用程序(如虛擬協作和內容創建應用程序)的音頻和視頻質量是衡量用戶實時通信體驗的真正
    的頭像 發表于 03-31 16:19 ?2739次閱讀
    使用NVIDIA Maxine改善<b class='flag-5'>實時</b><b class='flag-5'>通信</b><b class='flag-5'>應用程序</b>

    開發java應用程序的基本步驟是

    Java應用程序。確定您希望應用程序能夠執行的任務和提供的功能。這將有助于指導您在開發過程中進行決策并確定實現代碼的方式。 2.設計
    的頭像 發表于 11-28 16:52 ?1637次閱讀
    主站蜘蛛池模板: 日韩欧美一级| 无码一区二区在线欧洲| 肉动漫无修3D在线观看| 在线观看亚洲专区5555| 国产在线亚洲精品观看不卡| 天天爽夜夜爽夜夜爽| 不卡一区二区高清观看视频| 免费人妻AV无码专区五月| 在线精彩视频在线观看免费| 久久大胆视频| 最近中文字幕免费高清MV视频 | 韩国女人高潮嗷嗷叫视频| 羞羞影院午夜男女爽爽影院网站| 国产精品成人自拍| 亚洲AV 无码AV 中文字幕| 国产日韩欧美综合久久| 亚洲AV 中文字幕 国产 欧美| 国产亚洲精品久久精品69| 亚洲AV国产福利精品在现观看| 国产三级在线免费观看| 亚洲免费视频在线| 久久亚洲精品AV成人无码| 88福利视频| 日本A级作爱片金瓶双艳| 国产 亚洲 日韩 欧美 在线观看| 色综合色综合久久综合频道| 国产精品爽黄69天堂A片| 亚洲二区电影| 久色视频网| 成a人片亚洲日本久久| 午夜国产精品免费观看| 加勒比一本之道高清视频在线观看| 亚洲综合国产精品| 免费看的一级毛片| 国产爱豆剧果冻传媒在线| 亚洲精品无码午夜福利在线观看| 久久视频这里只精品99热在线| gayxxxxgay呻吟受日本| 偷拍自偷拍亚洲精品| 久久久久久免费观看| 不卡一区二区高清观看视频|