dsPIC33 속도 테스트 - LED 토글 테스트
LED토글링으로 dsPIC33 속도 측정을 했다.
여러가지 테스트를 해서 결론적으로 LED 속도는 56ns/6.6Mhz 이 출력된다.
[다른 MCU속도 측정 결과] 에 비교하면 상당히 빠르다..
dsPIC33 속도 테스트를 위해 아래와 같이 LED토글 하는 코드를 작성했다.
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를 포인터로 접근하는것에 문제가 있는것 같다. 똑똑하지 않는 컴파일러인건지.. 옵티마이즈가 안되는건지?
아무튼 이제 정상적으로 동작하는것 같다.
코드 수정후에 LED 속도는 56ns/6.6Mhz 나온다.
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();
}
#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
#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 나온다.
반응형