2013-07-08 126 views
2

線137 hal.c你會看到它的作用:如何使用變量但從未在C中定義變量?

SPDR = data; 
的hal_spi_write()函數中

SPDR定義在哪裏?

我已經下載了整個source code並完成了「SPDR」的搜索,但沒有運氣。

希望瞭解的專家之一,從社區請權衡。

+8

您是否搜索.h文件? –

+4

提示:它可能是'#define SPDR(*(volatile uint8_t *)0x000f3c00)'...... – 2013-07-08 21:58:25

+0

它使用隱式的'int'嗎? –

回答

7

SPDR不完全是一個變量 - 它是一個硬件寄存器。具體來說,它是Atmel AVR處理器上的SPI數據寄存器:

19.5.3。 SPDR - SPI數據寄存器

Bit    7  6  5  4  3  2  1  0 
    0x2E (0x4E) | MSB |  |  |  |  |  |  | LSB | SPDR 
    Read/write  R/W R/W R/W R/W R/W R/W R/W R/W 
    Initial value X  X  X  X  X  X  X  X  undefined 

SPI數據寄存器爲讀/寫寄存器,用來在寄存器文件和SPI移位寄存器之間的數據傳送的讀出。寫入寄存器啓動數據傳輸。讀寄存器會導致移位寄存器接收緩衝區被讀取。

欲瞭解更多信息,請參閱您所使用的CPU的數據表。例如,上面的代碼片段來自ATmega48/88/168 datasheet(第170頁)。

+1

但是這個寄存器名稱是由編譯器隱式聲明的嗎? –

+0

@DrewMcGowen:它在特定於所用零件的系統頭文件中定義。 (例如,它在ATmega168的''中定義爲'_SFR_IO8(0x2E)'。) – duskwuff

+0

嗯,有OP的答案;) –

0

這可能是包含在一個頭文件中的某個地方。在更高級的場景中,您會看到由鏈接器和加載器提供的變量。

畢竟,一切都只是對象文件的符號。只要您使用extern關鍵字告訴編譯器關於它的信息,您可以參考使用nm(1)之類的工具在二進制文件中找到的大多數變量。

+2

最糟糕的是在make文件中定義並在命令行中傳遞的符號。 –

+0

Jeez。我忘了那些。 :) – sholsapp