1. 程式人生 > >拷貝代碼和連接腳本的改進

拷貝代碼和連接腳本的改進

沒有 操作 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開始打印的。

拷貝代碼和連接腳本的改進