[DSP]/PICCOLO2011. 4. 30. 18:30

[TMS320F28069 EVM] GPIO토글 속토 측정

[TMS320F28069 EVM] GPIO토글 속토 측정



TMS320F28069 는 최대 클럭 80Mhz까지 가능하다. GPIO Toggle 속도를 측정해 보았다.

void main(void)
{
 //DSP System Initialize
 SystemInit();

 //LED Initialize
 Led1Init();
 Led1On();

 while(1)
 {
  GpioDataRegs.GPBTOGGLE.all = BIT34;
 }
}


메모리로 제어하기
아래 코드와 같이 비트 단위로 쉽게 제어 하기 위해 메모리로 제어하면  5Mhz정도가 정도가 나온다.
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;





레지스터로 제어하기
8Mhz정도가 나오는데... 메모리 제어 처럼 보이지만 결국 레지스터 주소를 사용하므로 레지스터만 사용한다.



컴파일러에서 옵티마이즈 해 줄것으로 예상했지만 옵션을 바꿔봐도 메모리 제어, 레지스터 제어 결과가 다르게 나온다.
프로그램작성은 편할지 몰라도 그만큼 속도의 희생이 필요한것 같다.

앞으로 GPIO제어에는 레지스터 접근방법을 사용해야 겠다.
#define Led1Off()      GpioDataRegs.GPBSET.bit.GPIO34 = 1;
#define Led1On()      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;

[참고] MCU속도 측정 결과 
Posted by nexp

댓글을 달아 주세요

ARM9/S3C64102011. 3. 28. 09:30

[S3C6410] GPIO 속도테스트

[S3C6410] GPIO 속도테스트




간단히 gpio.cpp 에서 제공되는 함수를 이용하여 PORTI를 토글시켜 보았다.
토글 속도가 220ns - 2.2Mhz가 나온다. 느린데..
#define Led1Toggle()            GPIO_SetDataAll(eGPIO_I, GPIO_GetDataAll(eGPIO_I) ^ BIT0)


포트를 S3C6410 GPIO 레지스터로 집접 제어하도록 수정해 보았다.
198ns 2.5Mhz로 조금 더 빨라 졌지만 여전히 느리다.

#define Led1Toggle()           PORTI ^= BIT0

GPIDAT레지스터는 0x7F008104에 할당되어 있다.



#define PORTI      (*(volatile unsigned*)0x7F008104)

while(1)
{
    Led1Toggle();
}


페리 클럭이 느린건지... 설정이 문제인지... 토글레지스터가 없긴하지만 다른 MCU속도 측정 결과 를 참고 하면 GPIOO 만으로 제어는 힘들듯..

참고로 단순 ON/OFF만 했을때는 2배 빨라진다. 다른 MCU는 3~4배 이상 빨라지는것과 비교하면 코드 효율이 좋은것 같다.

while(1)
{
    Led1On();
    Led1Off();
}
Posted by nexp

댓글을 달아 주세요

[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

댓글을 달아 주세요