我希望有人可能對如何控制/指定宏擴展的順序有一個想法。這裏是上下文:有沒有辦法控制宏擴展命令
// 32 bit increments, processor has registers for set, clear and invert
#define CLR_OFF 1
#define SET_OFF 2
#define INV_OFF 3
#define SET(reg,bits) *((volatile unsigned long*)(& reg+SET_OFF)) = bits
//Now if I use this I can do it quite nicely with
#define STATUS_LED 0x0040;
SET(LATB, STATUS_LED); // LATB is port of the LED.
其實我已經不得不四處相當多的移動硬件爲晚,所以我決定把與STATUS_LED像這樣的LATB信息...
#define STATUS_LED_PORT LATB
#define STATUS_LED_MASK 0x0040;
#define STATUS_LED STATUS_LED_PORT, STATUS_LED_MASK
//And I try to use it via
SET(STATUS_LED);
但是,唉,LATB,0x0040被傳遞給SET宏的參數1。當不作爲宏觀這種方法正常工作:
inline void SET(u32_t *reg, u32_t bits) { ((volatile u32_t *) (((u32_t)reg) + SET_OFF*4)) = bits; }
//Change the STATUS_LED macro to
#define STATUS_LED &STATUS_LED_PORT, STATUS_LED_MASK
SET(STATUS_LED); //Works great!
但不幸的是我的編譯器不看到需要內聯函數,並導致6個指令設置寄存器,而不是4,所以同時使用位 - 它是不可預知的。
我希望有人可能知道的方式來擴大STATUS_LED宏觀第一,是這樣的: SET(##STATUS_LED)
目前我的解決辦法繼續前進是有兩個宏SET和SETRM(寄存器的設定,面罩)但我覺得應該有一個解決方案,因爲設置的代碼看起來像......
#define SETRM(reg,bits) ...
#define SET(args) SETRM(args) //WHY WOULD THIS GET EXPANDED HERE??
最後,我的處理器的編譯器不支持正參數宏,我想我可能能夠發揮與那,但唉:(。
非常感謝您的時間,我會很感激任何想法,我可以繼續前進,但如果我可以在任何地方都使用SET,它會更加清潔。