cpuspeed.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:6k
源码类别:

uCOS

开发平台:

C/C++

  1. /************************************************ 
  2.   NAME    : CPUSPEED.C
  3.   DESC   : Analyze where the speed bottleneck is.
  4.        1) the code runs only on the cache.
  5.   Revision: 2001.5.17: purnnamu: draft
  6.   Revision: 2003.3.xx: DonGo: modified for 5410.
  7.  ************************************************/
  8. #include <string.h>
  9. #include "def.h"
  10. #include "option.h"
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "mmu.h"
  14. #include "cpuspeed.h"
  15. void CpuSpeedFunc1(void);
  16. void CpuSpeedFunc2(void);
  17. #define LED_DISPLAY(data)     (rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4))
  18. #define WHICH_CPU 2440 // 2440.
  19. #define TEST_STADDR (0x30f00000)
  20. #define TEST_ENDADDR (TEST_STADDR+0xff) //256 bytes
  21. void Test_CpuSpeed(void)
  22. {
  23.     int i,j,base;
  24.     U32 uLockPt,bypass;
  25. // added for testing 2440.
  26.     Uart_Printf("[CPU Core Speed Test]n");
  27. // Set MMU enable and on/off I/D-cache.
  28. Uart_Printf("[MMU enable]n");
  29. MMU_EnableMMU();
  30.     Uart_Printf("[ICache enable]n");
  31. MMU_EnableICache();
  32.     Uart_Printf("[DCache enable]n");
  33. MMU_EnableDCache(); //DCache should be turned on after MMU is turned on.
  34.     //Uart_Printf("[FCLK:HCLK:PCLK] = [%d:%d:%d]MHzn", FCLK/1000000, HCLK/1000000, PCLK/1000000);
  35.     Uart_Printf("DCache locked area: %xH~%xHn", TEST_STADDR, TEST_ENDADDR);
  36.     Uart_Printf("ICache locked area: %x~%x(256B boundary)n",
  37.      (U32)CpuSpeedFunc1,(U32)CpuSpeedFunc2);
  38.     Uart_Printf("LCD is disabled.n");
  39.     //LCD_DisplayControl(0);
  40.     rLCDCON1&=~1; // ENVID=OFF
  41.     LED_DISPLAY(0x1); // LED 1
  42. Uart_Printf("<<LED status>>n");
  43. Uart_Printf("(1) LED4 blink: R/W OK.n");
  44. Uart_Printf("(2) LED4 OFF: Multiply error(R/W OK).n");
  45. Uart_Printf("(3) LED4/7 ON: R/W Error.n");
  46.   Uart_Printf("Cache lock-down.n");
  47.     //========== ICache lock-down ==========
  48.     MMU_SetICacheLockdownBase(10<<26);   // The following code will be filled between cache line 10~63.
  49.     base=10;
  50.     bypass=1;
  51.     uLockPt=(U32)CpuSpeedFunc1&0xffffffe0;
  52.     for(;uLockPt<(U32)CpuSpeedFunc2;uLockPt+=0x20)
  53.     {
  54.         if(((uLockPt%0x100)==0)&&(uLockPt>(U32)CpuSpeedFunc1)) base++;
  55.        
  56. MMU_InvalidateICacheMVA(uLockPt);
  57.         if(bypass==1) MMU_SetICacheLockdownBase(base<<26);  
  58. MMU_PrefetchICacheMVA(uLockPt);
  59.      if(bypass==1) //to put the current code outside base 9
  60.      {
  61.          bypass=0;
  62.          base=0;
  63.             uLockPt-=0x20; //restore uLockPt
  64.      }
  65.     }
  66.     base++;
  67.     MMU_SetICacheLockdownBase(base<<26);  // 256
  68.     if(base>10)
  69.      Uart_Printf("ERROR:ICache lockdown base overflown");
  70.     
  71.     Uart_Printf("lockdown ICache line=0~%dn",base-1);
  72.     //========== DCache lock-down ==========
  73.     base=0;
  74.     uLockPt=(U32)CpuSpeedFunc1&0xffffffe0;
  75.     //Function should be cached in DCache because of the literal pool(LDR Rn,=0xxxxx). ??
  76.     for(;uLockPt<(U32)CpuSpeedFunc2;uLockPt+=0x20)
  77.     {
  78.      if(((uLockPt%0x100)==0)&&(uLockPt>(U32)CpuSpeedFunc1))
  79.          base++;
  80.      MMU_CleanInvalidateDCacheMVA(uLockPt);
  81.         MMU_SetDCacheLockdownBase(base<<26);  
  82.     *((volatile U32 *)(uLockPt));
  83.     }
  84.     base++;
  85.     MMU_SetDCacheLockdownBase(base<<26);  
  86.     for(i=TEST_STADDR;i<TEST_ENDADDR;i+=4)*((U32 *)i)=0x55555555;
  87.     
  88.     for(i=0;i<0x100;i+=0x20)
  89.     {
  90.        MMU_CleanInvalidateDCacheMVA(TEST_STADDR+i);
  91.         MMU_SetDCacheLockdownBase(base<<26);  
  92.         *((volatile U32 *)(TEST_STADDR+i));
  93.     }
  94.     base++;
  95.     MMU_SetDCacheLockdownBase(base<<26);  
  96.    
  97.     Uart_Printf("lockdown DCache line=0~%dn",base-1);
  98.     //========== Check the line is really cache-filled ==========
  99. #if 1
  100.     for(uLockPt=(U32)CpuSpeedFunc1;uLockPt<(U32)CpuSpeedFunc2-4*8;uLockPt+=4)
  101.     {
  102. //*((U32 *)uLockPt)=0xffffffff; //*((U32 *)uLockPt);
  103. *((U32 *)uLockPt)=*((U32 *)uLockPt);
  104.     }
  105. #endif    
  106. // SDRAM Self refresh
  107. LED_DISPLAY(0x2);
  108. //Uart_Getch();
  109. // Set clock out pad.
  110. rGPHCON = (rGPHCON & ~(3<<20)) | (2<<20); // GPH10  = CLKOUT1.
  111. rMISCCR = (rMISCCR & ~(7<<8)) | (2<<8); // CLKOUT1 = FCLK
  112.     CpuSpeedFunc1();
  113. }    
  114. void CpuSpeedFunc1(void)
  115. {
  116.     int i,j;
  117.     i=0;
  118.     for(i=0;i<10;i++) {
  119. LED_DISPLAY(i%16);
  120. for(j=0;j<600000;j++);
  121.     }
  122. //The following code should not use the stack memory.
  123.     // because the stack memory is not DCache-locked.
  124.     // It's should be checked using disassembly code.
  125. #if 1
  126.     // Set clock frequency.
  127. ChangeClockDivider(14,12);
  128. // ChangeMPllValue(0xa1, 0x3,0x1); // FCLK=202MHz
  129. // ChangeMPllValue(150, 6, 0); // FCLK=237MHz
  130. // ChangeMPllValue(180, 3, 0); // FCLK=451MHz
  131. ChangeMPllValue(214, 3, 0); // FCLK=523.8MHz
  132. // ChangeMPllValue(0xa7,0x4,0x0); // FCLK=350MHz
  133. // ChangeMPllValue(0x55,0x1,0x0); // FCLK=372MHz
  134. // ChangeClockDivider(14,12); // 400:100:50
  135. // ChangeMPllValue(92,1,0); // FCLK=400MHz
  136. UPDATE_REFRESH(133000000); // UPDATE_REFRES(HCLK);
  137. #endif
  138. #if 0
  139. rREFRESH |= 1<<22; // SDRAM1 self refresh.
  140. #endif
  141.     LED_DISPLAY(0x0);
  142.     while(1) // only for test: caching area
  143.     {
  144.         for(i=0;i<0x100;i+=4)
  145.             *(volatile U32 *)(TEST_STADDR+i)=0x12345678*i+i; // Write data.
  146.         for(i=0;i<0x100;i+=4) {
  147.             if(*(volatile U32 *)(TEST_STADDR+i)!=0x12345678*i+i) { // Error
  148.         LED_DISPLAY(0x5);
  149.         while(1);
  150.             }
  151.             *(volatile U32 *)(TEST_STADDR+i)=0x0; // Clear memory.
  152.         }
  153.      LED_DISPLAY(0x0);
  154.         i=0;
  155.         i++;
  156.         i=i*0x12345678; // i=1.
  157. if(i==0x12345678) LED_DISPLAY(0x1); //OK.
  158. else LED_DISPLAY(0x0);
  159.     }    
  160. }
  161. void CpuSpeedFunc2(void){}