[NXP]/LPC1k2011. 1. 1. 16:00

[LPC1K-SM EVM] LPC1113 실행속도 측정 테스트

[LPC1K-SM EVM] LPC1113 실행속도 측정 테스트

LPC1113은 저렴한 가격에 50Mhz로 동작가능 하다. 
12Mhz 클럭을 PLL을 이용해 48Mhz로 설정하고 속도 측정을 해 보았다.

LPC1111/12/13/14의 GPIO특징으로 AHB클럭을 페리 클럭으로 사용하기 때문에 GPIO속도가 빠르다고 한다.




간단히 GPIO 토글을 했을때 3Mhz가 출력되는것을 확인할 수 있다.
#define Led1Toggle()                             (LED1_PORT ^= LED1_BIT)

     15              while(1)
     16              {
     17                  Led1Toggle();
   \                     ??main_1:
   \   00000030   2168               LDR      R1,[R4, #+0]
   \   00000032   4140               EORS     R1,R1,R0
   \   00000034   2160               STR      R1,[R4, #+0]
   \   00000036   FBE7               B        ??main_1
   \                     ??main_0:
   \   00000038   FC3F0350           DC32     0x50033ffc
     18              }
     19              return 0;


[다른 MCU속도 측정 결과]와 비교 하면 AVR보다 저렴하면서 속도도 더 빠르게 동작하는것을 확인할 수 있다.



참고로 오버클럭으로 72Mhz로 설정해본 결과 4.5Mhz출력된다.
void SystemInit(void)
{
   _SystemInit();

    //Main Clock Frequenz einstellen - wird aus XTAL generiert*/
    SetMainClockFreq(72);
    
    //Enable AHB clock to the GPIO domain.
    //LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
}



Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC322010. 11. 25. 23:30

PIC32 속도 측정

PIC32 속도 측정


최대 PIC32는 80Mhz에 0 Waite Flash이다. 물론 코어 속어클럭과 페리 클럭은 분리되어 있고 페리 클럭은 훨신더 느리지만 다른 MCU에 비하면 상당히 빠른 결과가 나왔다. 다른 MCU속도 측정 결과 참고.

우선 기본적인 IO속도 측정을위해 IO토글하는 코드로 테스트 해보자.
8Mhz 클럭을 PLL로 80Mhz로 설정하고 테스트 하였다.
#pragma config FNOSC    = PRIPLL        // Oscillator Selection
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (PIC32 Starter Kit: use divide by 2 only)
#pragma config FPLLMUL  = MUL_20        // PLL Multiplier
#pragma config FPLLODIV = DIV_1         // PLL Output Divider
#pragma config FPBDIV   = DIV_1         // Peripheral Clock divisor
:

main()
{
  SystemInit();

   TRISB = 0;

    while( 1)
    {
       LATB ^= 0xFF;
    } // main loop
}



코드 효율을 보기위해 Disasembly Listing를  Open한다.






옵티마이즈 옵션을 설정한다.



Os 일때  6.6Mhz 출력된다. 40Mhz dsPIC보다 조금 빠르다.

옵티마이즈를 O3으로 바꿔보자.  8Mhz 나온다. 상당히 빠르다.
18:                    LATB ^= 0xFF;
9D000058  8C6B6060   lw          t3,24672(v1)
9D00005C  396A00FF   xori        t2,t3,0xff
9D000060  AC6A6060   sw          t2,24672(v1)
9D000064  8C6B6060   lw          t3,24672(v1)
9D000068  396A00FF   xori        t2,t3,0xff
9D00006C  AC6A6060   sw          t2,24672(v1


코드를 수정해 Port On/Off 만 해보자
Os 일때 20Mhz 가 나온다.
19:                    LATB=0;
9D00005C  AC406060   sw          zero,24672(v0)
20:                    LATB=1;
9D000060  AC436060   sw          v1,24672(v0)


O3일 때 40Mhz 나온다. 멋지다! 이정도 속도면 딜레이를 주어야 할 상황이다.
19:                    LATB=0;
9D00005C  AC406060   sw          zero,24672(v0)
9D000064  AC406060   sw          zero,24672(v0)
20:                    LATB=1;
9D000060  AC436060   sw          v1,24672(v0)
9D000068  AC436060   sw          v1,24672(v0)


저렴한 MCU급에서 이정도 속도는 지금것 못본것같다. 저렴한 가격에 이정도면 쓰일곳이 많을것 같다.

Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2009. 12. 12. 22:56

[CANTUS EVM] GPIO속도 측정 테스트

[CANTUS EVM] GPIO속도 측정 테스트


 
CANTUS는 96MIPS의 5단 파이프라인으로 고속이라고 한다.  GPIO토글속도 테스트로 성능측정을 해 보았다.

CANTUS의 GPIO는 GPIO Ser/Reset레지스터가 따로 존재 하므로 우선 비트 On/Off로 테스트 해본다.

150ns - 3.2Mhz가 출력된다. 96MIPS 속도라고 하기에는 페리가 너무 느리다.
int main()
{
 SystemInit();

 Led1Init();
 
 while(1)
 {
  *R_P5oHIGH |= BIT4;
  *R_P5oLOW |= BIT4;
 }
}

옵티마이즈 옵션을 주어 컴파일을 다시 해 보니
133ns - 3.5M  까지 나온다. 하지만 그렇게 빠르지는 않은것 같다.



단순 ON/OFF만 했을때는 39ns - 12.5Mhz 가 출력된다.
  *R_P5oHIGH = BIT4;
  *R_P5oLOW = BIT4;

클럭설정이 문제 인지.. RAM에 올려서 측정해야 하나? 아무튼 그리 고속이라는 느낌은 아닌데...
Posted by nexp

댓글을 달아 주세요

[AVR]/Mega82009. 9. 16. 20:41

ATMega168 을 이용한 오버클럭 속도 측정

ATMega168 을 이용한 오버클럭 속도 측정



ATMega168 을 이용해서 GPIO 토글속도를 측정 했다. Mega168는 20Mhz까지 구동 가능하므로 24Mhz에서 측정해 보았다.
24Mhz -> 209ns/2.4Mhz

[다른 MCU속도 측정 결과]와 비교 하면 저렴한 Mega168에서 상당히 빠른것 같다.

ATMega168 GPIO속도 측정 소스코드
#define Led1Toggle()              Tbi(LED1_PORT, LED1_BIT)   //PORTB ^= BIT1

int main(void)
{
 SystemInit();

 Led1Init();
 Led1On();

 while (1)
 {
  Led1Toggle();
  //Delay(100);
 }  
}


WinAVR(AVR Gcc) 옵티마이즈 옵션



컴파일러의 어샘블 결과는 아래와 같다. 5 머쉰사이클 정도 나온다.
Level-s 209ns/2.4Mhz
 while (1)
 {
  Led1Toggle();
  88: 92 e0        ldi r25, 0x02 ; 2
  8a: 85 b1        in r24, 0x05 ; 5
  8c: 89 27        eor r24, r25
  8e: 85 b9        out 0x05, r24 ; 5
  90: fc cf        rjmp .-8       ; 0x8a <main+0xa>

Level-0 500ns/1Mhz
  while (1)
 {
  Led1Toggle();
  a8: a5 e2        ldi r26, 0x25 ; 37
  aa: b0 e0        ldi r27, 0x00 ; 0
  ac: e5 e2        ldi r30, 0x25 ; 37
  ae: f0 e0        ldi r31, 0x00 ; 0
  b0: 90 81        ld r25, Z
  b2: 82 e0        ldi r24, 0x02 ; 2
  b4: 89 27        eor r24, r25
  b6: 8c 93        st X, r24
  b8: f7 cf        rjmp .-18      ; 0xa8 <main+0x28>
Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F20132009. 3. 11. 17:02

[MSP430F2013 EVM] 클럭 시스템 및 속도 측정

MSP430 GPIO 토글 해서 클럭 설정에 따른 CPU속도를 측정했다.

프로그램 코드
while(1)
{
    P1OUT ^=  LED1_BIT;
}

ASM코드



측정 결과
1Mhz DCO : 6us

8Mhz DCO: 740ns 665Khz

16Mhz DCO : 360ns 1.4Mhz
(AVR속도 측정 참고)

클럭 설정부분 코드 수정

//Set range :1, 8, 12, 16Mhz
#if (__SYS_CLK__ == SYS_CLK_1MHZ)
 #define CALBC1_FREQ     CALBC1_1MHZ
 #define CALDC0_FREQ     CALDCO_1MHZ
#elif (__SYS_CLK__ == SYS_CLK_8MHZ)
 #define CALBC1_FREQ     CALBC1_8MHZ
 #define CALDC0_FREQ     CALDCO_8MHZ 
#elif (__SYS_CLK__ == SYS_AVR_CLK_12MHZ)
 #define CALBC1_FREQ     CALBC1_12MHZ
 #define CALDC0_FREQ     CALDCO_12MHZ 
#elif (__SYS_CLK__ == SYS_AVR_CLK_16MHZ)
 #define CALBC1_FREQ     CALBC1_16MHZ
 #define CALDC0_FREQ     CALDCO_16MHZ 
#endif
void SystemInit(void)
{
    WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog

    #if __SYS_CLK__
    if (CALBC1_FREQ ==0xFF || CALDC0_FREQ == 0xFF)
    { 
        while(1);    // If calibration constants erased
                     // do not load, trap CPU!!
    }  

    // Set DCO
    BCSCTL1 = CALBC1_FREQ; 
    DCOCTL = CALDC0_FREQ;
    #endif
}


MSP430의 동작 클럭을 보려면 P2.1의 SMCLK핀으로 출력하여 볼수 있다.(물론 SMCLK출력을 하려면 P2SEL비트를 세트해야 한다.)
시스템 클럭을 16Mhz로 설정해도 최대 GPIO toggle 클럭은 MCLK/10 이다. 페리가 느린건지...? 데이터시트에는 없는데 문서를 좀더 찾아볼 필요가 있다.

void main(void)
{
    SystemInit();
   
    Led1Init();
    Led1On();

    Sbi(P2DIR, BIT1);
    Sbi(P2SEL, BIT1);                         // P2.1 = SMCLK
 
    while(1)
    {
        Led1Toggle();
    }
Posted by nexp

댓글을 달아 주세요