[MSP430]/MSP4322016. 5. 6. 18:06

MSP432 성능 테스트 - GPIO토글

MSP432 성능 테스트 - GPIO토글



MSP432는 Cortex-M4 코어의 최대 48Mhz로 동작하는 저전력 MCU이다. 단순 비교는 의미 없기는 하지만 간단히 GPIO토글 속도로 성능 테스트를 진행 해 보았다.



MSP432의 CPU성능 테스트를 위해 TI에서 제공하는 기본 MSP432 GPIO 토글 예제를 구동해 보았다.


MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);


GPIO토글 속도는 16khz로 측정 된다.

너무 느리다.

MSP432 클럭 설정을 좀 들여다 볼 필요가 있을것 같다.



MSP432는 10kHz ~ 48Mhz로 구동 가능하고 2개의 외부 클럭과, 5개의 내부 클럭 소스로 구성된다.



MSP432의 클럭 소스

LFXTCLK 외부 클럭 Low-frequency oscillator (LFXT)에서 32768Hz 등을 이용 가능 (32kHz 이하 주파수)

VLOCLK 내부 클럭 : 10KHz 정도의 VLO (Very low power low frequency oscillator) 시계

REFOCLK 내부 클럭 : 32k 또는 128KHz의 REFO (low-power low-frequency oscillator) 시계

DCOCLK 내부 클럭 : DCO (digitally controlled oscillator) 클럭 주파수 선택 가능

MODCLK 내부 클럭 : 24MHz의 low-power oscillator

HFXTCLK 외부 클럭 : 고속 클럭 HFXT (High-frequency oscillator) 1MHz ~ 48MHz 범위

SYSOSC 내부 클럭 : 5MHz






물론 클럭 별로 파워 선택이 필요하고 제약사항도 따른다. 최대한의 저전력 구동을 위해 이런 구조가 된것 같지만 개발자는 신경 써야 할 부분이 많아 져서 부담으로 다가올것 같다.







우선 클럭 속도를 좀더 올리기 위해 코드 수정이 필요한데

system_msp432p401r.c

파일에서 설정 가능하다.


48Mhz로 설정해서 구동해 보자.

//  CPU Frequency

//     <1500000> 1.5 MHz

//     <3000000> 3 MHz

//     <12000000> 12 MHz

//     <24000000> 24 MHz

//     <48000000> 48 MHz


//#define  __SYSTEM_CLOCK    1500000


#define  __SYSTEM_CLOCK    48000000



48Mhz 설정하고 GPIO 토글 속도를 측정해 보면

1Mhz

로 측정된다.


   127                  MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);

   \                     ??main_1: (+1)

   \   00000014   0x2140             MOVS     R1,#+64

   \   00000016   0x2007             MOVS     R0,#+7

   \   00000018   0x.... 0x....      BL       GPIO_toggleOutputOnPin

   \   0000001C   0xE7FA             B.N      ??main_1

   \   0000001E   0xBF00             Nop      

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864




TI제공 함수를 이용하지 않고 레제스터 직접 제어 해 보았다.

2Mhz

로 측정된다.

다른 회사의 Cortex-M4 코어에 있는 GPIO토글 레지스터가 있으면 좋을것 같은데... 

#define OFS_LIB_PAOUT   ((uint32_t)&P1->OUT - (uint32_t)P1)

#define PORT7           ((uint32_t)P7 + OFS_LIB_PAOUT)  



       98                  HWREG16(PORT7) ^= GPIO_PIN6;


   \                     ??main_1: (+1)

   \   00000016   0x8801             LDRH     R1,[R0, #+0]

   \   00000018   0xF081 0x0140      EOR      R1,R1,#0x40

   \   0000001C   0x8001             STRH     R1,[R0, #+0]

   \   0000001E   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864

   \   00000024   0x40004C62         DC32     0x40004c62



토글 하지 않고 직접 On/Off를 반복해서 측정 해 보니 

12Mhz로 측정이 된다.


와 비교해 보면 비슷한것 같은데... 저전력 기능을 감안하면 성능면에서는 나쁘지 않은것 같다.


Posted by nexp

댓글을 달아 주세요

[ATMEL]/SAMD212016. 2. 7. 22:30

[SAMD21 EVM] CPU 클럭 설정 및 성능 측정 실험

[SAMD21 EVM] CPU 클럭 설정 및 성능 측정 실험





SAMD 시리즈는 Cortex-M0 코어의 48Mhz 로 동작하고 여러 다양한 기술로 페리의 병목현상을 줄여 성능 향상을 했다고 한다. 일단 GPIO 제어로 간단히 속도 테스트를 해보도록 하자.


우선 아래 코드와 같이 ATMEL에서 제공하는 코드를 이용하여 GPIO 토글 속도 테스를 해 보았다.


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

         port_pin_toggle_output_level(PIN_PB30);

}

}



