拷貝代碼和連接腳本的改進
阿新 • • 發佈:2017-11-29
沒有 操作 mov 出了 定義 我們 image 快速 asc
上一篇隨筆說了,需要清除bss段,我們現在定義main函數如下:
註意這個全局變量是沒有初始值的,即存放在bss段中,如果我們的啟動文件沒有清除bss段,串口的輸出將是你想不到情況。比如,現在程序運行執行了++操作20次,你下次快速斷電再上電的時候,g_Char2的值是接著之前的值增加的,而增加了清除bss段之後,每次重新上電,都是從0開始的。到這裏我是覺得納悶的,我們程序是重定位到了sdram的,既然是ram中,掉電不就應該是馬上丟失數據了嗎?然後查詢了一下資料,發現:
然後我就多等了一些時間,果然,可以看到sdram數據在慢慢丟失,又漲知識了~
現在我們在start.S中增加清除bss段的代碼:
/* 清除BSS段 */ ldr r1, =bss_start ldr r2, =bss_end mov r3, #0 clean: strb r3, [r1] add r1, r1, #1 cmp r1, r2 bne clean
連接腳本也需要更改:
SECTIONS { .text 0: {*(.text)} .rodata : {*(.rodata)} .data 0x30000000 :AT(0x800) { data_load_add = LOADADDR(.data); data_start= . ; *(.data) data_end = . ; } .bss : { bss_start = .; *(.bss) *(COMMON) ; bss_end = .; } }
這樣(上面鏈接腳本中bss段中.bss *(COMMEN)後那個分號僅僅為了美觀,會被連接器忽略的,這個在ld連接器那篇文章中有講到)就可以看到串口輸出了,是從ascii碼0開始打印的。
拷貝代碼和連接腳本的改進