2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  嵌</b></p><p><b>  入</b></p><p><b>  式</b></p><p><b>  課</b></p><p><b>  程</b></p><p

2、><b>  設(shè)</b></p><p><b>  計</b></p><p>  課 程 設(shè) 計 任 務(wù) 書</p><p>  題目 DMA傳送編程 </p><p>  主要內(nèi)容、基本要求、主要參考文獻等:</p><p><

3、b>  1、主要內(nèi)容</b></p><p>  (1) 編寫單字節(jié)方式、雙字節(jié)方式和四字節(jié)方式常規(guī)內(nèi)存拷貝及時間檢測程序</p><p>  (2) 編寫DMA方式內(nèi)存拷貝及時間檢測程序</p><p>  (3) 比較DMA方式內(nèi)存拷貝及常規(guī)內(nèi)存拷貝的效率</p><p><b>  2、基本要求</b&

4、gt;</p><p>  (1) 掌握S3C44B0 DMA控制器的使用</p><p>  (2) 掌握DMA軟件編程方法</p><p><b>  3、主要參考文獻</b></p><p>  【1】馬忠梅,馬廣云,徐英惠,田澤.ARM嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ).北京:北京航天航空大學(xué)出版社,2002</p

5、><p>  【2】田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用實驗教程.北京航空航天大學(xué)出版社,2004</p><p>  【3】周立功.ARM微控制器基礎(chǔ)與實戰(zhàn)[M].北京航天航空大學(xué)出版社,2003</p><p><b>  目 錄</b></p><p>  一、課程設(shè)計的基本任務(wù)-------------------

6、---------4</p><p>  二、課程設(shè)計的基本要求----------------------------4</p><p>  三、預(yù)備知識--------------------------------------------4</p><p>  四、實驗設(shè)備--------------------------------------------

7、4</p><p>  五、基礎(chǔ)知識--------------------------------------------4</p><p>  六、課程設(shè)計說明書----------------------------------7</p><p>  七、程序代碼-------------------------------------------8</

8、p><p><b>  DMA 傳送編程.</b></p><p>  一、課程設(shè)計的基本任務(wù)</p><p><b>  了解DMA傳送原理</b></p><p>  掌握S3C44B0 DMA控制器的使用</p><p>  掌握DMA軟件編程方法</p>&

9、lt;p>  二、課程設(shè)計的基本要求</p><p>  編寫單字節(jié)方式、雙字節(jié)方式和四字節(jié)方式常規(guī)內(nèi)存拷貝及時間檢測程序</p><p>  編寫DMA方式內(nèi)存拷貝及時間檢測程序</p><p>  比較DMA方式內(nèi)存拷貝及常規(guī)內(nèi)存拷貝的效率 </p><p><b>  三、預(yù)備知識</b></p>

10、<p>  了解ADT集成開發(fā)環(huán)境的基本功能</p><p>  了解DMA的原理以及處理步驟</p><p><b>  四、實驗設(shè)備</b></p><p>  JX44B0教學(xué)實驗箱</p><p>  ADT1000仿真器和ADT IDE集成開發(fā)環(huán)境 </p><p><

11、;b>  串口連接線</b></p><p><b>  基礎(chǔ)知識</b></p><p>  直接數(shù)據(jù)存儲 - DMA </p><p><b>  DMA方式 </b></p><p>  當高速外設(shè)要與系統(tǒng)內(nèi)存或者要在系統(tǒng)內(nèi)存的不同區(qū)域之間,進行大量數(shù)據(jù)的快速傳送時,查詢方式

12、和中斷方式可能不能滿足要求</p><p>  直接存儲器存取(DMA)就是為解決這個問題提出的</p><p>  采用DMA方式,在一定時間段內(nèi),由DMA控制器取代CPU,獲得總線控制權(quán),來實現(xiàn)內(nèi)存與外設(shè)或者內(nèi)存的不同區(qū)域之間大量數(shù)據(jù)的快速傳送典型的DMA控制器(以下簡稱DMAC)的工作電路 </p><p>  DMA數(shù)據(jù)傳送的工作過程</p>

