《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 嵌入式機(jī)器視覺(jué)系統(tǒng)中ARM與DSP的數(shù)據(jù)通信方法
嵌入式機(jī)器視覺(jué)系統(tǒng)中ARM與DSP的數(shù)據(jù)通信方法
電子設(shè)計(jì)工程
毛曉波 劉國(guó)棟 陳鐵軍 黃云峰
摘要: 嵌入式機(jī)器視覺(jué)系統(tǒng)中ARM與DSP的數(shù)據(jù)通信方法,為了在嵌入式機(jī)器視覺(jué)系統(tǒng)中實(shí)現(xiàn)ARM處理器S3C2440與DSP處理器TMS320C5402之間的實(shí)時(shí)數(shù)據(jù)通信,設(shè)計(jì)出一種基于主機(jī)接口HPI的數(shù)據(jù)通信方法,。闡述了嵌入式機(jī)器視覺(jué)系統(tǒng)的總體方案,,設(shè)計(jì)了協(xié)處理器DSP的HPI接口與ARM主機(jī)之間連接的硬件電路,詳細(xì)描述并分析了HPI的工作原理和各寄存器的作用,,給出基于Linux操作系統(tǒng)的驅(qū)動(dòng)程序,。實(shí)際應(yīng)用表明,該方法完全能夠?qū)崿F(xiàn)ARM主機(jī)實(shí)時(shí)地讀/寫(xiě)DSP處理器內(nèi)各存儲(chǔ)單元的數(shù)據(jù),,速度可達(dá)10MB/s,,滿(mǎn)足了嵌入式機(jī)器視覺(jué)系統(tǒng)的實(shí)時(shí)性要求。
關(guān)鍵詞: 機(jī)器視覺(jué) ARM DSP
Abstract:
Key words :

DSP對(duì)數(shù)字信號(hào)和數(shù)值算法具有強(qiáng)大的運(yùn)算處理能力,,因而在信號(hào)采集與處理中被廣泛應(yīng)用,,但其在任務(wù)管理、實(shí)時(shí)控制,、人機(jī)交互等方面不占優(yōu)勢(shì),。而ARM微控制器則控制功能強(qiáng)大,可以加載嵌入式操作系統(tǒng),,且能夠提供良好的人機(jī)交互,、任務(wù)管理、網(wǎng)絡(luò)通信等方面功能,。因此,,發(fā)揮DSP和ARM處理器各自的優(yōu)勢(shì),采用ARM+DSP結(jié)構(gòu)的設(shè)計(jì)方案已成為嵌入式系統(tǒng)的研究熱點(diǎn),,倍受關(guān)注,。通過(guò)嵌入式機(jī)器視覺(jué)系統(tǒng)的設(shè)計(jì)實(shí)例,闡述ARM與DSP有機(jī)結(jié)合的設(shè)計(jì)思想,,重點(diǎn)研究ARM與DSP之間的數(shù)據(jù)通信,。

1 嵌入式機(jī)器視覺(jué)系統(tǒng)總體方案
   
采用ARM+DSP結(jié)構(gòu)的機(jī)器視覺(jué)系統(tǒng)總體結(jié)構(gòu)如圖l所示。以三星公司高性能ARM處理器S3C2440作為主控制器,,配置并移植Linux操作系統(tǒng),,同時(shí)以TI公司的DSP芯片TMS320C5402為圖像處理的協(xié)處理器,通過(guò)對(duì)DSP芯片自帶的HPI接口的硬件連接方案和驅(qū)動(dòng)程序設(shè)計(jì),,將二者有機(jī)地結(jié)合起來(lái),,各自發(fā)揮其獨(dú)特優(yōu)勢(shì),協(xié)調(diào)配合,,完成目標(biāo)采集,、處理與視覺(jué)跟蹤。


     首先由智能攝像機(jī)采集現(xiàn)場(chǎng)運(yùn)動(dòng)目標(biāo)的圖像,由ARM控制將數(shù)據(jù)存放在ARM與DSP的公共存儲(chǔ)區(qū)域中,,并通知信號(hào)處理模塊DSP調(diào)用各種算法(幀間差分,、圖像分割、特征提取,、形心計(jì)算等)對(duì)視頻圖像進(jìn)行處理,,完成目標(biāo)的識(shí)別與定位,并將結(jié)果信息傳給ARM處理器,,由ARM控制步進(jìn)電機(jī),,調(diào)整PTZ攝像機(jī)位姿(水平轉(zhuǎn)動(dòng)P-Pan、垂直轉(zhuǎn)動(dòng)T-Tilt,、景深伸縮Z-Zoom),,使其對(duì)準(zhǔn)運(yùn)動(dòng)目標(biāo),實(shí)現(xiàn)實(shí)時(shí)跟蹤,。此外,,ARM處理器還負(fù)責(zé)多任務(wù)管理、人機(jī)交互及中斷報(bào)警等,。
    作為雙核系統(tǒng),,雙核各自擁有很好的性能,于是主機(jī)ARM與協(xié)處理器DSP之間能否進(jìn)行快速可靠的數(shù)據(jù)交換,,直接決定機(jī)器視覺(jué)系統(tǒng)的運(yùn)行效率,。在硬件設(shè)計(jì)方面,采用主機(jī)并行接口HPI實(shí)現(xiàn)主機(jī)ARM與協(xié)處理器DSP之間的硬件直連,,設(shè)計(jì)簡(jiǎn)單方便,,時(shí)鐘頻率可達(dá)到DSP時(shí)鐘頻率的1/5,能夠支持DSP與主機(jī)之間的高速數(shù)據(jù)傳輸,。在軟件設(shè)計(jì)方面,,則移植嵌入式Linux操作系統(tǒng),將HPI看作字符設(shè)備完成了驅(qū)動(dòng)程序的設(shè)計(jì),。

