[Microchip]/dsPIC33-SM2009. 4. 25. 01:00

dsPIC (Microchip MPLAB C30) 에서 printf 사용 하기

dsPIC (Microchip MPLAB C30) 에서 printf 사용 하기
엔지니어에게 있어서 가장 강력한 디버깅 무기라는 printf를 임베디드에서 사용하기란 쉽지 않다. 특히 컴파일러마다 버젼마다 옵션이 달라서 고생을 많이 하는데... Microchip사의 MPLAB C30의 경우 write()함수를 오버라이딩 하면 된다고 한다.
 
#include <stdio.h> 추가하고 아래 write()함수를 추가해 주면 된다.
 
int write(int handle, void *buffer, unsigned int len)
{
 int i;
 for (i = len; i; --i)
 {
  char c = *(char*)buffer++;
  
  U1TXREG = c;
  while(!U1STAbits.TRMT);
 }
 return(len);
}
 
그리고 PIC은 Heap영역을 따로 할당해 주어야 한다.
MPLAB Project Builder Option에서 힙영역을 할당해 주면 된다.
 
 
물론 printf를 사용하면 20%정도 오버헤드가 걸린다.
 
printf 사용하지 않았을 경우
section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.reset                           0                 0x4             0x6  (6)
.ivt                           0x4                0xfc           0x17a  (378)
.aivt                        0x104                0xfc           0x17a  (378)
.text                        0x200               0x2cc           0x432  (1074)
.const                       0x4cc                0x32            0x4b  (75)
.dinit                       0x4fe                 0x8             0xc  (12)
.isr                         0x506                 0x2             0x3  (3)
__FOSCSEL                 0xf80006                 0x2             0x3  (3)
__FOSC                    0xf80008                 0x2             0x3  (3)
__FWDT                    0xf8000a                 0x2             0x3  (3)
                     Total program memory used (bytes):          0x78f  (1935) 5%
                        Total data memory used (bytes):            0x2  (2) <1%
 
 
printf 사용했을경우
section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.reset                           0                 0x4             0x6  (6)
.ivt                           0x4                0xfc           0x17a  (378)
.aivt                        0x104                0xfc           0x17a  (378)
.text                        0x200              0x116a          0x1a1f  (6687)
.const                      0x136a                0x3c            0x5a  (90)
.dinit                      0x13a6                0xbc           0x11a  (282)
.isr                        0x1462                 0x2             0x3  (3)
__FOSCSEL                 0xf80006                 0x2             0x3  (3)
__FOSC                    0xf80008                 0x2             0x3  (3)
__FWDT                    0xf8000a                 0x2             0x3  (3)
                     Total program memory used (bytes):         0x1e99  (7833) 23%
                        Total data memory used (bytes):           0xd0  (208) 10%

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2008. 7. 12. 23:48

[dsPIC33F4x EVM] 관련자료 - 정리중

[dsPIC33F4x EVM] 관련자료

사용자 삽입 이미지


dsPIC33F - QFN44 타입용 소형 보드를 제작 했다. 기본 기능만 두고 모든 포트를 빼서 간단한 태스트 용으로 사용할 수 있도록 했고 생각보다 깜찍하게 나왔다.



기존의 STM32-48 Application Board에 연결해서 테스트 할 수 있도록 기본 포트 배열을 맞추어 확장보드에서 쉽게 테스트 해 볼 수 있도록 했다.




회로도









예제 소스:




테스트 동영상



수정사항
급하게 하느라 PGD, PGC선 두개를 빼먹었다. 뒷면에 점퍼 날려야 할듯.... 윽




Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2008. 7. 10. 23:19

[dsPIC33F-QFN44 EVM] 보드 조립 - dsPIC33FJ32MC204

[dsPIC33F-QFN44 EVM] 보드 조립 - dsPIC33FJ32MC204

사용자 삽입 이미지


dsPIC33F - QFN44 타입용(dsPIC33FJ32MC204m dsPIC33FJ32MC304) 소형 보드를 제작 했다.





여러 Application Board에 연결하여 테스트 가능하도록 했다.



기존의 STM32-48 Application Board에 연결해서 테스트 할 수 있도록 기본 포트 배열을 맞추어 확장보드에서 쉽게 테스트 해 볼 수 있도록 했다.



테스트 동영상( dspic led test )
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

댓글을 달아 주세요