經常見到嵌入式設計中,將某一程式段的入口位址轉換為乙個函式,我們來分析一下它的成分:
如在bootloader的0x00000020位址上的雙字單元中有這樣一條語句:
@address is 0x00000020
b powerdown @jump to the flag "powerdown"
......
powerdown:
......
然後在某一c標頭檔案中可以見到這樣的巨集宣告:
#define enterpwdn(clkcon) ((void (*)(int))0x20)(clkcon)
初一看,亂七八糟的,現在,我們來整理一下。
不難看出,當我們程式設計呼叫enterpwdn(clkcon)函式的時候,編譯器在編譯前首先把enterpwdn(clkcon)轉換為
((void (*)(int))0x20)(clkcon)語句。
對於這個語句,我們將之分解成3部分來看。
1:(void (*)(int)
2:0x20
3:(clkcon)
(clkcon)是函式的引數,就不用說了。0x20呢?當然就是要轉換的函式的入口位址了。那對於(void (*)(int)呢??呵呵……,這一部分作為乙個整體,描述了轉換後的函式的型別,即無返回值,帶乙個整形引數。而中間那個」(*)「,就表示要轉換成乙個函式(或者說把0x20轉換為乙個位址,因為在arm彙編中,就把c語言的函式名當作乙個位址標號看待了)。就像我們平常用的強制型別轉換一樣,(int)temp,只不過這裡是將乙個數轉換為另一型別,而那是將乙個位址轉換為乙個函式罷了。
至於編譯器內部是如何實現這個轉換的,這就要看編譯器對函式的實現機制了。我也不懂了。
純屬個人理解,如有錯誤,或者您對這個轉換機制有更深的理解,請不吝賜教!
嵌入式位址雜談
最近對嵌入式中的位址有了更深入的認識,簡單記錄一下。以stm32f103為例,在暫存器模板中我們都知道只要對暫存器簡單地進行賦值就可以完成流水燈等操作,那麼這些暫存器是怎麼封裝的呢?首先,先通過一串的巨集定義確定了硬體的基位址,以stm32f103中的gpiob為例 在stm32f10x.h這個標頭...
非嵌入式與嵌入式的區別
非嵌入式是通過軟體控制硬體,軟硬體之間直接聯絡來實現要求。但是一旦硬體發生改變軟體也要改變,為了降低這種偶合度過高的問題,出現了嵌入式。嵌入式在軟體和硬體之間新增了作業系統,軟體通過控制作業系統進而控制硬體,硬體發生改變並不會導致軟體也發生改變,這為軟體開發人員節約了很多時間,並且嵌入式能在已有的硬...
嵌入式團隊培訓 函式
三 函式名 四 引數 五 值傳遞 址傳遞和引用傳遞 六 遞迴函式 七 總結 八 作業 數學上的函式 z f x,y 因變數 函式名 自變數,自變數 計算機的函式 返回值 函式名 引數,引數 函式指標 void f int x,int y int f int x,int y int f int x,i...