<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          3.2卡的軟件設(shè)計(jì)

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

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

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

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

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

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

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

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

           ?。?…… /* 初始化設(shè)置 */

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

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

            // 請(qǐng)求分配中斷號(hào)為n的快速中斷處理

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

           ?。?……/*沒有申請(qǐng)成功 根據(jù)返回值進(jìn)行出錯(cuò)處理 * / }

            else

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

            return 0;}

            init_waitqueue_head(my_queue);

           ?。?p>  void cleanup_module(void)

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

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

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

            AT91_SYS->PIOC_PER |= AT91C_PIO_PC15;//設(shè)置PC15IO使能

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

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

            AT91_SYS->PIOC_CODR |= AT91C_PIO_PC15;

            for(i=1;i

            AT91_SYS->PIOC_SODR |= AT91C_PIO_PC15;

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

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

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

            { …… /* 寫初始化 */

            copy_from_user(wMessage,buf,count);

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

            for (i=0;i

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

            wadd++; }

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

            }

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

           ?。?…… /*讀函數(shù)則調(diào)用相應(yīng)的readb( )和copy_to_user( )函數(shù),與寫函數(shù)同理*/}

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

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

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

            { …… /*未申請(qǐng)到該內(nèi)存空間時(shí)進(jìn)行相應(yīng)處理*/} //申請(qǐng)使用內(nèi)存空間

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

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

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

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

            以上為DPRAM設(shè)備驅(qū)動(dòng)的打開、讀寫、關(guān)閉函數(shù)的實(shí)現(xiàn),然后通過以下標(biāo)記化結(jié)構(gòu)將其驅(qū)動(dòng)的功能映射到前面的具體實(shí)現(xiàn)函數(shù)上:

            static struct file_operations test_fops = {

            read:read_dpram,

            write:write_dpram,

            open: open_dpram,

            release:release_dpram

           ?。?

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();