2 雙機(jī)通信硬件設(shè)計(jì)
2.1 HPI接口簡(jiǎn)介

    主機(jī)接口(HPI)是TI公司C54x系列定點(diǎn)信號(hào)處理器(DSP)內(nèi)部自帶的接口部件,,通過(guò)它可以方便地實(shí)現(xiàn)DSP與其他主機(jī)連接。C54x中的主機(jī)接口主要有3種類(lèi)型:標(biāo)準(zhǔn)8位主機(jī)接口HPI-8,,增強(qiáng)8位主機(jī)接口HPI-8,,增強(qiáng)16位主機(jī)接口HPI-16。增強(qiáng)型的HPI可以允許主機(jī)訪(fǎng)問(wèn)DSP所有的片上RAM單元,,而標(biāo)準(zhǔn)主機(jī)接口只允許訪(fǎng)問(wèn)固定的2 K片上RAM,。本文中用到的TMS320C5402擁有增強(qiáng)HPI-16主機(jī)接口,。它由以下5部分組成:
    1)HPI存儲(chǔ)器(DARAM)  傳送主機(jī)與DSP之間的數(shù)據(jù),,在一個(gè)機(jī)器周期內(nèi)能被訪(fǎng)問(wèn)2次,可以用作通用的雙導(dǎo)址數(shù)據(jù)RAM或者程序RAM,。
    2)HPI地址寄存器(HPIA)  只有主機(jī)能對(duì)其進(jìn)行直接訪(fǎng)問(wèn),。該寄存器中存放著當(dāng)前尋址的HPI存儲(chǔ)單元的地址,。
    3)HPI控制寄存器(HPIC)  地址002CH,主機(jī)和DSP都能對(duì)他直接訪(fǎng)問(wèn),,用來(lái)保存HPI操作的控制和狀態(tài)位,。
    4)HPI數(shù)據(jù)鎖存器(HPID)  只有主機(jī)能對(duì)它進(jìn)行直接訪(fǎng)問(wèn)。如果當(dāng)前進(jìn)行的是讀操作,,則HPID中存放的是要從HPI存儲(chǔ)器中讀出的數(shù)據(jù),;如果當(dāng)前進(jìn)行寫(xiě)操作,則HPID中存放的是將要寫(xiě)到HPI存儲(chǔ)器的數(shù)據(jù),。
    5)HPI控制邏輯  處理HPI與主機(jī)之間的接口信號(hào),。
    接口電路中使用的引腳及其作用是:HD[15:O]:并行、雙向,、三態(tài)的數(shù)據(jù)總線(xiàn),,不傳遞數(shù)據(jù)時(shí)為高阻態(tài);HHWIL:半字定義選擇引腳,,用來(lái)表示第一或者第二半字,。當(dāng)?shù)碗娖綍r(shí)表示第一半字;當(dāng)高電平時(shí)表示第二半字,。:讀/寫(xiě)輸入信號(hào),。高電平表示主機(jī)要讀HPI,低電平表示寫(xiě)HPI,。若主機(jī)沒(méi)有讀/寫(xiě)選通,,則可以用一根地址線(xiàn)代替。HCNTL0和HCNTLl控制引腳表示訪(fǎng)問(wèn)那個(gè)內(nèi)部HPI寄存器和訪(fǎng)問(wèn)寄存器的類(lèi)型,。表l是具體功能說(shuō)明,。:輸入主要作為HPI的使能信號(hào),而信號(hào)控制HPI數(shù)據(jù)傳遞,;它們?nèi)呱蓛?nèi)部選通信號(hào),。就緒信號(hào)引腳,高電平表示HPI已經(jīng)準(zhǔn)備好執(zhí)行1次數(shù)據(jù)傳送,;低電平表示HPI正忙,。HINT:主機(jī)外部中斷信號(hào),用于HPI向主機(jī)發(fā)出中斷,。地址選通信號(hào),,僅用于復(fù)用方式。對(duì)于地址/數(shù)據(jù)總線(xiàn)分開(kāi)的主機(jī),,必須把信號(hào)連接到高電平,。


