2015-08-27 73 views
1

有人可以解釋我這個語法嗎?它來自高科技C包括文件Hitech C語法

/* STATUS bits */ 
static volatile bit IRP  @ (unsigned)&STATUS*8+7; 
static volatile bit RP1  @ (unsigned)&STATUS*8+6; 
static volatile bit RP0  @ (unsigned)&STATUS*8+5; 
static volatile bit TO @ (unsigned)&STATUS*8+4; 
static volatile bit PD @ (unsigned)&STATUS*8+3; 
static volatile bit ZERO @ (unsigned)&STATUS*8+2; 
static volatile bit DC  @ (unsigned)&STATUS*8+1; 
static volatile bit CARRY @ (unsigned)&STATUS*8+0; 
+0

我想設置在STATUS每個單一位的確切「地址」。 – LPs

+0

非標準的'@'符號通常用於在特定地址分配變量。在這種情況下,它似乎被用來命名位域的各個位。 '(unsigned)&STATUS'將給出一個指向無符號整數的指針,並且一個整數是幾個字節寬。然後出於某種原因,他們將這個地址乘以8並添加一個偏移量。 總是最好避免像這樣的非標準垃圾頭:如果可能,請推出自己的寄存器定義,最好是使用'#define'和位運算符。 – Lundin

+0

有一個關於「@」符號的答案。我沒有得到乘法。 – tcop

回答

1

我假設這些是peripherail硬件寄存器。 bit類型和@是非標準的。 @將它們放置在由STATUS給出的絕對地址處。 bit告訴編譯器,地址實際上是單個位,所以它可能必須使用適當的指令(位操作)。根據@LP的評論(以及一些想法),這看起來像PIC-MCU(你沒有說明使用的CPU)。 bit類型告訴編譯器對象的地址(ZERO等)地址單個位在「RAM」(STATUS實際上是一個CPU寄存器存儲器映射的)地址空間。位編號被壓縮成低3位(位0..7),字節地址位於高位。這個位地址的右邊:(8位/字節,因此是乘法)和位數(低3位,因此是相加的,或者可以使用位運算符(相同的結果)), :

static volatile bit IRP @ ((unsigned)&STATUS << 3) | 7; 
... 

我非常肯定,@bit的編譯器文檔中解釋

注意,比特類型實際上是違反了C標準,因爲這強制要求的最小可尋址類型爲。至少有8位的charsizeof(char) == 1

+0

Hi Tech聽起來更像Microchip的微控制器 – LPs

+1

@LPs:嗯......你可能是對的(很長一段時間沒有看過PIC SR),RAM頁面的RP位。但PIC不允許位地址內存(請閱讀我的編輯)。 – Olaf

+0

我相信這在Hi Tech C手冊中沒有解釋。我搜索了它。我沒有得到乘法+位數。你能解釋一下嗎? – tcop