13、<p>  1) DMAC發(fā)出DMA傳送請求</p><p>  2) DMAC通過連接到CPU的HOLD信號向CPU提出DMA請求</p><p>  3) CPU在完成當前總線操作后會立即對DMA請求做出響應(yīng)CPU的響應(yīng)包括兩個方面:</p><p>  CPU將控制總線、數(shù)據(jù)總線和地址總線浮空,即放棄對這些總線的控制權(quán)</p><

14、;p>  CPU將有效的HLDA信號加到DMAC上,以通知DMAC CPU已經(jīng)放棄了總線的控制權(quán)</p><p>  4) CPU將總線浮空,即放棄了總線控制權(quán)后,由DMAC接管系統(tǒng)總線的控制權(quán),并向外設(shè)送出DMA的應(yīng)答信號</p><p>  5) DMAC送出地址信號和控制信號,實現(xiàn)外設(shè)與內(nèi)存或內(nèi)存之間大量數(shù)據(jù)的快速傳送</p><p>  6) DMAC

15、將規(guī)定的數(shù)據(jù)字節(jié)傳送完之后,通過向CPU發(fā)HOLD信號,撤消對CPU的DMA請求。CPU收到此信號,一方面使HLDA無效,另一方面又重新開始控制總線,實現(xiàn)正常取指令、分析指令、執(zhí)行指令的操作。</p><p><b>  DMA傳送方式</b></p><p><b>  I/O接口到存儲器</b></p><p><

16、;b>  存儲器到I/O接口</b></p><p><b>  存儲器到存儲器</b></p><p>  I/O接口到存儲器的傳送</p><p>  當進行由I/O接口到存儲器的數(shù)據(jù)傳送時,來自I/O接口的數(shù)據(jù)利用DMAC送出的控制信號,將數(shù)據(jù)輸送到系統(tǒng)數(shù)據(jù)總線D0~D7上,同時,DMAC送出存儲器單元地址及控制信號,將

17、存在于D0~D7上的數(shù)據(jù)寫入所選中的存儲單元中。這樣就完成了由I/O接口到存儲器一個字節(jié)的傳送。同時DMAC修改內(nèi)部地址及字節(jié)數(shù)寄存器的內(nèi)容。</p><p><b>  存儲器到I/O接口</b></p><p>  與前一種情況類似,在進行這種傳送時,DMAC送出存儲器地址及控制信號,將選中的存儲單元的內(nèi)容讀出放在數(shù)據(jù)總線D0~D7上,接著,DMAC送出控制信號,

18、將數(shù)據(jù)寫到規(guī)定的(預(yù)選中)端口中去,而后MDAC自動修改內(nèi)部的地址及字節(jié)數(shù)寄存器的內(nèi)容 </p><p>  S3C44B0的DMA控制器</p><p>  S3C44B0集成了4個通道的DMA控制器:</p><p>  兩個ZDMA控制器ZDMA0/1:可以用于存儲器到存儲器、儲存器到I/O設(shè)備、I/O設(shè)備之間的DMA傳送;</p><p&

19、gt;  兩個BDMA控制器BDMA0/1:用于儲存器與I/O設(shè)備之間的傳輸。</p><p>  S3C44B0中與DMA控制器有關(guān)的寄存器</p><p>  ZDMA0/1控制寄存器 </p><p>  ZDMA0起始地址、目的地址寄存器 </p><p><b>  DMA計數(shù)器寄存器</b></p>

20、;<p>  ZDMA0/1控制寄存器 </p><p>  ZDMA0起始地址、目的地址寄存器 </p><p>  DMA計數(shù)器寄存器 </p><p><b>  六、課程設(shè)計說明書</b></p><p>  本實驗通過DMA方式實現(xiàn)存儲器到存儲器間的數(shù)據(jù)傳送,并將其與常規(guī)的內(nèi)存拷貝操作進行比較 &

