日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

關(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ù)了。



  
關(guān)鍵詞:存儲存儲器

版權(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)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!