GPIO토글 속도600khz로 출력된다.

느리다. 아무래도 클럭 설정에 문제가 있는것 같다.


conf_clocks.h 파일에 클럭 설정하는 부분이 있다.

디폴트로 8Mhz로 설정되어 있다. PLL을 이용해서 48Mhz까지 동작 시킬 수 있다.


1)48Mhz로 동작시키면 WAIT 값을 높여 주어야 한다.

/* System clock bus configuration */

#  define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT     false

//#  define CONF_CLOCK_FLASH_WAIT_STATES            0

#  define CONF_CLOCK_FLASH_WAIT_STATES            2




2)DFLL 설정을 enable 한다.

/* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */

//#  define CONF_CLOCK_DFLL_ENABLE                  false

#  define CONF_CLOCK_DFLL_ENABLE                  true




3)MAIN CLK를 DFLL로 설정해 준다.

/* Configure GCLK generator 0 (Main Clock) */

#  define CONF_CLOCK_GCLK_0_ENABLE                true

#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        true

//#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M

#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DFLL



이렇게 설정하니 1.8Mhz로 동작 한다.

ATMEL에서 제공하는 코드라 아무래도 함수로 접근해서 느려지는것 같다.



코드 수정해서 레지스터 직접제어로 테스트 해 보았다.  


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

          //Led1Toggle(); 

          PORT->Group[1].OUTTGL.reg = BIT30; ;

}

}


레지스터 직접 제어로 변경하니 4Mhz로 출력된다.


다른 MCU들의 성능 측정 결과비교하면 만족할 만한 수준은 아닌것은데... 다양한 페리로 실험해 보면서 성능 테스를 해 볼 필요가 있을것 같다.






Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2015. 8. 9. 23:00

LPC1313 성능 테스트

LPC1313 성능 테스트



LPC1313은 Cortex-M3코어에 72Mhz로 동작한다. 가격은 1$ 정도로 저렴해서 가격이 민감한 어플리케이션에 좋을것 같다.


LPC1114 의 GPIO 제어 속도와  비교해교 해면 좋을것 같다.

결론적으로는 3Mhz -> 4.5Mhz 로 좋아진것 같다. GPIO On/Off만 했을때 16Mhz로 측정된다.






디폴트로 외부 12Mhz 클럭으로 설정되어 있기 때문에 PLL을 이용하여 72Mhz로 설정해 주었다.

#define CLOCK_SETUP           1

#define SYSCLK_SETUP          1

#define SYSOSC_SETUP          1

#define SYSOSCCTRL_Val        0x00000000

#define WDTOSC_SETUP          0

#define WDTOSCCTRL_Val        0x000000A0


//내부 OSC 사용

#define SYSPLLCLKSEL_Val      0x00000000

#define SYSPLL_SETUP          1

#define SYSPLLCTRL_Val        0x00000025


//메인 클럭으로 PLL 사용

#define MAINCLKSEL_Val        0x00000003


#define USBCLK_SETUP          0

#define USBPLL_SETUP          0

#define USBPLLCLKSEL_Val      0x00000001

#define USBPLLCTRL_Val        0x00000003

#define SYSAHBCLKDIV_Val      0x00000001

#define AHBCLKCTRL_Val        0x0001005F



LPC1313 의 시스템 클럭 블록도