21、lt;/p><p><b>  拷貝動作的計時處理</b></p><p>  采用定時器進行計時處理,采用函數(shù)Timer_Start啟動計時處理,參數(shù)divider 表示定時時間間隔,</p><p><b>  0 : 16 us</b></p><p><b>  1 : 32 us&l

22、t;/b></p><p><b>  2 : 64 us</b></p><p>  3 : 128 us</p><p>  操作完成時調(diào)用Timer_Stop停止定時器計數(shù),其返回值為計數(shù)值,該值乘以時間間隔(128us)即為計時時間</p><p>  Timer_Start(3);/* 128 u

23、s */</p><p>  time=Timer_Stop();/* 停止定時器 */</p><p>  Uart_Printf("Copy Bytes :time=%f\n",time*128E-6);</p><p>  常規(guī)的內(nèi)存拷貝操作 </p><p><b>  字節(jié)拷貝</b>

24、;</p><p>  *(unsigned char*)(dstAddr) = *(unsigned char*)(srcAddr);</p><p><b>  雙字節(jié)拷貝</b></p><p>  *(unsigned short*)(dstAddr) = *(unsigned short*)(srcAddr);</p>

25、<p><b>  字節(jié)拷貝</b></p><p>  *(unsigned int*)(dstAddr) = *(unsigned int*)(srcAddr);</p><p>  DMA的內(nèi)存拷貝操作 </p><p><b>  清除傳輸完畢標志</b></p><p>  z

26、dma0Done=0;</p><p>  設(shè)置DMA傳輸?shù)钠鹬沟刂泛烷L度</p><p>  rZDISRC0=srcAddr|(dw<<30)|(1<<28);/* dw 為DMA傳輸寬度 */</p><p>  rZDIDES0=dstAddr|( 2<<30)|(1<<28);</p><

27、p>  rZDICNT0=length |( 2<<28)|(1<<26)|(3<<22)|(1<<20);</p><p>  啟動DMA傳輸并開始計時</p><p>  rZDCON0=0x1; </p><p>  Timer_Start(3);</p><p>  DMA的內(nèi)存拷

28、貝操作 </p><p>  等待傳輸完成,傳輸完成標記將在DMA中斷服務(wù)程序中置位</p><p>  while(zdma0Done==0);</p><p>  返回當前定時計數(shù)器中的值</p><p>  time=Timer_Stop();</p><p>  Uart_Printf("ZDMA0

29、 :time=%f\n",time*128E-6);</p><p><b>  關(guān)中斷</b></p><p>  rINTMSK=BIT_GLOBAL;</p><p><b>  DMA中斷處理函數(shù)</b></p><p>  void isr_dma0(void){</p&g

30、t;<p>  rI_ISPC=BIT_ZDMA0;</p><p>  /* 設(shè)置傳輸完畢標志 */ </p><p>  zdma0Done = 1;</p><p><b>  }</b></p><p><b>  實驗報告要求</b></p><p&g

31、t;  什么叫DMA傳送方式?試說明DMA方式傳送數(shù)據(jù)的主要步驟。</p><p>  試比較DMA傳輸、查詢式傳輸及中斷方式傳輸之間的優(yōu)缺點和適用場合? </p><p><b>  七、程序代碼:</b></p><p>  /*********************************************************

32、*****/</p><p>  /* */</p><p>  /* FILE NAME VERSION */</p><p>  /*

33、 */</p><p>  /* DMA.C 1.0 */</p><p>  /* */&l

34、t;/p><p>  /*DESCRIPTION */</p><p>  /* */</p><p>  /* JX44B0(S3C44B0X)DMA實驗

35、 */</p><p>  /* */</p><p>  /* */</p>&l

