關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器_第1頁
關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器_第2頁
關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器_第3頁
關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器_第4頁
關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

精品文檔-下載后可編輯關(guān)于應(yīng)用程序與內(nèi)核模塊之間共享存儲(chǔ)器介紹共享存儲(chǔ)器

linux并不是嚴(yán)格意義上的實(shí)時(shí)操作系統(tǒng),為了實(shí)際需要,工程師們必須想盡辦法來禰補(bǔ)這一不足,于是出現(xiàn)了rtlinux和rtai等并不強(qiáng)調(diào)商業(yè)性的軟件。rtlinux是Linux中的一種實(shí)時(shí)操作系統(tǒng)。它由新墨西哥礦業(yè)及科技學(xué)院的V.Yodaiken開發(fā)。目前,RTLinux有一個(gè)由社區(qū)支持的版本,稱為RTLinuxFree,以及一個(gè)來自FSMLabs的商業(yè)版本,稱作RTLinuxPro。的rtlinux顯然龐大而并不兼容大部分的嵌入式平臺,版本的rtlinux也只能支持I386和PPC而已。Rtai是不錯(cuò)的選擇,但要把它移植到你的平臺上去,為了適應(yīng)你的linux版本,你的CPU,你必須的花費(fèi)許多的工作,比如說近比較流行的AT91RM9200DK,光修改linux版本補(bǔ)丁就要花費(fèi)許多的功夫。Rtlinux和rtai為了增強(qiáng)linux操作系統(tǒng)的實(shí)時(shí)性,主要是通過開辟內(nèi)核模塊與應(yīng)用程序之間可以共享的內(nèi)存快來實(shí)現(xiàn)的。它們在內(nèi)核空間控制硬實(shí)時(shí)任務(wù)的運(yùn)行,并通過一個(gè)名為FIFO的共享內(nèi)存塊來與應(yīng)用程序進(jìn)行通信。他們是很不錯(cuò)的軟件,我想用不了多久他們就會(huì)具備更強(qiáng)大的可移植性。

共享存儲(chǔ)器的工作原理

眾所周知,內(nèi)核空間和用戶空間只能通過系統(tǒng)調(diào)用來共享數(shù)據(jù),如果進(jìn)程要等待一個(gè)中斷的發(fā)生,它所能做的就是把自己掛在等待隊(duì)列里,直到中斷服務(wù)程序來喚醒它。然后,進(jìn)程才把內(nèi)核空間的的數(shù)據(jù)通過特定的系統(tǒng)調(diào)用寫到用戶空間里。大部分程序員為了避免這樣造成的不可忍耐的延時(shí),都會(huì)把對數(shù)據(jù)的操作都放在內(nèi)核空間里運(yùn)行,也就是擴(kuò)大中斷服務(wù)程序的功能。

操作方法和步驟

AT91RM9200DK的SDRAM的大小為31Mbyte(SDRAM,即SynchrONousDRAM同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器),正常情況下,SystemRAM的大小也是31Mbyte(RAM,即RAM-randomaccessmemory隨機(jī)存儲(chǔ)器),我們要把31Mbyte的高端地址空出2M來作為我們的共享內(nèi)存塊,這個(gè)內(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

代碼如下:

#ifndefNEW_FIFO

#defineNEW_FIFO

#endif

#ifdefNEW_FIFO

#defineAT91_NEW_FIFO_BASE0x21d00000

#definenum_base(a)(0x21d00000(0x1000*a))

#defineSPI_NUM_FIFO2

#defineMAX_NUM_FIFO256

#defineREADONLY0

#defineREADEN0x1

#defineWRITONLY0x2

#defineWRITEN0x4

typedefstructnew_fifo{

intcode,key;

intstart,size;

intflags;

chardata[4000];

intendflag;

}*at91_fifo;

staticchar*new_fifo_fun(intnum,intflags,intcode,intsize)

{

at91_fifofifo_p;

intnum_addr;

char*data;

if(numMAX_NUM_FIFO)

return-1;

num_addr=num_base(num);

/printk("thenum_addris%p\n",num_addr);

fifo_p=(at91_fifo)ioremap(num_addr,(1024*4));

/printk("thefifo_pis%p\n",fifo_p);

fifo_p-code=code;

/printk("thecodeaddris%p\n",(fifo_p-code));

fifo_p-flags=flags;

fifo_p-size=size;

data=(fifo_p-data[0]);

/printk("thedataaddris%p\n",data);

returndata;

}

#endif

在設(shè)備驅(qū)動(dòng)程序中,首先在注冊中斷服務(wù)程序之前,要調(diào)用new_fifo_fun函數(shù),得到數(shù)據(jù)區(qū)首地址的指針。這個(gè)指針在這個(gè)設(shè)備驅(qū)動(dòng)程序中可被設(shè)置成全程變量。然后在中斷服務(wù)程序中直接對數(shù)據(jù)進(jìn)行讀寫。

比如說,在文件頭部寫:

staticchar*data;

然后在初始化文件中,注冊中斷之前加入:

data=new_fifo_fun(SPI_NUM_FIFO,WRITEN,0,100);

在中斷服務(wù)程序中加入:

for(i=0;i100;i)

*(data)=i;

接下來,本文設(shè)計(jì)了一個(gè)簡單的進(jìn)程,就是讀取SPI的FIFO空間的數(shù)據(jù),通過/dev/mem來讀取SDRAM高地址的數(shù)值,使用的是mmap函數(shù)。

全文如下:

#includesys/types.h

#includestdio.h

#includesys/stat.h

#includeunistd.h

#includesys/mman.h

#includesys/fcntl.h

#includedirent.h

#includestdlib.h

#includeerrno.h

#includestring.h

#includeassert.h

#includegetopt.h

main()

{

int*mmaddr;

inti,fd;

fd=open("/dev/mem",O_RDWR);

mmaddr=(int*)mmap(0,1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x21d02000);

for(i=0;i10;i)

{printf("themmaddrdatais%p\n",*(mmaddr));

printf("%d\n",i);

}

}

結(jié)果是:themmaddrdatais(nil)themmaddrdatais0xd24e92c2themmaddrdatais0xf01ab26dthemmaddrdatais0x64themmaddrdatais0x4themmaddrdatais0x3020220themmaddrdatais0x7060504themmaddrdatais0xb0a0908the

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論