2.2 接口電路及其工作原理
   
S3C2440與TMS320C5402通過(guò)HPI連接的接口電路如圖2所示,二者連接簡(jiǎn)潔方便,不必使用任何的附加電路,。工作時(shí),,ARM首先初始化控制寄存器HPIC和地址寄存器HPIA,然后對(duì)HPID進(jìn)行讀寫(xiě),。初始化HPIC,、HPIA時(shí),通過(guò)A2,、A3,、A4、A5對(duì)應(yīng)的地址進(jìn)行操作,,設(shè)置寄存器訪(fǎng)問(wèn)控制HCNTL0,、HCNTL1、讀寫(xiě)控制和半字訪(fǎng)問(wèn)HHWIL,,配置好HPIC,,并在HPIA中寫(xiě)入HPI存儲(chǔ)器的起始地址。因?yàn)锳RM主機(jī)具有獨(dú)立的地址總線(xiàn)和數(shù)據(jù)總線(xiàn),,采用非復(fù)用方式,,所以將HAS信號(hào)接高電平(VCC)。S3C2440的nWAIT信號(hào)與HPI的信號(hào)邏輯上反向,,之間用反相器連接,。  S3C2440通過(guò)片選信號(hào)nGCS2、讀使能信號(hào)nOE,、寫(xiě)使能信號(hào)nWE三者生成內(nèi)部選通信號(hào),,控制對(duì)HPI的讀寫(xiě)。



3 軟件設(shè)計(jì)
3.1 Linux驅(qū)動(dòng)程序

    Linux操作系統(tǒng)引入設(shè)備文件的概念,,即把每一個(gè)設(shè)備都看作一個(gè)文件,,像對(duì)待文件一樣對(duì)設(shè)備進(jìn)行操作。在Linux操作系統(tǒng)下,,設(shè)備文件主要有3種類(lèi)型:字符設(shè)備,、塊設(shè)備、網(wǎng)絡(luò)設(shè)備,,各自對(duì)應(yīng)一種類(lèi)型的設(shè)備驅(qū)動(dòng)程序,。本文設(shè)計(jì)的HPI接口的驅(qū)動(dòng)程序?qū)儆谧址O(shè)備驅(qū)動(dòng)程序。
    Linux下的驅(qū)動(dòng)程序是為相應(yīng)的設(shè)備編寫(xiě)多個(gè)基本函數(shù),,填充file_operations結(jié)構(gòu)體,。其中定義了實(shí)現(xiàn)各種操作函數(shù)。如下所示:
   
    其中,,open和release完成設(shè)備的打開(kāi)和關(guān)閉,。mmap為內(nèi)存地址映射操作,。驅(qū)動(dòng)程序的設(shè)計(jì)是通過(guò)實(shí)現(xiàn)個(gè)中操作函數(shù)的基本功能,為相應(yīng)的設(shè)備在應(yīng)用層提供統(tǒng)一的接口,。
    下面是本文中的HPI接口的驅(qū)動(dòng)程序的設(shè)備入口hpi_open函數(shù),它負(fù)責(zé)打開(kāi),、準(zhǔn)備設(shè)備,。

    任何時(shí)候?qū)ψ址O(shè)備(HPI)接口進(jìn)行打開(kāi)操作,都會(huì)調(diào)用設(shè)備的open入口點(diǎn)(hpi_open),。所以open函數(shù)(hpi_open)必須對(duì)將要進(jìn)行的I/O操作(對(duì)DSP讀寫(xiě)數(shù)據(jù))做好必要的準(zhǔn)備工作,,例如設(shè)備是獨(dú)占的,則open函數(shù)(hpi_open)必須將設(shè)備標(biāo)記成忙狀態(tài),,如上面例程中的①處兩行所示,。
3.2 驅(qū)動(dòng)程序中映射的實(shí)現(xiàn)
   
