2010-10-27 52 views
0

我正在研究嵌入式代碼,並嘗試將大量內存映射寄存器分配轉換爲get()/ set()函數調用。我想知道是否可以維護整個代碼中分配的地址分配,但更改#define以使它們將作業作爲函數參數進行分配。可能通過C宏將地址分配轉換爲函數參數?

老方法:

#define MOTOR_REG (*(volatile unsigned char *)(0xFEE002)); //a memory-mapped register 
MOTOR_REG = value;  //sets value into the memory-mapped register 

所需的新方式:

#define MOTOR_REG(set_motor_reg(value);) 

void set_motor_reg(unsigned char) 
{ 
    //logic to set the motor register 
} 

MOTOR_REG = value;  //value should be passed in to MOTOR_REG macro 

那麼,這種情況下可以使用C宏?謝謝你的想法!

+2

你爲什麼要這樣做?它的方式有什麼問題? – 2010-10-27 22:44:23

+1

@Adam Rosenfield - 我懷疑OP必須更新現有的代碼庫,以使用不同的代碼來設置註冊表值(可能首先添加一些驗證),並希望以最小的干預來完成。 – 2010-10-27 22:47:06

+0

@Franci Penov - 正確,我希望避免大量的Find + Replace操作,如果簡單地改變#define是可能的。 – multiproximus 2010-10-27 22:55:17

回答

2

C宏不會允許你這樣做,因爲它們只是一個高級搜索&替換由預處理器完成。然而,你可能會傳遞值作爲宏參數:

#define MOTOR_REG(value) set_motor_reg(value) 

void set_motor_reg(unsigned char) { //logic to set the motor register } 

MOTOR_REG(value); //value is passed in to MOTOR_REG macro 

在上述情況下,使用MOTOR_REG當然是不必要的,因爲你可以直接調用set_motor_reg。如果你被允許使用C++,你可以通過運算符重載實現想要的行爲。

+0

分號在宏? – Nyan 2010-10-28 00:18:54

+0

@Nyan:謝謝,修正。 – 2010-10-28 17:04:00

1

你不能完全按照你想要的宏來做。 (你可以用C++做到這一點,操作符重載,但這可能不是一種選擇)。

如果你想繼續使用它們,就好像它們是變量一樣,你爲什麼要把所有東西都轉換成函數?