36、t;p>  /* DATA STRUCTURES */</p><p>  /* */</p><p>  /* FUNCTIONS :

37、 */</p><p>  /* 在JX44B0教學(xué)實驗箱進行DMA方式內(nèi)存拷貝的實驗 */</p><p>  /* */</p><p>  /* DEPENDENCIES

38、 */</p><p>  /* JX44B0-1 */</p><p>  /* JX44B0-2 */<

39、/p><p>  /* JX44B0-3 */</p><p>  /* */</p><p>  /*

40、 */</p><p>  /* NAME: */</p><p>  /* REMARKS: */</p>

41、<p>  /* */</p><p>  /* Copyright (C) 2003 Wuhan CVTECH CO.,LTD */</p><p>  /***********************************

42、***************************/</p><p>  /**************************************************************/</p><p>  /* 學(xué)習(xí)ARM處理器中DMA方式的處理方法: */</p><p>  /* DMA方式:內(nèi)存-

43、>內(nèi)存 DMA方式傳輸數(shù)據(jù) */</p><p>  /* 注意: 學(xué)習(xí)該實驗之前請先學(xué)習(xí)interrupt中斷處理實驗 */</p><p>  /**************************************************************/</p><p>  

44、/* 包含文件 */</p><p>  #include "44b.h"</p><p>  #include "44blib.h"</p><p>  #include "rtc.h"</p><p>  typedef (*ISR_ROUTINE_ENTRY)(void);&l

45、t;/p><p>  #define Printf Uart_Printf</p><p>  /* functions */</p><p>  void Zdma0(int srcAddr,int dstAddr,int length);</p><p>  void Zdma0Done(void);</p><p>

