ARM9/STR92008. 4. 27. 01:56

STR911 GPIO 토글링 속도 측정

STR911 GPIO 토글링 속도 측정

while(1)
{
   GPIO2->DR[0x3FC] ^= 0xFF;
}


기본 예제로 클럭 설정시 25Mhz에서
  SCU_MCLKSourceConfig(SCU_MCLK_OSC);         /*Use OSC as the default clock source*/
  SCU_PCLKDivisorConfig(SCU_PCLK_Div1);      /* ARM Peripheral bus clokdivisor = 1*/
대략 600kHz 정도 출력된다.

PLL 클럭으로 설정시
  SCU_MCLKSourceConfig(SCU_MCLK_PLL);    /*Use OSC as the default clock source*/
  SCU_PCLKDivisorConfig(SCU_PCLK_Div1); /* ARM Peripheral bus clokdivisor = 1*/
  SCU_PLLCmd  (ENABLE);
1.85Mhz, 280ns 정도 나온다.

이건... AVR수준인데... [다른 MCU속도 측정 결과]
클럭 설정에 대한 매뉴얼을 더 읽어봐야 할것 같지만 아무래도 PLL설정에 문제가 있는것 같고 GPIO를 위해 포인터 접근하는 부분도 문제가 있을것 같다...

추후 테스트 하는대로 정리 하도록->
코드를 살펴보니 어셈블 되었을때 4개의 명령어로 처리된다. 그래도 이정도 속도는 아닌데... PLL설정 부분을 확인하는것이 필요하다.

     67            while(1)
     68            {
     69            GPIO2->DR[0x3FC] ^= 0xFF;
   \                     ??main_1:
   \   0000006C   FC03D4E5           LDRB     R0,[R4, #+1020]
   \   00000070   FF0020E2           EOR      R0,R0,#0xFF
   \   00000074   FC03C4E5           STRB     R0,[R4, #+1020]
   \   00000078   FBFFFFEA           B        ??main_1
   \                     ??main_0:
   \   0000007C   ........           DC32     GPIO_InitStructure
     70            }


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2008. 3. 12. 00:30

dsPIC33 속도 테스트 - LED 토글 테스트

dsPIC33 속도 테스트 - LED 토글 테스트


LED토글링으로 dsPIC33 속도 측정을 했다.
여러가지 테스트를 해서 결론적으로 LED 속도는 56ns/6.6Mhz 이 출력된다.

[다른 MCU속도 측정 결과] 에 비교하면 상당히 빠르다..

dsPIC33 속도 테스트를 위해 아래와 같이 LED토글 하는 코드를 작성했다.
#define LED1_BIT   BIT0
#define LED1_PORT   PORTB
#define Led1Init()   _TRISB7 = 0

#define Led1Toggle()  _RB7 ^= 1

main()
{
  :
 while(1)
 {
   Led1Toggle();
 }

LED토글 속도 측정 결과 330ns/14Mhz 가 측정된다. 40MIP라기에는 너무 느리다.

어샘블 코드를 들여다보자
헉! 옵티마이즈 문제인가?
Level-s 면 나쁘지 않은데... 이런 무식한 컴파일러를 봤나~
Level-s 330ns

26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028C  BFC2C2     mov.b 0x02c2,0x0000
 0028E  FB8000     ze 0x0000,0x0000
 00290  DE0047     lsr 0x0000,#7,0x0000
 00292  A20400     btg 0x0000,#0
 00294  DD0047     sl 0x0000,#7,0x0000
 00296  202C21     mov.w #0x2c2,0x0002
 00298  784091     mov.b [0x0002],0x0002
 0029A  A17401     bclr 0x0002,#7
 0029C  70C080     ior.b 0x0002,0x0000,0x0002
 0029E  780001     mov.w 0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
 002A2  37FFF4     bra 0x00028c

옵티마이즈 옵션을 Level-0으로 변경하고 컴파일 해보자



Level - 0

25:                 
26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028E  BFC2C2     mov.b 0x02c2,0x0000
 00290  FB8000     ze 0x0000,0x0000
 00292  DE0047     lsr 0x0000,#7,0x0000
 00294  A20400     btg 0x0000,#0
 00296  604061     and.b 0x0000,#1,0x0000
 00298  DD00C7     sl 0x0000,#7,0x0002
 0029A  BFC2C2     mov.b 0x02c2,0x0000
 0029C  A17400     bclr 0x0000,#7
 0029E  704001     ior.b 0x0000,0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
29:                 }
 002A2  37FFF5     bra 0x00028e

그닥 줄여지지 않는다. 토글 속도는 280ns/1.6Mhz가 나온다. 뭔가 이상하다.
Levle3은 더 과관이다.  아무리 컴파일러가 이상해도 뭔가 이상하다...
Level3 - 630ns, 7.70khz

26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028C  BFC2C2     mov.b 0x02c2,0x0000
 0028E  FB8000     ze 0x0000,0x0000
 00290  DE0047     lsr 0x0000,#7,0x0000
 00292  A20400     btg 0x0000,#0
 00294  DD0047     sl 0x0000,#7,0x0000
 00296  202C21     mov.w #0x2c2,0x0002
 00298  784091     mov.b [0x0002],0x0002
 0029A  A17401     bclr 0x0002,#7
 0029C  70C080     ior.b 0x0002,0x0000,0x0002
 0029E  780001     mov.w 0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
 002A2  BFC2C2     mov.b 0x02c2,0x0000
 002A4  FB8000     ze 0x0000,0x0000
 002A6  DE0047     lsr 0x0000,#7,0x0000
 002A8  A20400     btg 0x0000,#0
 002AA  DD0047     sl 0x0000,#7,0x0000
 002AC  202C21     mov.w #0x2c2,0x0002
 002AE  784091     mov.b [0x0002],0x0002
 002B0  A17401     bclr 0x0002,#7
 002B2  70C080     ior.b 0x0002,0x0000,0x0002
 002B4  780001     mov.w 0x0002,0x0000
 002B6  B7E2C2     mov.b 0x0000,0x02c2
 002B8  37FFE9     bra 0x00028c


자세히 들여다 보니 문제는 PORT를 포인터로 접근하는것에 문제가 있는것 같다. 똑똑하지 않는 컴파일러인건지.. 옵티마이즈가 안되는건지?
아무튼 이제 정상적으로 동작하는것 같다.

#define LED1_BIT   BIT0
#define LED1_PORT   LATA
#define Led1Init()   _TRISB0 = 0

#define Led1Toggle()  Tbi(LED1_PORT, LED1_BIT)


26:                 while(1)
27:                 {
28:                  Led1Toggle();
 002CC  AAE2C4    btg.b 0x02c4,#7
 002CE  37FFFE     bra 0x0002cc


코드 수정후에 LED 속도는 56ns/6.6Mhz 나온다.
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x2008. 1. 30. 01:31

[TMS320F2808]성능 테스트 - GPIO 토글링 테스트

[TMS320F2808]성능 테스트 - GPIO 토글링 테스트


GPIO 토글테스트로 TMS320F2808의 성능 테스트를 해보았다. 단순 페리 속도로 CPU의 성능을 테스트 하기는 좀 그렇지만... 아무래도 주로 MPU로 하는 일들이 GPIO로 제어하는 일이 많으므로 [다른 MCU속도 측정 결과] 비교를 위해 GPIO테스트를 해보면 편하다.

일단 가장 간단히 GPIO를 단순히 비트 XOR시켜 속도를 측정했다. TMS320F2808 @20Mhz에서 RAM에 올려 100Mhz코어로 설정.
#define LED0_TOGGLE()  (GpioDataRegs.GPADAT.bit.GPIO6 ^= 1)

측정 결과 대략 180ns (2.94Mhz)가 나온다.
컴파일러의 옵션에 따라 차이는 있겠지만 100Mhz라기에는 좀... 느리다.
어셈블 코드를 보니 역시... 옵티마이즈가 전혀 안되어 있다. 루프도는데 이렇게 무식하게...



TMS320에는 GPIO Toggle Register가 있으므로 이걸 이용해 보자. 역시.. 3줄이면 된다.
테스트 결과 GPIO 토글 속도는 100ns(5.5Mhz) 가 출력된다.



이제야 어느정도 정상 출력되는것 같다.

컴파일 옵션을 최적화해서 테스트 하니 70ns(7.13Mhz) 까지 출력된다.
Posted by nexp

댓글을 달아 주세요

[8051]2006. 6. 13. 20:33

Aduc841 속도 측정 - Aduc841, 8051, AVR 속도 비교

Aduc841 속도 측정 - Aduc841, 8051, AVR 속도 비교

Aduc841 301ns @20Mhz



같은 코드로 측정시 AVR (316ns)과 비교 해서 300ns이므로 AVR에 비해 코드 효율이 좀 떨어지는것 같다. 하지만 기존 8051에 비해서는 상당한 속도향상을 보이고 있다. AVR속도 측정 참고

Standard 8051(11.0592Mhz) P1 On/Off 출력. (4.3us)



Atmega128(16Mhz) PB On/Off 출력. (316ns)

Posted by nexp

댓글을 달아 주세요

[AVR]/AVR_EVM2006. 6. 12. 20:21

Atmega128을 이용하여 CPU실행속도 측정 테스트

Atmega128을 이용하여 CPU실행속도 측정 테스트

단순히 포트 On/Off만을 이용하여 실행 속도를 테스트 하였다.

int main(void)
{

    DDRB = 0xFF;

    while(1)
    {

        PORTB ^= 0xFF;

    }

    return 0;
}

8FEF ldi r24,lo8(-1)

87BB out 55-0x20,r24

L17:

88B3    in r24,56-0x20

8095     com r24 ;$FF-r24

88BB     out 56-0x20,r24

FCCF     rjmp .L17 ;(2cycle)

포트를 On/Off 하기위해 5cycle의 CPU클럭이 필요 하므로

1CPU 클럭 : 1/16Mhz = 62ns

On/Off주가 : 62ns x 5 = 310ns




실제 오실로스코프 확인 결과
Atmega128(16Mhz) PD On/Off 출력. (316ns)




AVR(atmega163 8Mhz) P1 On/Off 출력. (6.36us)



(8051, Aduc841 속도 측정 테스트 참고)
Posted by nexp

댓글을 달아 주세요