2009-10-26 2 views
10

HiTech PICC32를 사용하여 PIC32MX 용 펌웨어를 작성하고 있습니다. 내가 피하고 싶은 문제 중 하나는 핀의 대부분이 여러 개의 이름을 가지고 있기 때문에 (예 : AN0 = RB0 ​​= CN2 = PGED1) AN0이 이미 사용되었다는 것을 깨닫지 못하고 나 또는 다른 누군가가 우연히 RB0을 사용할 수 있다는 것입니다. (아날로그/디지털 핀을 잘못 구성하면 전류가 과도하게 방출되고 필수 연기가 방출 될 수 있기 때문에 실제로 이것은 치명적일 수 있습니다.)I/O 핀 사용을 나타내는 매크로

모든 핀을 포괄적으로 문서화 할뿐만 아니라 빠른 방법이 있는지 궁금합니다. 코딩 수준에서이 문제를 해결할 수 있습니다. 사람 (주로 나 자신)이 사용할 수있는 매크로, 예를 들어 CLAIM_PIN(58)을 두 번 실행하면 경고 또는 오류가 발생합니다.

(나는 가능한 한 해결책이 너무 끔찍하거나 유지하기 어렵다면 나는 그것을 잊어 버리고 눈물을 흘리거나 불에 자신을 두는 평판을 얻는다. 또한 macro producing macros에 대한이 질문을 보았습니다.)

코드는 여러 컴파일 단위로 작성되었습니다 (적어도 이것이 구문이 의미하는 것임을 알았습니다). SPI의 경우와 마찬가지로 A2D 코드 용 .h/.c 파일도 있고 특정 I/O 포트를 사용하는 다양한 주변 장치 용 유사 파일도 있습니다. 공간이 이 아니고 실제로인데, 제 코드는 PIC32MX에 많은 공간을 남겨 둡니다. 또한 다른 __DEBUG 플래그를 사용하여 최종 사용을 위해 핀 검사 코드를 제거 할 수 있습니다.

+0

답변 없음, 그러나 좋은 질문입니다. (마이크로 칩 사람들이 엉덩이를 벗고 C++을 지원한다면 더 쉬울 수도 있습니다.) –

+0

글쎄, 그들은 어쨌든 리눅스 컴파일러를 가지고 있지 않기 때문에 HiTech (나는 어쨌든 그들의 매크로를 선호한다)이다. – detly

답변

6

좋아, 여기. 런타임 비용 없음. 두 번 실행하면

#define CLAIM(n) struct busy##n {} 

CLAIM(58); 
CLAIM(58); 

이 밖으로 오류가 발생하지 : 우리가 충돌을 감지하기 위해 링커를 사용하는 것 때문에 #if DEBUG에서 매크로를 포장 할 것이다

z.c:4: error: redefinition of ‘struct busy58’ 

여러 컴파일 단위의 체크를 확장하려면 따라서 런타임 풋 프린트가 생길 것이다. 두 개의 코드가 핀 항하려고하면

#define CLAIM(n) char busy##n = 1; 
#define CLAIM(n) void busy##n() {} // bdonlan 
+4

그러나 동일한 번역 단위에있는 경우에만 오류가 발생합니다. – bdonlan

8
#define CLAIM_PIN(n) char claimed_pin_##n; 

이제 심볼은 이중 정의되고 컴파일러 또는 링커 중 오류가 발생한다.

편집 : 의견을 바탕으로,이 끌 수 더 나은 :

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {} 
+2

이것은 핀 당 1 바이트를 사용합니다. 이것이 문제라면, OP는 이러한 정의를 자신의 섹션에 넣고 최종 이미지에서 드롭하기 위해 링커 옵션을 조사하려고 할 수 있습니다. – bdonlan

+0

1 바이트가 중요한 아키텍처를 사용하여 오랜 시간이 걸렸습니다. 그런 생각조차하지 못했습니다. –

+2

하지만 오류는 아닙니다. 여러 컴파일 단위로조차도 완벽하게 합법적입니다. – DigitalRoss

2

당신은 런타임 오버 헤드를 감당할 수있는하거나 그냥 디버깅을위한 경우, 난 그냥 IOPinOpen() 기능 같은 것을 만들고 싶은 경우 매크로 속임수를 다루는 대신 사용중인 핀을 추적했습니다.

반면에 Mark Ransom's updated answer은 +1의 가치가있었습니다.