46、  void Test_Zdma0(void);</p><p>  void isr_dma0(void);</p><p>  /* globals */</p><p>  volatile int zdma0Done;</p><p>  void IsrIRQ() __attribute__ ((interrupt("IR

47、Q")));</p><p>  /**************************************************************/</p><p>  // Function name: IsrIRQ</p><p>  // Description : 非矢量方式下中斷的查表處理</p><p

48、>  //中斷地址表位于0x0c7fff00開始的256字節(jié)</p><p>  // Return type: void</p><p>  // Argument : void</p><p>  **************************************************************/<

49、/p><p>  void IsrIRQ()</p><p><b>  {</b></p><p>  int count = 0;</p><p>  unsigned int isr_pending;</p><p>  unsigned int isr_mask = 0x00000001;&l

50、t;/p><p>  unsigned int isr_mask_set = rINTMSK;</p><p>  ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;</p><p><b>  __asm__(</b></p><p>  "

51、;STMFD SP!, {r1,r4-r8}@ SAVE r1,r4-r10 \n"</p><p>  "nop \n");</p><p>  isr_pending = (rINTPND & ~isr_mask_set);</p><p>  while(isr_mask)</p><p>&

52、lt;b>  {</b></p><p>  if(isr_pending&isr_mask)</p><p><b>  {</b></p><p>  isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));</p><

53、p><b>  break;</b></p><p><b>  }</b></p><p><b>  count+=4;</b></p><p>  isr_mask <<= 1;</p><p><b>  }</b></p&

54、gt;<p>  if(isr_routine_entry) (*isr_routine_entry)();</p><p><b>  __asm__ (</b></p><p>  "LDMFD SP!, {r1,r4-r8}@ RESTORE r1,r4-r10 \n"</p><p>  &quo

55、t;nop \n");</p><p><b>  }</b></p><p>  /**************************************************************/</p><p>  // Function name: init_interrupt_handler</p>

56、<p>  // Description : 非矢量方式下中斷向量表初始化處理</p><p>  // Return type: void</p><p>  // Argument : irq_handler</p><p>  // 中斷處理函數(shù)入口</p><p>  ******

57、********************************************************/</p><p>  void init_interrupt_handler(unsigned int irq_handler) </p><p><b>  {</b></p><p><b>  int i;</

58、b></p><p>  rINTPND = 0x00000000;/* 清除所有未決的中斷*/</p><p>  rI_ISPC = 0x03FFFFFF; </p><p>  for( i = 0; i < 256; i+=4)/* 清除中斷表*/</p><p><b>  {</b>

59、</p><p>  *(unsigned int*)(_ISR_STARTADDRESS+i) = 0;</p><p><b>  }</b></p><p>  *(unsigned int*)(HandleIRQ) = irq_handler;/* 設(shè)置IRQ模式處理函數(shù)*/</p><p><b>

60、;  }</b></p><p>  /**************************************************************/</p><p>  // Function name: install_isr_handler</p><p>  // Description : 非矢量方式下中斷向量的安裝&

61、lt;/p><p>  // Return type: void</p><p>  // Argument : irq_no, 中斷號</p><p>  // irq_routine, 中斷處理函數(shù)地址</p><p>  ********************************************

62、******************/</p><p>  void install_isr_handler(int irq_no, void* irq_routine)</p><p><b>  {</b></p><p>  *(unsigned int*)(irq_no) = (unsigned int)irq_routine;<

63、/p><p><b>  }</b></p><p>  /**************************************************************/</p><p>  // Function name: Main</p><p>  // Description : DMA測

64、試程序主函數(shù)</p><p>  // 內(nèi)存->內(nèi)存 DMA方式傳輸數(shù)據(jù)</p><p>  // 傳輸完畢引發(fā)DMA中斷</p><p>  // 注冊中斷源:BIT_ZDMA0</p><p>  // Return t

65、ype: int</p><p>  // Argument : void</p><p>  **************************************************************/</p><p>  int Main(void)</p><p><b>  {</

66、b></p><p>  Uart_Select(0);</p><p>  Uart_Init(MCLK, 115200);</p><p>  Uart_Printf("DMA TEST PROGRAM\n");</p><p>  rINTCON=0x7; /* Non-vect,IRQ disab

67、le,FIQ disable*/</p><p>  init_interrupt_handler((unsigned int)IsrIRQ);</p><p>  install_isr_handler(HandleZDMA0, (void*)isr_dma0);</p><p>  rINTMOD=0x0;/*設(shè)置所有中斷為IRQ模式*/</p

68、><p>  rINTMSK=(0x07ffffff&~(BIT_GLOBAL|BIT_ZDMA0));/* 使能TICK中斷*/</p><p>  rINTCON=0x5;/* 打開IRQ模式的中斷*/</p><p>  Test_Zdma0();</p><p><b>  while(1);</

69、b></p><p><b>  }</b></p><p>  /*************************************************************/</p><p>  // Function name: Test_Zdma0</p><p>  // Descript

70、ion : test zdma 0</p><p>  // Return type: void</p><p>  // Argument : void</p><p>  **************************************************************/</p><p&g

71、t;  void Test_Zdma0(void)</p><p><b>  {</b></p><p>  unsigned char *src, *dst;</p><p><b>  int i;</b></p><p>  unsigned int memSum;</p>&

72、lt;p>  Uart_Printf("[ZDMA0 MEM2MEM Test]\n");</p><p>  dst=(unsigned char *)malloc(0x80000);</p><p>  src=(unsigned char *)malloc(0x80000);</p><p>  /* 將dst區(qū)域設(shè)置為非Cachea

73、ble區(qū)域,關(guān)閉Cache */ </p><p>  rNCACHBE1=(((((unsigned)dst+0x100000)>>12) +1 )<<16 )|((unsigned)dst>>12);</p><p>  Uart_Printf("dst=%x,src=%x\n",(int)dst,(int)src);</p

74、><p>  Zdma0((int)src,(int)dst,0x80000); </p><p>  free(src);</p><p>  free(dst);</p><p><b>  }</b></p><p>  /************************************

75、*************************/</p><p>  // Function name: Zdma0</p><p>  // Description : 以三種不同的方式進行數(shù)據(jù)拷貝,檢查其時間消耗</p><p>  // Return type: void</p><p>  // Argument

76、 : srcAddr,拷貝數(shù)據(jù)的起始地址</p><p>  // dstAddr,拷貝數(shù)據(jù)的目的地址</p><p>  // length, 拷貝數(shù)據(jù)的長度</p><p>  **************************************************************

77、/</p><p>  void Zdma0(int srcAddr,int dstAddr,int length)</p><p><b>  {</b></p><p><b>  int time;</b></p><p>  /* 將目標地址設(shè)置為非Cache區(qū) */</p>

78、<p>  rNCACHBE1 = (((((unsigned)dstAddr+0x100000)>>12) +1 )<<16 ) |</p><p>  ((unsigned)dstAddr>>12);</p><p>  /* 測試單字節(jié)方式的拷貝時間 */</p><p>  /* 啟動定時器,精度128us,用于

79、計時 */</p><p>  Timer_Start(3);</p><p>  for( time = 0; time < length; time++)</p><p><b>  {</b></p><p>  *(unsigned char*)(dstAddr+time) = *(unsigned cha

80、r*)(srcAddr+time);</p><p><b>  }</b></p><p>  /* 返回當前定時計數(shù)器中的值 */</p><p>  time=Timer_Stop();</p><p>  /* 輸出拷貝的時間 */</p><p>  Uart_Printf("

81、Copy Bytes :time=%f\n",time*128E-6);</p><p>  /* 測試雙字節(jié)方式的拷貝時間 */</p><p>  Timer_Start(3);</p><p>  for( time = 0; time < length; time+=2)</p><p><b>  {<

82、;/b></p><p>  *(unsigned short*)(dstAddr+time) = *(unsigned short*)(srcAddr+time);</p><p><b>  }</b></p><p>  time=Timer_Stop();</p><p>  Uart_Printf(&qu

83、ot;Copy short words :time=%f\n",time*128E-6);</p><p>  /* 測試字節(jié)方式的拷貝時間 */</p><p>  Timer_Start(3);</p><p>  for( time = 0; time < length; time+=4)</p><p><b&g

84、t;  {</b></p><p>  *(unsigned long*)(dstAddr+time) = *(unsigned long*)(srcAddr+time);</p><p><b>  }</b></p><p>  time=Timer_Stop();</p><p>  Uart_Prin

85、tf("Copy words :time=%f\n",time*128E-6);</p><p>  /* 清除傳輸完畢標志 */</p><p>  zdma0Done=0;</p><p>  /* 設(shè)置DMA傳輸?shù)钠鹬沟刂泛烷L度 */</p><p>  rZDISRC0=srcAddr|( 2<<30)

86、|(1<<28);</p><p>  rZDIDES0=dstAddr|( 2<<30)|(1<<28);</p><p>  rZDICNT0=length |( 2<<28)|(1<<26)|(3<<22)|(1<<20);</p><p>  /* 啟動DMA傳輸 */<

87、;/p><p>  rZDCON0=0x1; </p><p>  Timer_Start(3);</p><p>  /* 等待傳輸完成 */</p><p>  while(zdma0Done==0);</p><p>  /* 返回當前定時計數(shù)器中的值 */</p><p>  time=Ti

88、mer_Stop();</p><p>  /* 輸出一次傳送的時間 */</p><p>  Uart_Printf("ZDMA0 :time=%f\n",time*128E-6);</p><p>  rINTMSK=BIT_GLOBAL;</p><p><b>  }</b></p>

89、;<p>  /*************************************************************/</p><p>  // Function name: isr_dma0</p><p>  // Description : DMA0 中斷處理例程</p><p>  // Return type

90、: void</p><p>  // Argument : void</p><p>  ***************************************************************/</p><p>  void isr_dma0(void)</p><p><b>  {&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論