裸機建立C語言環境 設定堆疊指標和清理BSS段

2021-06-20 14:27:09 字數 1484 閱讀 6350

裸機建立c語言環境-設定堆疊指標和清理bss段

分類: arm系統

2013-04-17 08:19

919人閱讀收藏 

舉報以前稍微寫過作業系統上的c程式,感受不出來:bss段,堆疊的意義。到了在微控制器上寫程式也沒有考慮這些問題。但是到了arm上環境似乎沒有那麼簡單了,c的環境要自己來建立,不然就不能用。這也深刻的感受到了c語言中原來難以理解的概念。

裸機建立c語言環境-設定堆疊指標

這個是使用c語言的首要條件,不過這個就是指定乙個sp指標就可以了,很簡單的。ldr sp, =4096。

裸機建立c語言環境-清理bss段

如果c語言中用到的全域性變數或者靜態變數,這個編譯的時候是把它們放到了bss段,這個段在記憶體中。怎麼建成的?手動寫乙個鏈結指令碼,新增__bss_start  __bss_end變數來表示bss段的開始和結束。如下:

sections

.rodata align(4) : at((loadaddr(.text)+sizeof(.text)+3)&~(0x03))  

.data align(4)   : at((loadaddr(.rodata)+sizeof(.rodata)+3)&~(0x03))

__bss_start = .;

.bss align(4)  :

__bss_end = .; }

這樣在應用程式中清理__bss_start到__bss_end之間內在中的內容。這樣全域性變數就可以用了,否則會出現異常。我遇到的具體表現為:全域性變數的值無法更改。**可以學習u-boot中彙編方法清理: /*

* these are defined in the board-specific linker script.

*/.globl _bss_start

_bss_start:

.word __bss_start

.globl _bss_end

_bss_end:

.word __bss_end

/** 清bss段

*/clear_bss:

ldr r0, _bss_start /* find start of bss segment        */

ldr r1, _bss_end /* stop here                        */

mov r2, #0x00000000 /* clear                            */

clbss_l:str r2, [r0] /* clear loop...                    */

add r0, r0, #4

cmp r0, r1

ble clbss_l

mov pc, lr

/* end_of clear_bss */

也可以用c語言來實現:

void clean_bss(void)

總結:就是往這段記憶體中寫0.目前用到只有這些,先寫這麼多。

C語言及ARM中堆疊指標SP設定的理解與總結

棧是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入 刪除操作的一端稱為棧頂。表的另一端稱為棧底。棧頂的當前位置是動態的,對棧頂當前位置的標記稱為棧頂指標。當棧中沒有資料元素時,稱之為空棧。棧的插入操作通常稱為進棧或入棧,棧的刪除操作通常稱為退棧或出棧。簡易理解 ...

C語言及ARM中堆疊指標SP設定的理解與總結

什麼是棧 簡易理解 客棧,即臨時寄存的地方,計算機中的堆疊主要用來儲存臨時資料,區域性變數和中斷 呼叫子程式程式的返回位址。程式中棧主要是用來儲存函式中的區域性變數以及儲存暫存器引數的,如果你用了作業系統,棧中還可能儲存當前進執行緒的上下文。設定棧大小的乙個原則是,保證棧不會下溢位到資料空間或程式空...

16 C語言及ARM中堆疊指標SP設定的理解與總結

棧是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入 刪除操作的一端稱為棧頂。表的另一端稱為棧底。棧頂的當前位置是動態的,對棧頂當前位置的標記稱為棧頂指標。當棧中沒有資料元素時,稱之為空棧。棧的插入操作通常稱為進棧或入棧,棧的刪除操作通常稱為退棧或出棧。簡易理解 ...