關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲器
出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-04 20:31:03
介紹共享存儲器
linux并不是嚴(yán)格意義上的實(shí)時操作系統(tǒng),為了實(shí)際需要,工程師們必須想盡辦法來禰補(bǔ)這一不足,于是出現(xiàn)了rtlinux和rtai等并不強(qiáng)調(diào)商業(yè)性的軟件。rtlinux是Linux中的一種實(shí)時操作系統(tǒng)。它由新墨西哥礦業(yè)及科技學(xué)院的V. Yodaiken開發(fā)。目前,RTLinux有一個由社區(qū)支持的版本,稱為RTLinux Free,以及一個來自FSMLabs的商業(yè)版本,稱作RTLinux Pro。 的rtlinux顯然龐大而并不兼容大部分的嵌入式平臺,版本的rtlinux也只能支持I386和PPC而已。Rtai是不錯的選擇,但要把它移植到你的平臺上去,為了適應(yīng)你的linux版本,你的CPU,你必須的花費(fèi)許多的工作,比如說近比較流行的AT91RM9200DK,光修改linux版本補(bǔ)丁就要花費(fèi)許多的功夫。Rtlinux和rtai為了增強(qiáng)linux操作系統(tǒng)的實(shí)時性,主要是通過開辟內(nèi)核模塊與應(yīng)用程序之間可以共享的內(nèi)存快來實(shí)現(xiàn)的。它們在內(nèi)核空間控制硬實(shí)時任務(wù)的運(yùn)行,并通過一個名為FIFO的共享內(nèi)存塊來與應(yīng)用程序進(jìn)行通信。他們是很不錯的軟件,我想用不了多久他們就會具備更強(qiáng)大的可移植性。
共享存儲器的工作原理
眾所周知,內(nèi)核空間和用戶空間只能通過系統(tǒng)調(diào)用來共享數(shù)據(jù),如果進(jìn)程要等待一個中斷的發(fā)生,它所能做的就是把自己掛在等待隊列里,直到中斷服務(wù)程序來喚醒它。然后,進(jìn)程才把內(nèi)核空間的的數(shù)據(jù)通過特定的系統(tǒng)調(diào)用寫到用戶空間里。大部分程序員為了避免這樣造成的不可忍耐的延時,都會把對數(shù)據(jù)的操作都放在內(nèi)核空間里運(yùn)行,也就是擴(kuò)大中斷服務(wù)程序的功能。
操作方法和步驟
AT91RM9200DK的SDRAM的大小為31Mbyte(SDRAM,即SynchrONous DRAM 同步動態(tài)隨機(jī)存儲器),正常情況下,System RAM的大小也是31Mbyte(RAM,即RAM -random access memory 隨機(jī)存儲器),我們要把31Mbyte的高端地址空出2M來作為我們的共享內(nèi)存塊,這個內(nèi)存塊是獨(dú)立的,不能為linux操作系統(tǒng)的內(nèi)存管理所用了。首先必須通知內(nèi)核它的內(nèi)存只有30Mbyte了,我的方法是在u-boot的環(huán)境變量里設(shè)置mem=29M。然后在include/asm-arm/目錄下建立頭文件:new_fifo.h
代碼如下:
#ifndef NEW_FIFO
#define NEW_FIFO
#endif
#ifdef NEW_FIFO
#define AT91_NEW_FIFO_BASE 0x21d00000
#define num_base(a) (0x21d00000 (0x1000 * a))
#define SPI_NUM_FIFO 2
#define MAX_NUM_FIFO 256
#define READONLY 0
#define READEN 0x1
#define WRITONLY 0x2
#define WRITEN 0x4
typedef struct new_fifo{
int code,key;
int start,size;
int flags;
char data[4000];
int endflag;
} *at91_fifo;
static char * new_fifo_fun(int num,int flags,int code,int size)
{
at91_fifo fifo_p;
int num_addr;
char * data;
if(num > MAX_NUM_FIFO)
return -1;
num_addr = num_base(num);
/printk("the num_addr is %p \n",num_addr);
fifo_p = (at91_fifo)ioremap(num_addr,(1024 * 4));
/ printk("the fifo_p is %p\n",fifo_p);
fifo_p->code = code;
/ printk("the code addr is %p\n",&(fifo_p->code));
fifo_p->flags = flags;
fifo_p->size =size;
data = &(fifo_p->data[0]);
/printk("the data addr is %p\n",data);
return data;
}
#endif
在設(shè)備驅(qū)動程序中,首先在注冊中斷服務(wù)程序之前,要調(diào)用new_fifo_fun函數(shù),得到數(shù)據(jù)區(qū)首地址的指針。這個指針在這個設(shè)備驅(qū)動程序中可被設(shè)置成全程變量。然后在中斷服務(wù)程序中直接對數(shù)據(jù)進(jìn)行讀寫。
比如說,在文件頭部寫:
static char * data;
然后在初始化文件中,注冊中斷之前加入:
data = new_fifo_fun(SPI_NUM_FIFO,WRITEN,0,100);
在中斷服務(wù)程序中加入:
for(i=0;i<100;i )
*(data ) = i;
接下來,本文設(shè)計了一個簡單的進(jìn)程,就是讀取SPI的FIFO空間的數(shù)據(jù),通過/dev/mem來讀取SDRAM高地址的數(shù)值,使用的是mmap函數(shù)。
全文如下:
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/fcntl.h>
#include <dirent.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
main()
{
int *mmaddr;
int i,fd;
fd=open("/dev/mem", O_RDWR);
mmaddr = (int *)mmap(0, 1024,PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0x21d02000);
for(i=0;i<10;i )
{printf("the mmaddr data is %p\n",*(mmaddr ));
printf("%d\n",i);
}
}
結(jié)果是:
the mmaddr data is (nil)
the mmaddr data is 0xd24e92c2
the mmaddr data is 0xf01ab26d
the mmaddr data is 0x64
the mmaddr data is 0x4
the mmaddr data is 0x3020100
the mmaddr data is 0x7060504
the mmaddr data is 0xb0a0908
the mmaddr data is 0xf0e0d0c
the mmaddr data is 0x13121110
說明我們數(shù)據(jù)讀寫都成功拉。同樣的,如果要把用戶空間的數(shù)據(jù)寫到內(nèi)核空間也是可以的。如果這個時候,進(jìn)程在用戶空間監(jiān)視FIFO里的某幾個數(shù)值,當(dāng)這個數(shù)值變得符合要求的時候,進(jìn)程認(rèn)為中斷已經(jīng)發(fā)生,并可以讀取數(shù)據(jù)了。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04
- 高速PCB阻抗控制核心實(shí)操規(guī)范
- 高速數(shù)字系統(tǒng)(如DDR、SerDes)中的信號完整性濾波
- MOSFET在UPS電源中的應(yīng)用解析
- 電源管理IC在物聯(lián)網(wǎng)設(shè)備中的應(yīng)用
- SMT連接器焊接缺陷分析
- MOSFET在汽車電子中的應(yīng)用要求
- 通信設(shè)備電源管理IC應(yīng)用解析
- 通信設(shè)備連接器選型與設(shè)計
- PCB電磁兼容性(EMC)設(shè)計核心實(shí)操規(guī)范
- 物聯(lián)網(wǎng)節(jié)點(diǎn)低功耗設(shè)計:信號鏈中的濾波與功耗管理









