嵌入式機器視覺(jué)系統中ARM與DSP的數據通信設計方案
3 軟件設計
3.1 Linux驅動(dòng)程序
在Linux操作系統下,設備文件有3種類(lèi)型:字符設備、塊設備、網(wǎng)絡(luò )設備,各自對應一種類(lèi)型的設備驅動(dòng)程序。這里的HPI接口的驅動(dòng)程序屬于字符設備驅動(dòng)程序。
Linux下的驅動(dòng)程序是為相應的設備編寫(xiě)多個(gè)基本函數,填充file_operations結構體。其中定義了實(shí)現各種操作函數。如下所示:
open和release完成設備的打開(kāi)和關(guān)閉。mmap為內存地址映射操作。下面是本文中的HPI接口的驅動(dòng)程序的設備入口hpi_open函數,它負責打開(kāi)、準備設備。
任何時(shí)候對字符設備(HPI)接口進(jìn)行打開(kāi)操作,都會(huì )調用設備的open入口點(diǎn)(hpi_open)。所以open函數(hpi_open)必須對將要進(jìn)行的I/O操作做好必要的準備工作,例如設備是獨占的,則open函數必須將設備標記成忙狀態(tài),如上面例程中的①處兩行所示。
3.2 驅動(dòng)程序中映射的實(shí)現
由于在Linux系統中,用戶(hù)應用程序不能直接對驅動(dòng)程序的內存空間進(jìn)行操作,因此必須用到內存映射機制。內存映射是指把內核中的特定的內存空間映射到用戶(hù)空間的內存中去。
mmap系統調用映射一個(gè)設備,意味著(zhù)使用戶(hù)空間的一段地址關(guān)聯(lián)到設備內存上,實(shí)際上就是對設備的訪(fǎng)問(wèn)。
mmap方法是file_operations結構的一部分,要實(shí)現映射必須分兩步:
1)調用內核中的remap_page_range函數,它的功能是:構造用于映射一段物理地址的新頁(yè)表,實(shí)現了內核空間與用戶(hù)空間的映射,其原型如下:
函數參數的確切含義如下:unsigned long virt_add為重映射開(kāi)始處的虛擬地址。這個(gè)函數為虛地址空間virt_add和virt_add+size之間的范圍構造頁(yè)表。unsigned long phys_add為虛擬地址應該映射到的物理地址。unsigned long size為被重映射的區域的大小,以字節為單位。pgprot_t prot為新VMA所請求的“保護”屬性。驅動(dòng)程序不必修改保護,在vma->vma_page_prot中找到的參數可不加改變地使用。
本課題中使用mmap調用的代碼如下:
這樣就為DSP的HPI接口所對應的總線(xiàn)物理地址:0x10000000(對應nGCS2)在vma->vm_start和vma->vm_end之間構造了新的頁(yè)表。
hpi_mmap_add=mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,hpi_fd,0)其中參數start指明描述字fd對應的“文件”在進(jìn)程地址空間內的映射區的開(kāi)始地址,必須是頁(yè)面對齊的地址,通常設為NULL,讓內核去自動(dòng)選擇開(kāi)始地址。任何情況下,mmap的返回值為內存映射區的開(kāi)始地址。這樣通過(guò)對hpi_mmap_add操作,實(shí)現對起始地址為0x10000000的內存段操作。
通信相關(guān)文章:通信原理
評論