<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Linux的現場(chǎng)總線(xiàn)無(wú)線(xiàn)通信卡的實(shí)現

基于Linux的現場(chǎng)總線(xiàn)無(wú)線(xiàn)通信卡的實(shí)現

作者: 時(shí)間:2009-04-07 來(lái)源:網(wǎng)絡(luò ) 收藏

3.2卡的軟件設計

  無(wú)線(xiàn)分散控制站中卡軟件開(kāi)發(fā)操作系統。由于系統802.11b協(xié)議的無(wú)線(xiàn)已經(jīng)很成熟了,而基于Linux操作系統的協(xié)議棧軟件移植也比較容易。因此,選擇Linux系統會(huì )有效的提高卡的開(kāi)發(fā)周期。

  基于Linux的與有線(xiàn)的通信卡在協(xié)議棧和功能塊方面大致相同,僅需將應用程序向Linux系統上移植即可。但由于采用了Linux系統在與IO模塊控制卡通信的上就相對比較復雜了。與IO模塊控制卡通信的程序流程圖如下圖3-2所示:

圖3-2 與IO模塊控制卡通信的程序流程圖

3.3軟件中關(guān)鍵性問(wèn)題的解決

  在Linux操作系統下對于中斷及其它系統資源的操作有特定的規范,如內核模式操作和用戶(hù)模式操作具有不同操作權限,內核空間與用戶(hù)空間也不能隨意互訪(fǎng)。導致如協(xié)議棧無(wú)法直接對雙端口RAM進(jìn)行讀寫(xiě),也無(wú)法直接向I/O模塊控制卡收發(fā)中斷,在Linux系統下,只有在內核模式下才可以做到。那么,怎么樣將數據寫(xiě)入到雙端口RAM中,然后發(fā)送中斷信號通知對方及如何響應對方的中斷并從雙端口RAM中讀數是軟件中的關(guān)鍵性問(wèn)題。

3.3.1發(fā)中斷與注冊中斷處理程序的實(shí)現

  由于發(fā)中斷與注冊中斷處理程序是對硬件直接操作,在Linux系統下用戶(hù)程序無(wú)法直接對其硬件進(jìn)行操作。因此,必須編寫(xiě)相應的內核模塊,在內核模塊中完成發(fā)中斷與注冊中斷處理程序的操作。在用戶(hù)程序中動(dòng)態(tài)加載相應內核模塊來(lái)達到用戶(hù)程序發(fā)中斷與注冊中斷處理程序的效果。其注冊中斷處理程序的內核模塊關(guān)鍵性代碼如下:

  int init_module(void) //中斷注冊模塊初始化

 ?。?…… /* 初始化設置 */

  AT91_SYS->AIC_SMR[25]|=0X20; //設置中斷下跳沿觸發(fā)

  if (request_irq(n, interrupt_program, INTERRUPT, IRQ1,NULL))

  // 請求分配中斷號為n的快速中斷處理

  // interrupt_program為指向處理這個(gè)中斷的中斷處理程序的指針

 ?。?……/*沒(méi)有申請成功 根據返回值進(jìn)行出錯處理 * / }

  else

 ?。?printk(1> 注冊中斷成功 ! n);

  return 0;}

  init_waitqueue_head(my_queue);

 ?。?p>  void cleanup_module(void)

 ?。?…… /* 釋放資源 */

  free_irq(n,NULL); //釋放中斷線(xiàn)n

 ?。?p>  在用戶(hù)程序中發(fā)中斷時(shí),通過(guò)調用system(send_riq)來(lái)動(dòng)態(tài)執行內核模塊程序來(lái)控制發(fā)送中斷的管腳的信號,從而實(shí)現在用戶(hù)程序發(fā)中斷的效果。其發(fā)中斷的內核模塊關(guān)鍵性代碼如下:

  AT91_SYS->PIOC_PER |= AT91C_PIO_PC15;//設置PC15IO使能

  AT91_SYS->PIOC_OER |= AT91C_PIO_PC15;//設置PC15輸出使能

  //發(fā)送一個(gè)方波中斷信號

  AT91_SYS->PIOC_CODR |= AT91C_PIO_PC15;

  for(i=1;i

  AT91_SYS->PIOC_SODR |= AT91C_PIO_PC15;

3.3.2雙端口RAM的實(shí)現

  由于用戶(hù)程序不能直接對雙端口RAM進(jìn)行讀寫(xiě),因此必須根據用戶(hù)程序的需要編寫(xiě)雙端口RAM的,以?xún)群四K的形式動(dòng)態(tài)加載到系統中去。Linux系統將所有設備都看做是文件,對設備的讀寫(xiě)相當于對文件的讀寫(xiě)。雙端口RAM驅動(dòng)模塊加載后,用戶(hù)程序就可以像讀寫(xiě)文件一樣,間接的對雙端口RAM進(jìn)行讀寫(xiě)了。其雙端口RAM驅動(dòng)模塊的主要實(shí)現過(guò)程如下:

  static int write_dpram(struct file *file, const char *buf, u32 count, loff_t *f_pos)

 ?。?…… /* 寫(xiě)初始化 */

  copy_from_user(wMessage,buf,count);

  …… /* 進(jìn)行數據處理 */

  for (i=0;i

 ?。?writeb(wMessage[i], base+wadd);

  wadd++; }

  …… /*向IO模塊控制卡發(fā)中斷信號*/

 ?。?p>  static int read_dpram(struct file *file,char *buf,u32 count,loff_t *f_pos)

 ?。?…… /*讀函數則調用相應的readb( )和copy_to_user( )函數,與寫(xiě)函數同理*/}

  static int open_dpram(struct inode *inode,struct file *file )

 ?。?…… /*初始化*/

  if (!request_mem_region(AT91_DPRAM,BUF_LEN*sizeof(u8),DEVICE_NAME))

 ?。?…… /*未申請到該內存空間時(shí)進(jìn)行相應處理*/} //申請使用內存空間

  base =ioremap(AT91_DPRAM,BUF_LEN*sizeof(u8));//為設備內存區域分配虛擬地址

  …… /* 設置DPRAM讀寫(xiě)時(shí)序*/

 ?。?p>  static int release_dpram(struct inode *inode,struct file *file )

 ?。?…… /* 釋放相應資iounmap( )和release_mem_region();}

  以上為DPRAM設備驅動(dòng)的打開(kāi)、讀寫(xiě)、關(guān)閉函數的實(shí)現,然后通過(guò)以下標記化結構將其驅動(dòng)的功能映射到前面的具體實(shí)現函數上:

  static struct file_operations test_fops = {

  read:read_dpram,

  write:write_dpram,

  open: open_dpram,

  release:release_dpram

 ?。?

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>