我目前正在設置一個C語言框架,用於幾個微控制器之間的使用。 該框架必須攜帶所有設備特定的代碼,因此該應用程序只包含外設的抽象用法(如SerialPort_Read,Write,SetBaudRate等)在宏中的查詢表C
我一直在努力尋找解決方案在C中是I/O引腳圖。我已經看到了一些項目(比如非常流行的Arduino),其中的引腳映射被放置在運行時使用的LUT(查找表)中。但是,這個LUT在運行時永遠不會被修改,所以沒有必要在內存中使用它。 例如,該功能解決了一些比特索引和從一些「const的UINT」表寄存器,以及設置或清除位:
void pinMode(uint8_t pin, uint8_t mode)
{
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg;
if (port == NOT_A_PIN) return;
// JWS: can I let the optimizer do this?
reg = portModeRegister(port);
if (mode == INPUT) {
uint8_t oldSREG = SREG;
cli();
*reg &= ~bit;
SREG = oldSREG;
} else {
uint8_t oldSREG = SREG;
cli();
*reg |= bit;
SREG = oldSREG;
}
}
因爲這是在控制器上運行它的排水的效率及速度實際的C代碼。我寧願定義某種宏,做同樣的事情,但編制的「一個班輪」,可以更有效地編譯時已經解析:
GPIO_Write(PORTA, 5, 1); // Write '1' to pin 5 on PORTA
> LATA |= 1<<5; // Sets bit 5 high
GPIO_Tris(PORTA, 4, OUTPUT); // Set pin 4 on PORTA to output
> PORTA &= ~(1<<4); // sets pin 4 as output I/O type
有誰知道這是否可能(以及如何)定義和使用查找表與C中的宏?
此時我正在使用我認爲基於GCC的MicroChip C30編譯器。它應該可以在不同的編譯器之間移植,包括MicroChip C18,C32以及ARM和AVR。
請請勿鏈接到外部網站上的代碼。 – 2012-03-17 20:27:35
好的,謝謝,我刪除了鏈接並在此處解釋它。 – Hans 2012-03-17 20:32:47
在您的示例代碼中,您希望優化器執行什麼操作?如果端口在運行時具有不同的值,具體取決於函數的調用方式。 – blueshift 2012-03-17 20:44:18