2009-10-26 12 views
10

HiTech PICC32 kullanarak PIC32MX için ürün yazılımı yazıyorum. Kaçınmak istediğim problemlerden biri, pinlerin çoğunun birden fazla isme sahip olması (örn. AN0 = RB0 ​​= CN2 = PGED1) olduğu için, ben veya başkası, AN0'ın zaten kullanıldığını fark etmeden RB0'ı kullanabilir. (Bu aslında felaket olabilir, çünkü bir analog/dijital pini yanlış yapılandırmak aşırı akım çekilmesine ve temel dumanın çıkmasına yol açabilir.)Kullanılan I/O pinlerini gösteren makro

Kullanılan her iğnenin kapsamlı bir şekilde belgelenmesinin yanı sıra, hızlı bir yolun olup olmadığını merak ediyorum. Bu sorunu kodlama düzeyinde ele almak. İnsanların (esas olarak kendim) kullanabileceği bir makro isterim, yani CLAIM_PIN(58) diyelim, eğer iki kez çalıştırılırsa bir uyarı veya hata verir.

(Bu, tek bir çözümün dehşet verici ya da sürdürülemez olması durumunda bunu unutmak istemiyorum ve sadece gözyaşlarına boğulmak ya da kendimi ateşe ya da başka bir şeye karşı koymak için bir itibar geliştirmek istiyorum). Ayrıca, bu soruya işaret eden macro producing macros ile ilgili bu soruyu da gördük.)

Açıklığa kavuşturmalıyım: kod, birden çok derleme biriminde yazılmıştır (en azından, bu ifadenin ne anlama geldiğini düşünüyorum). A2D koduma benzer bir .h/.c dosyası, benzer şekilde SPI için ve benzer şekilde belirli I/O bağlantı noktalarını kullanan çeşitli çevre birimleri için. Alan gerçekten bir sorun değil, kodum PIC32MX üzerinde bol miktarda yer bırakır; Ayrıca son kullanım için pin kontrol kodunu kaldırmak için başka bir __DEBUG bayrağı kullanabilirim.

+0

yanıt yok, ama iyi bir soru. (Microchip milletinin izmaritlerini çıkarması ve C++ desteklemesi daha kolay olabilir.) –

+0

Yine de Linux derleyicileri yok, bu yüzden benim için HiTech (yine de makrolarını tercih ediyorum). – detly

cevap

6

Tamam, işte burada. Çalışma zamanı maliyeti yok. İki kez çalıştırırsanız

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

CLAIM(58); 
CLAIM(58); 

dışarı hata olacaktır: Eğer biz çatışması algılamak için bağlayıcı kullanılarak olurdu çünkü #if DEBUG yılında makro sarmak isteyecek

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

birden derleme birimlerine onay uzatmak için ve böylece bir çalışma zamanı ayak izi olurdu. kod iki adet bir iğne İstem çalışırken

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

Ancak, bu yalnızca aynı çeviri birimindeyse hata veriyor. – bdonlan

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

Şimdi, sembol iki kat tanımlanacak ve derleyici veya bağlayıcı ya da bir hata ile sonuçlanır.

Düzenleme: açıklamalara dayanarak, bu hal alabileceğini iyi:

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

Bu, pim başına bir bayt kullanır. Bu bir problemse, OP bu tanımları kendi bölümlerine yerleştirmek için linker seçeneklerine bakmak isteyebilir ve bunları son görüntüden çıkartabilir. – bdonlan

+0

Bir baytın önem verdiği bir mimariyi kullandığımdan beri çok uzun zaman oldu, bunu düşünmemiştim bile. –

+2

Ancak hata yapmıyor. Çoklu derleme ünitelerinde bile bunu yapmak için tamamen yasal C. – DigitalRoss

2

Eğer çalışma zamanı yükü gelemez ya da bu sadece hata ayıklama için ise, sadece bir IOPinOpen() fonksiyonu gibi bir şey yaratmak istiyorsanız Makro hilesiyle uğraşmak yerine kullanılan pimleri takip etti.

Diğer taraftan, Mark Ransom's updated answer değeri +1 değerinde idi.