본문 바로가기

[Microchip]/dsPIC33-SM

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 나온다.
반응형