由于在Linux系統(tǒng)中,用戶(hù)應(yīng)用程序不能直接對(duì)驅(qū)動(dòng)程序的內(nèi)存空間進(jìn)行操作,,因此必須用到內(nèi)存映射機(jī)制,。內(nèi)存映射是指把內(nèi)核中的特定的內(nèi)存空間映射到用戶(hù)空間的內(nèi)存中去。對(duì)驅(qū)動(dòng)程序來(lái)說(shuō),,內(nèi)存映射可以提供給用戶(hù)程序直接訪(fǎng)問(wèn)設(shè)備內(nèi)存的能力,。
    mmap系統(tǒng)調(diào)用映射一個(gè)設(shè)備,意味著使用戶(hù)空間的一段地址關(guān)聯(lián)到設(shè)備內(nèi)存上,,這使得只要程序在分配的地址范圍內(nèi)進(jìn)行讀取或者寫(xiě)入,,實(shí)際上就是對(duì)設(shè)備的訪(fǎng)問(wèn)。
    mmap方法是file_operations結(jié)構(gòu)的一部分,,要實(shí)現(xiàn)映射必須分兩步:
    1)調(diào)用內(nèi)核中的remap_page_range函數(shù),,它的功能是:構(gòu)造用于映射一段物理地址的新頁(yè)表,實(shí)現(xiàn)了內(nèi)核空間與用戶(hù)空間的映射,,其原型如下:

    函數(shù)參數(shù)的確切含義如下:unsigned long virt_add為重映射開(kāi)始處的虛擬地址,。這個(gè)函數(shù)為虛地址空間virt_add和virt_add+size之間的范圍構(gòu)造頁(yè)表。unsigned long phys_add為虛擬地址應(yīng)該映射到的物理地址,。unsigned long size為被重映射的區(qū)域的大小,,以字節(jié)為單位。pgprot_t prot為新VMA所請(qǐng)求的“保護(hù)”屬性,。驅(qū)動(dòng)程序不必修改保護(hù),,在vma->vma_page_prot中找到的參數(shù)可以不加改變地使用。
    本課題中使用mmap調(diào)用的代碼如下:

    這樣就為DSP的HPI接口所對(duì)應(yīng)的總線(xiàn)物理地址:0x10000000(對(duì)應(yīng)nGCS2)在vma->vm_start和vma->vm_end之間構(gòu)造了新的頁(yè)表,。
    2)在構(gòu)造好新頁(yè)表之后,,可以調(diào)用mmap函數(shù)完成映射,從圖2可以看到硬件連接圖中的連接DSP片選信號(hào)的是引腳nGCS2,,從圖3中查出它在內(nèi)存空間對(duì)應(yīng)的位置是0x10000000,。mmap函數(shù)的原型是:mmap(void*start,,sizelength,int prot,,int flags,,int fd,off_toff-set),。用以下語(yǔ)句獲得映射后的地址:
    hpi_mmap_add=mmap(NULL,,length,PROT_READ|PROT_WRITE,,MAP_SHARED,,hpi_fd,0)其中參數(shù)start指明描述字fd對(duì)應(yīng)的“文件”(也就是/dev/hpi設(shè)備)在進(jìn)程地址空間內(nèi)的映射區(qū)的開(kāi)始地址,,必須是頁(yè)面對(duì)齊的地址,,通常設(shè)為NULL,讓內(nèi)核去自動(dòng)選擇開(kāi)始地址,。任何情況下,,mmap的返回值為內(nèi)存映射區(qū)的開(kāi)始地址。這樣通過(guò)對(duì)hpi_mmap_add操作,,實(shí)現(xiàn)對(duì)起始地址為0x10000000的內(nèi)存段操作,。


3.3 驅(qū)動(dòng)程序的內(nèi)核加載方式
   
在完成了嵌入式Linux驅(qū)動(dòng)程序的編寫(xiě)測(cè)試工作后,下一步就是將編寫(xiě)好的驅(qū)動(dòng)程序加載到系統(tǒng)內(nèi)核,,完成驅(qū)動(dòng)硬件的工作,。通常有以下兩種做法:
    1)驅(qū)動(dòng)程序直接編譯入內(nèi)核 采用這種方式編譯的驅(qū)動(dòng)程序在內(nèi)核啟動(dòng)時(shí)就已經(jīng)在內(nèi)存中,運(yùn)行時(shí)不需要再自行加載驅(qū)動(dòng),,可以保留專(zhuān)用的存儲(chǔ)器空間,。
    2)驅(qū)動(dòng)程序的模塊加載 采用模塊加載方式的驅(qū)動(dòng)程序?qū)?huì)以模塊形式存儲(chǔ)在文件系統(tǒng)里,需要時(shí)動(dòng)態(tài)載入內(nèi)核即可,,使得驅(qū)動(dòng)程序按需加載,,不用時(shí)節(jié)省內(nèi)存,并且驅(qū)動(dòng)程序相對(duì)獨(dú)立于內(nèi)核,,升級(jí)靈活,,授權(quán)方式靈活。本文就采用此種方式,。
    因?yàn)椴捎玫氖悄K加載方式,,所以還需要借助兩個(gè)重要的函數(shù)init_module()和cleanup_module(),完成模塊的注冊(cè)和卸載,。具體源碼可以參見(jiàn)/usr/src/linux/kemel/module.c,。在2.3版本以后采用了新的方法命名這兩個(gè)函數(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è)計(jì)方法
   
