arm復位啟動先執行彙編指令,完成硬體的初始化(為什麼不用c語言?因為c語言無法訪問arm內部的暫存器,例如棧,所以需要彙編來進行初始化)
c語言能不能跟彙編相互並且反覆呼叫?
不能,因為這樣容易導致區域性變數的混用。
彙編呼叫c程式
.global _start
_start:
@將gpj2_3 --->output
ldr r0, =0xe0200280 //r0=0xe0200280
ldr r1, [r0] //r1=0xe0200280位址下的內容
bic r1,r1,#(0xf<<12) //r1 &= ~(0xf<<12)
orr r1, r1, #(1<<12) //r1 |= (1<<12)
str r1,[r0] //將r1 儲存到 0xe0200280
loop:
@將gpj2_3 output 0,led4-->on
ldr r0, =0xe0200284 //r0=0xe0200284
ldr r1, [r0] //r1=0xe0200284位址下的內容
bic r1,r1,#(1<<3) //r1 &= ~(1<<3)
str r1,[r0] //將r1 儲存到 0xe0200284
movr0, #0x300000 //r0作為引數,傳遞給delay()
bl delay //bl -- 在跳轉之前,儲存了返回位址-->r14
@將gpj2_3 output 1,led4-->off
ldr r0, =0xe0200284 //r0=0xe0200284
ldr r1, [r0] //r1=0xe0200284位址下的內容
orr r1, r1, #(1<<3) //r1 |= (1<<3)
str r1,[r0] //將r1 儲存到 0xe0200284
movr0, #0x300000 //r0作為引數,傳遞給delay()
bl delay
b loop //while(1) b--branch
c
void delay(int
time) //time
<---r0
這裡傳參按照atpcs,r0~r3給予相應的值那麼就作為相應的子程式的傳參,需要幾個就設定幾個,多了的話就需要壓棧,如果引數是8個的話引數1~引數4還是通過r0~r3進行傳遞,而引數5~引數8則是通過壓入堆疊的方式進行傳遞,注意這四個入棧引數的入棧順序,是以引數8->引數7->引數6->引數5的順序入棧的。
編譯器的優化和volatile
gcc有幾個優化等級:
o0,o1,o2,o3
-o0表示沒有優化,-o1為預設值,-o3優化級別最高。
通過優化之後可以通過 size filename.c指令看出相關的文字大小的變化,但是優化不一定是往好的方向發展,如果我們寫了延時是用
for(i=0;i
<100;i++)
這樣實現的話那麼編譯器就會幫我們優化刪除**,因為編譯器認為這是無意義的操作,那麼避免被優化,上面的例子,初始化i語言變為
volatile
int i;
volatile用來修飾乙個「易變的」變數,每次使用這個變數的時候都重新從記憶體中讀取它的值,防止被編譯器優化。
voltale的應用場合:
**1)中斷服務程式和應用程式之間共享的全域性變數
2)兩個執行緒之間共享的全域性變數
3)定義硬體暫存器的記憶體**
c呼叫彙編
c**
#define rgpj2con (*( volatile unsigned int *)
0xe0200280)
#define rgpj2dat (*( volatile unsigned int *)
0xe0200284)
//gpj2_3 ----> led4
extern void delay(int dat);
void _start(void) //相當於main()
}
彙編**
.global delay
delay:
subr0,r0,#1 // r2=r2-1
teq r0, #0 //compare if(r2 == 0)
bne delay //b--branch,ne -- not equal
bx lr // r15=r14, delay返回
arm-linux-gcc支援c內嵌彙編。 ARM彙編與C混合程式設計
內聯彙編即在c中直接使用彙編語句進行程式設計,使程式可以在c程式中實現c語言不能完成的一些工作,例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編 程式中使用飽和算術運算 saturating arithmetic 程式需要對協處理器進行操作 在c程式中完成對程式狀態暫存器的操作 asm volat...
ARM彙編 C語言 混合程式設計
主函式main 第一次實驗 12月4 這是我見過最坑爹的問題 main這個字段不能使用。在release模式下怎麼編譯都過不去,報錯如下 原因 不能使用main這個識別符號。用main main main1 mai都行,就是main不行。原來在debugrel模式下,使用main僅僅是乙個警告,沒想...
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...