大地资源网视频在线观看新浪,日本春药精油按摩系列,成人av骚妻潮喷,国产xxxx搡xxxxx搡麻豆

您現(xiàn)在的位置:智能制造網(wǎng)>技術(shù)中心>嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信(2)

直播推薦

更多>

企業(yè)動態(tài)

更多>

推薦展會

更多>

嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信(2)

2008年01月31日 10:15:35人氣:1130來源:浙江啟揚(yáng)智能科技有限公司


4.3 驅(qū)動程序的系統(tǒng)調(diào)用接口

為對處于總線地址0x4000_0000的DSP板進(jìn)行操作,首先應(yīng)用open打開設(shè)備,該設(shè)備可以通過mknod建立(本例建立的是/dev/hpi)。然后mmap完成映射。
Int dev_hpi_open(str_HPI *ss)
{size_t length=1024;
int i;
if((*ss).hpi_number==0)
{
(*ss).hpi_fd=open(/dev/hpi,O_RDWR);
}
if((*ss).hpi_fd==-1)return -1;
(*ss).hpi_mmap_start =mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,((*ss).hpi_fd),0); //獲得映射區(qū)內(nèi)存的起始地址
return 0;
} //dev_hpi_open
mmap的作用是將文件內(nèi)容映射到內(nèi)存中。函數(shù)的原形及各參數(shù)定義如下:

*mmap(void *start,size_length,int prot,int flags,intfd,off_t offset)
start指向欲對應(yīng)的內(nèi)存地址,size-length的含義是要映射的量;prot代表映射區(qū)域的保護(hù)方式;flag會影響映射區(qū)域的各種特性;fd為文件描述符;offtoffset代表文件的偏移量,通常設(shè)置為零。

示例程序中的結(jié)構(gòu)體變量ss用來總知各種變量。通過mmap可以獲得映射后的內(nèi)存地址,用(*ss).hpi_mmap_start表示。

一旦獲得了這個起始地址,就能對0x4000_0000起始的總線地址進(jìn)行操作,因為映射已經(jīng)完成,對(*ss).hpi_mmap_start的操作就是對0x4000_0000起始的總線地址進(jìn)行操作,而DSP板HPI接口的控制線正是在這個位置。這樣就實現(xiàn)了物理地址和用戶空間的轉(zhuǎn)換。

4.4 用戶程序接口部分

下面以HPI接口讀寫中zui復(fù)雜的自增讀方式用戶程序為例說明用戶接口程序的設(shè)計過程。要完成自增讀的操作,對于HPI一側(cè),假設(shè)采用軟件握手的方式。要完成的工作如下:

首先讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)備妥。然后寫HPIA以告訴DSP從什么位置開始進(jìn)行自增讀。接著將HPIC的FETCH位置1以刷新寫入。再讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)備妥。zui后從HPID中讀取數(shù)據(jù)。

對于ARM一側(cè),要對HPIC、HPID、HPIA寄存器進(jìn)行讀寫必須滿足HPI接口的定義,具體如下(以自增讀為例):