단순 토글 만 했을 경우 4.5Mhz 로 측정된다.

     26              while(1)

     27              {

     28                  LPC_GPIO3->DATA ^= LED1_BIT;

   \   00000024   0x6801             LDR      R1,[R0, #+0]

   \   00000026   0xF081 0x0110      EOR      R1,R1,#0x10

   \   0000002A   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   0000002C   0x40048080         DC32     0x40048080

   \   00000030   0x50038000         DC32     0x50038000

   \   00000034   0x50033FFC         DC32     0x50033ffc




아쉬운점은 LPC 1xxxx 시리즈는 Set, Clear, Toggle 레지스터가 없다. 그래서 위애서 처럼 비트 제어하게 되면 두번의 명령어로 처리된다.

대신 MASKED_ACCESS 레지스터를 이용하여 비트제어를 한 명령어에 실행 되도록 할 수 있다.

이렇게 하면 7.2Mhz 정도로 출력된다.



MASKED_ACCESS 레지스터를 이용해 한명령어로 비트 제어 가능하다.

       24              while(1)

     25              {

     26                  LPC_GPIO3->MASKED_ACCESS[BIT4] = BIT4;     

   \                     ??main_0: (+1)

   \   0000003E   0x2110             MOVS     R1,#+16

   \   00000040   0x6001             STR      R1,[R0, #+0]

     27                  LPC_GPIO3->MASKED_ACCESS[BIT4] = 0;

   \   00000042   0x2100             MOVS     R1,#+0

   \   00000044   0x6001             STR      R1,[R0, #+0]

   \   00000046   0xE7FA             B.N      ??main_0




GPIO On/Off 를 했을경우 8Mhz 로 측정된다. 경쟁사 Cortex-M3 코어의 STM32F103 과 속도 비교해 보면 별차이가 없는것 같다. 그리고 가격적으로는 상당히 저렴하다는 장점이 있다.

     24              while(1)

     25              {

     26                  LPC_GPIO3->DATA = BIT4;

   \                     ??main_0: (+1)

   \   0000003C   0x2010             MOVS     R0,#+16

   \   0000003E   0x6020             STR      R0,[R4, #+0]

     27                  LPC_GPIO3->DATA = 0;

   \   00000040   0x2000             MOVS     R0,#+0

   \   00000042   0x6020             STR      R0,[R4, #+0]

   \   00000044   0xE7FA             B.N      ??main_0




GPIO On/Off 후 Main으로 복귀하는 명령어 때문에 실제 속도와는 차이가 있는데 On/Off 를 많이 반복해 보면 평균 속도가 나오는데...

이때 17.8Mhz 로 측정된다. 경쟁사 Cortex-M3 코어의 STM32F103 과 속도 비교해 보면 별차이가 없는것 같다. 그리고 가격적으로는 상당히 저렴하다는 장점이 있다.


     26              while(1)

     27              {

     29                  

     30                  LPC_GPIO3->DATA = 0;

   \   00000024   0x2100             MOVS     R1,#+0

   \   00000026   0x6001             STR      R1,[R0, #+0]

     31                  LPC_GPIO3->DATA = LED1_BIT;

   \   00000028   0x2110             MOVS     R1,#+16

   \   0000002A   0x6001             STR      R1,[R0, #+0]

     32                  

     33                  LPC_GPIO3->DATA = 0;

   \   0000002C   0x2100             MOVS     R1,#+0

   \   0000002E   0x6001             STR      R1,[R0, #+0]

     34                  LPC_GPIO3->DATA = LED1_BIT;

   \   00000030   0x2110             MOVS     R1,#+16

   \   00000032   0x6001             STR      R1,[R0, #+0]

   








Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014. 7. 20. 22:00

TM4C123 - MCU 성능측정

TM4C123 - MCU 성능측정



TM4C123은 Cortex-M4코어에 80Mhz로 동작한다. M4코어이고 페리가 막강하기 때문에 단순 비교하기는 좀 한계가 있긴하지만 일단 GPIO토글 속도로 성능 측정을 해 보았다.


TI에서 제공하는 함수를 이용하니 2.2Mhz 의 속도가 나온다.

너무 느리다 옵티마이즈 해도 동일하다.

#define Led1Off() GPIOPinWrite(GPIO_PORTB_BASE, LED1_BIT, LED1_BIT);

#define Led1On() GPIOPinWrite(GPIO_PORTB_BASE, LED1_BIT, 0);



     12              while(1)

     13              {

     14                  Led1On();

   \   00000044   0x2200             MOVS     R2,#+0

   \   00000046   0x2104             MOVS     R1,#+4

   \   00000048   0x4628             MOV      R0,R5

   \   0000004A   0x.... 0x....      BL       GPIOPinWrite

     15                  Led1Off();

   \   0000004E   0x2204             MOVS     R2,#+4

   \   00000050   0x2104             MOVS     R1,#+4

   \   00000052   0xE7F4             B.N      ??main_1

   \                     ??main_0:

   \   00000054   0x01000020         DC32     0x1000020

   \   00000058   0xF0000801         DC32     0xf0000801

   \   0000005C   0x40005000         DC32     0x40005000

     16              }




레지스터를 직접 제어해서 GPIO를 On/Off 해보니 10Mhz 로 빨라졌다.

     13              while(1)

     14              {

     17                  HWREG(PORTB + (GPIO_O_DATA + (BIT2 << 2))) = 0;

   \                     ??main_1: (+1)

   \   00000046   0x2100             MOVS     R1,#+0

   \   00000048   0x6001             STR      R1,[R0, #+0]

     18                  HWREG(PORTB + (GPIO_O_DATA + (BIT2 << 2))) = BIT2;

   \   0000004A   0x2104             MOVS     R1,#+4

   \   0000004C   0x6001             STR      R1,[R0, #+0]

   \   0000004E   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   00000050   0x01000020         DC32     0x1000020

   \   00000054   0xF0000801         DC32     0xf0000801

   \   00000058   0x40005000         DC32     0x40005000

   \   0000005C   0x40005010         DC32     0x40005010

     19              }




하지만 80Mhz로 구동하는데... 속도가 너무 느리다. 

릴리즈 모드로 변경하니 코드사이즈가 줄어든다.

     37              while(1)

     38              {

     39                  //Led1On();

     40                  //Led1Off();

     41                  PB2 = 0;

   \                     ??main_0: (+1)

   \   00000052   0x600A             STR      R2,[R1, #+0]

     42                  PB2 = 1;

   \   00000054   0x6008             STR      R0,[R1, #+0]

   \   00000056   0xE7FC             B        ??main_0

     43              }



GPIO 세트, 클리어, 토글 레지스터가 없다.

물론 GPIO 비트제어는 GPIO데이터 레지스터에서 2비트 시프트된 주세에 맵핑되어 있으므로 소프트웨어 적으로 처리하면 한 명령 사이클 내에 제어 가능하다.





Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 6. 22:00

M052LBN EVM - NUVOTON MCU성능 측정

M052LBN EVM - NUVOTON MCU성능 측정



NUVOTON사의 저렴한 MCU M052LBN 는 최대 클럭 50Mhz로 동작한다. GPIO토글을 이용하여 MCU성능 측정을 해 보았다.



3.2Mhz

#define Led1Toggle() P26 ^= 1


     15              while(1)

     16              {

     17                  Led1Toggle();

   \                     ??main_1: (+1)

   \   00000026   0x6821             LDR      R1,[R4, #+0]

   \   00000028   0x4041             EORS     R1,R1,R0

   \   0000002A   0x6021             STR      R1,[R4, #+0]

   \   0000002C   0xE7FB             B        ??main_1

   \   0000002E   0xBF00             Nop      

   \                     ??main_0:

   \   00000030   0x50004080         DC32     0x50004080

   \   00000034   0x50004258         DC32     0x50004258

     19              }




GPIO On/Off 시 7.2Mhz까지 출력 되는것이 확인된다.

#define Led1Off() P26 = 1

#define Led1On() P26 = 0


     15              while(1)

     16              {

     17                  Led1On();

   \                     ??main_1: (+1)

   \   00000026   0x6025             STR      R5,[R4, #+0]

     18                  Led1Off();

   \   00000028   0x6020             STR      R0,[R4, #+0]

   \   0000002A   0xE7FC             B        ??main_1

   \                     ??main_0:

   \   0000002C   0x50004080         DC32     0x50004080

   \   00000030   0x50004258         DC32     0x50004258

     21              }


1$ 이하 MCU에서 이정도 성는이면 포트도 여유롭고 나쁘지 않다.

 

Posted by nexp

댓글을 달아 주세요