利用編寫(xiě)好的驅(qū)動(dòng)程序,,用戶(hù)可以編寫(xiě)出不同的應(yīng)用接口程序,。下面給出自增寫(xiě)的方法:
    根據(jù)圖2的接口電路,A2,,A3,,A4,A5對(duì)應(yīng)的接口分別是HCNTI0,,HCNTL1,,,HHWIL,,當(dāng)自增模式寫(xiě)低半字時(shí),它們的值應(yīng)該分別是:HCNTL0=0,,HCNTL1=1,,,HHWIL=O,,即A[5:2]=0010,,在HPI_VA_BASE上增加偏移就可以對(duì)控制口線(xiàn)控制。所以自增寫(xiě)第一半字時(shí),,加00000100即:0x04,,當(dāng)自增模式寫(xiě)高字節(jié)時(shí),它們的值應(yīng)該是HCNTL0=0,,HCNTL1=1,,,HHWIL=1,,即A[5:2]=1010,。所以自增寫(xiě)第二半字時(shí),加00101000即:0x28,。對(duì)HPI控制寄存器寫(xiě)地址用如下宏定義:
   
    另外,,在自增寫(xiě)過(guò)程中,對(duì)于作為接收端的DSP處理器,,需要明確:1)是否準(zhǔn)備就緒,,可以進(jìn)行寫(xiě)入數(shù)據(jù),HPI-16中可以通過(guò)HPIC寄存器查詢(xún)HRDY的狀態(tài),,當(dāng)HRDY為1時(shí),,即表明HPI已經(jīng)準(zhǔn)備就緒;2)指明要寫(xiě)數(shù)據(jù)的區(qū)域址,,即dsp_add_w=(hpi.hpi_dsp_add),,這是從應(yīng)用程序傳過(guò)來(lái)的參數(shù),,以確定寫(xiě)數(shù)據(jù)區(qū)域的起始地址。自增寫(xiě)的代碼和注釋如下:



4 結(jié)束語(yǔ)
   
通過(guò)一個(gè)嵌入式機(jī)器視覺(jué)系統(tǒng)工程實(shí)例,,闡述了嵌入式系統(tǒng)中,,用ARM+DSP的雙核結(jié)構(gòu)加載Linux操作系統(tǒng),通過(guò)HPI接口進(jìn)行通信和交換數(shù)據(jù)的設(shè)計(jì)方法,,設(shè)計(jì)了HPI接口連接的硬件電路和Linux環(huán)境下的驅(qū)動(dòng)程序,,描述了該接口的具體應(yīng)用設(shè)計(jì)方法。
    ARM+DSP的雙核系統(tǒng)是新型的嵌入式機(jī)器視覺(jué)系統(tǒng)構(gòu)建方法,,而這里設(shè)計(jì)的通過(guò)HPI接口交換數(shù)據(jù)的雙機(jī)通信方法,,在機(jī)器視覺(jué)系統(tǒng)項(xiàng)目中被成功地應(yīng)用證明,傳輸數(shù)據(jù)速度達(dá)到10 Mb/s,,能夠滿(mǎn)足嵌入式系統(tǒng)對(duì)實(shí)時(shí)性的要求,,具有廣闊的應(yīng)用前景。但在應(yīng)用中需要注意的是:HPI接口的讀寫(xiě)過(guò)程都涉及到公共的寄存器(HPI的控制寄存器,、地址寄存器和數(shù)據(jù)寄存器)及HPI接口提供給主機(jī)(host)端讀寫(xiě)的內(nèi)存的相關(guān)操作,,所以在特定的應(yīng)用程序、驅(qū)動(dòng)程序的設(shè)計(jì)中,,一定要用信號(hào)量等互斥機(jī)制加以保護(hù),,否則,會(huì)出現(xiàn)讀寫(xiě)錯(cuò)亂的現(xiàn)象,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。