嵌入式機(jī)器視覺系統(tǒng)中ARM與DSP的數(shù)據(jù)通信方法
3.3 驅(qū)動程序的內(nèi)核加載方式
在完成了嵌入式Linux驅(qū)動程序的編寫測試工作后,下一步就是將編寫好的驅(qū)動程序加載到系統(tǒng)內(nèi)核,完成驅(qū)動硬件的工作。通常有以下兩種做法:
1)驅(qū)動程序直接編譯入內(nèi)核 采用這種方式編譯的驅(qū)動程序在內(nèi)核啟動時就已經(jīng)在內(nèi)存中,運行時不需要再自行加載驅(qū)動,可以保留專用的存儲器空間。
2)驅(qū)動程序的模塊加載 采用模塊加載方式的驅(qū)動程序?qū)阅K形式存儲在文件系統(tǒng)里,需要時動態(tài)載入內(nèi)核即可,使得驅(qū)動程序按需加載,不用時節(jié)省內(nèi)存,并且驅(qū)動程序相對獨立于內(nèi)核,升級靈活,授權(quán)方式靈活。本文就采用此種方式。
因為采用的是模塊加載方式,所以還需要借助兩個重要的函數(shù)init_module()和cleanup_module(),完成模塊的注冊和卸載。具體源碼可以參見/usr/src/linux/kemel/module.c。在2.3版本以后采用了新的方法命名這兩個函數(shù),定義exampie_init()代替init_module()函數(shù),example_cleanup()代替cleanup_module()函數(shù)。在程序的最后用下面兩行代碼進(jìn)行聲明:
module_init(S3C2440_HPI_init);
module_exit(S3C2440_HPI_exit);
3.4 接口具體應(yīng)用的設(shè)計方法
利用編寫好的驅(qū)動程序,用戶可以編寫出不同的應(yīng)用接口程序。下面給出自增寫的方法:
根據(jù)圖2的接口電路,A2,A3,A4,A5對應(yīng)的接口分別是HCNTI0,HCNTL1,,HHWIL,當(dāng)自增模式寫低半字時,它們的值應(yīng)該分別是:HCNTL0=0,HCNTL1=1,,HHWIL=O,即A[5:2]=0010,在HPI_VA_BASE上增加偏移就可以對控制口線控制。所以自增寫第一半字時,加00000100即:0x04,當(dāng)自增模式寫高字節(jié)時,它們的值應(yīng)該是HCNTL0=0,HCNTL1=1,,HHWIL=1,即A[5:2]=1010。所以自增寫第二半字時,加00101000即:0x28。對HPI控制寄存器寫地址用如下宏定義:
另外,在自增寫過程中,對于作為接收端的DSP處理器,需要明確:1)是否準(zhǔn)備就緒,可以進(jìn)行寫入數(shù)據(jù),HPI-16中可以通過HPIC寄存器查詢HRDY的狀態(tài),當(dāng)HRDY為1時,即表明HPI已經(jīng)準(zhǔn)備就緒;2)指明要寫數(shù)據(jù)的區(qū)域址,即dsp_add_w=(hpi.hpi_dsp_add),這是從應(yīng)用程序傳過來的參數(shù),以確定寫數(shù)據(jù)區(qū)域的起始地址。自增寫的代碼和注釋如下:
4 結(jié)束語
通過一個嵌入式機(jī)器視覺系統(tǒng)工程實例,闡述了嵌入式系統(tǒng)中,用ARM+DSP的雙核結(jié)構(gòu)加載Linux操作系統(tǒng),通過HPI接口進(jìn)行通信和交換數(shù)據(jù)的設(shè)計方法,設(shè)計了HPI接口連接的硬件電路和Linux環(huán)境下的驅(qū)動程序,描述了該接口的具體應(yīng)用設(shè)計方法。
ARM+DSP的雙核系統(tǒng)是新型的嵌入式機(jī)器視覺系統(tǒng)構(gòu)建方法,而這里設(shè)計的通過HPI接口交換數(shù)據(jù)的雙機(jī)通信方法,在機(jī)器視覺系統(tǒng)項目中被成功地應(yīng)用證明,傳輸數(shù)據(jù)速度達(dá)到10 Mb/s,能夠滿足嵌入式系統(tǒng)對實時性的要求,具有廣闊的應(yīng)用前景。但在應(yīng)用中需要注意的是:HPI接口的讀寫過程都涉及到公共的寄存器(HPI的控制寄存器、地址寄存器和數(shù)據(jù)寄存器)及HPI接口提供給主機(jī)(host)端讀寫的內(nèi)存的相關(guān)操作,所以在特定的應(yīng)用程序、驅(qū)動程序的設(shè)計中,一定要用信號量等互斥機(jī)制加以保護(hù),否則,會出現(xiàn)讀寫錯亂的現(xiàn)象。
評論