讀前半字節(jié)(高16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。
讀后半字節(jié)(低16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。
從硬件的原理圖可知,這些HPI的控制口線分別與ARM的一部分地址總線連接。具體為HCNTL0----A2、HCNTL1----A3、HR/W------A4、HHWIL-----A5。
宏定義過程如下:
#define HPIC_R_F(HPI_VA_BASE)*((unsigned long*)((HPI_VA_BASE) 0x00000004 DSPNUMBER))
//讀HPIC*半字
#define HPIC_R_S(HPI_VA_BASE)*((unsigned long*)((HPI_VA_BASE) 0x0000000C DSPNUMBER))
//讀HPIC第二半字
等等,只要改變在HPI_BA_BASE基礎(chǔ)上增加的數(shù)字就可以獲取對控制口線的操作。

在這里HPI_VA_BASE將由映射得到的用戶空間虛擬地址代替,所以如果“自增模式讀HPID*半字”那么就可求滿足前文提到的HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0,也就是要滿足地址位A2=0、A3=1、A4=1、A5=0,所以只要在HPI_VA_BASE的基礎(chǔ)上加0x0000_0006就可以了。要注意的是ARM處理器的地址是32位。所以是加上0x0000_0006而不是0x0000_0018。

另外,還有二點需要說明:

通過改變宏定義中的DSPNUMBER常量可以控制地址總線A6、A7、A8。通過這3個總線組合并通過簡單地址譯碼電路就可以完成對多塊DSP板的讀寫。在硬件電路中可以定義為0。

A4(HR/W)同時還用做SN74LVTH16245的方向控制。讀的時候A4=1,此時SN74LVTH16245的數(shù)據(jù)從AB;反之,則從BA。

下面給出程序中的自增讀和注釋部分:

int dev_hpi_auto1(str_HPI *ss)
{volatile unsigned long dsp_addr_hign_read_auto;//定義各種中間變量
volatile unsigned long dsp_addr_low_read_auto;
volatile unsigned long dsp_data_hign_read_auto;
volatile unsigned long dsp_data_low_read_auto;
volatile unsigned long dsp_add_temp;
int i;
volatile unsigned long data_length;
//---read hpic----the host polls the HPIC for HRDY=1
volatile unsigned long polltest;
polltest=HPIC_R_F((*ss).hpi_mmap_start);
while((polltest&0x00000008)!=0x00000008)
{polltest=HPIC_R_F((*ss).hpi_mmap_start);
}
dsp_add_temp=((*ss).hpi_dsp_add);//從應(yīng)用程序傳過來的參數(shù),指明希望從DSP的哪一個地址讀起
dsp_addr_low_read_auto=((dsp_add_temp)&0x0000ffff) ((dsp_add_temp)<<16); //完成數(shù)據(jù)轉(zhuǎn)換
dsp_addr_hign_read_auto=((dsp_add_temp)&0xffff0000) ((dsp_add_temp)>>16);
//---write dsp s addr to HPIA
HPIA_W_F ((*ss).hpi_mmap_start)=(dsp_addr_hign_read_auto);
HPIA_W_S((*ss).hpi_mmap_start)=(dsp_addr_low_read_auto);
//--------write hpic----------to FETCH bit
HPIC_W_F((*ss).hpi_mmap_start)=0xfff8fff8;
HPIC_W_S((*ss).hpi_mmap_start)=0xfff8fff8;
//---read dsp s data from HPID,autoincrement mode
data_length=(*ss).hpi_dsp_data_length;//從應(yīng)用程序傳過來的參數(shù),指明期望讀取多少個字
for(i=0;i<=data_length;i )
{//---read hpic----the host polls the HPIC for HRDY=1 again
polltest=HPIC_R_F((*ss).hpi_mmap_start);
while((polltest&0x00000008)!=0x00000008)
{polltest=HPIC_R_F((*ss).hpi_mmap_start);
}
dsp_data_hign_read_auto =HPID_R_F_A((*ss).hpi_mmap_start); //讀*個半字。
dsp_data_low_read_auto =HPID_R_S_A((*ss).hpi_mmap_start); //第二個個半字
{(*ss).buffer [(i)]=(dsp_data_hign_read_auto&oxffff0000) (dsp_data_low_read_auto&0x0000ffff);
//數(shù)據(jù)拼接,放入結(jié)構(gòu)體,回傳給調(diào)用的用戶程序。
}
}
} //dev_hpi_read_auto(str_HPI *ss)
  
5 結(jié)束語

本文通過一個實例說明了如何實現(xiàn)在Linux操作系統(tǒng)下ARM體系結(jié)構(gòu)的處理器與DSP的數(shù)據(jù)通信。給出了接口部分的硬件處理和部分驅(qū)動程序。

在某款智能儀表的研發(fā)過程中,給出一個簡單的地址譯碼電路對二塊(或更多)DSP板進(jìn)行交替讀寫,并以自增讀方式進(jìn)行操作,當(dāng)ARM主頻為180MHz,DSP主頻為125MHz時,對DSP數(shù)據(jù)的讀寫速度可以達(dá)到每毫秒1k的32位字。


 

全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

免責(zé)聲明

  • 凡本網(wǎng)注明"來源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請必須注明智能制造網(wǎng),http://www.xashilian.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
  • 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
  • 本網(wǎng)轉(zhuǎn)載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品來源,并自負(fù)版權(quán)等法律責(zé)任。
  • 如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

<
更多 >

工控網(wǎng)機(jī)器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機(jī)械包裝機(jī)械印刷機(jī)械農(nóng)業(yè)機(jī)械食品加工設(shè)備制藥設(shè)備倉儲物流環(huán)保設(shè)備造紙機(jī)械工程機(jī)械紡織機(jī)械化工設(shè)備電子加工設(shè)備水泥設(shè)備海洋水利裝備礦冶設(shè)備新能源設(shè)備服裝機(jī)械印染機(jī)械制鞋機(jī)械玻璃機(jī)械陶瓷設(shè)備橡塑設(shè)備船舶設(shè)備電子元器件電氣設(shè)備


我要投稿
  • 投稿請發(fā)送郵件至:(郵件標(biāo)題請備注“投稿”)1271141964.qq.com
  • 聯(lián)系電話0571-89719789
工業(yè)4.0時代智能制造領(lǐng)域“互聯(lián)網(wǎng)+”服務(wù)平臺
智能制造網(wǎng)APP

功能豐富 實時交流

智能制造網(wǎng)小程序

訂閱獲取更多服務(wù)

微信公眾號

關(guān)注我們

抖音

智能制造網(wǎng)

抖音號:gkzhan

打開抖音 搜索頁掃一掃

視頻號

智能制造網(wǎng)

公眾號:智能制造網(wǎng)

打開微信掃碼關(guān)注視頻號

快手

智能制造網(wǎng)

快手ID:gkzhan2006

打開快手 掃一掃關(guān)注
意見反饋
關(guān)閉
企業(yè)未開通此功能
詳詢客服 : 0571-87858618
主站蜘蛛池模板: 礼泉县| 新昌县| 大余县| 浮梁县| 富源县| 祥云县| 敖汉旗| 大石桥市| 三明市| 武夷山市| 延津县| 仁怀市| 叙永县| 湘阴县| 环江| 清流县| 赤城县| 涞源县| 台东县| 镇原县| 宜良县| 老河口市| 焦作市| 肃南| 台山市| 白朗县| 贵港市| 淳安县| 金秀| 内黄县| 台安县| 新和县| 肇庆市| 青冈县| 白银市| 温州市| 遵义县| 阳高县| 东方市| 大石桥市| 彭州市|