日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀] 引入:我們執(zhí)行C語言程序時候,Main函數(shù)是被誰調(diào)用?執(zhí)行完要返回給誰? 答:編譯器編譯代碼 = 啟動文件(標(biāo)準(zhǔn)庫文件) + hello.c;由啟動文件來調(diào)用main,最后main返回給啟動

引入:我們執(zhí)行C語言程序時候,Main函數(shù)是被誰調(diào)用?執(zhí)行完要返回給誰?

答:編譯器編譯代碼 = 啟動文件(標(biāo)準(zhǔn)庫文件) + hello.c;由啟動文件來調(diào)用main,最后main返回給啟動文件。

標(biāo)準(zhǔn)庫文件是編譯器自動在代碼前添加的,用來設(shè)置C程序的堆棧(無對戰(zhàn)空間沒法運行C程序)等,然后調(diào)用main函數(shù)。所以我們執(zhí)行裸板的時候,需要自己寫啟動文件,來得以調(diào)用C代碼。

思路回顧 啟動文件
@******************************************************************************
@ File:crt0.S
@ 功能:通過它轉(zhuǎn)入C程序
@******************************************************************************       

.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str     r1, [r0]            @ 寫入0,禁止WATCHDOG,否則CPU會不斷重啟

            ldr     sp, =1024*4         @ 設(shè)置堆棧,注意:不能大于4k, 因為現(xiàn)在可用的內(nèi)存只有4K
                                        @ nand flash中的代碼在復(fù)位后會移到內(nèi)部ram中,此ram只有4K
            bl      main                @ 調(diào)用C程序中的main函數(shù)
halt_loop:
            b       halt_loop

啟動文件初始化兩部分:

軟件初始化:

0·設(shè)置棧(sp->SRAM)-SRAM不用初始化
1·設(shè)置返回地址
2·調(diào)用main
3·清理工作

硬件初始化:

1·關(guān)看門狗
2·初始化時鐘(我們程序簡單,速度慢點沒關(guān)系,這里沒用到)
3·初始化SDRAM(我們程序比較小,SRAM中4KB夠用了,這里沒用到)

C代碼
#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

int main()
{
    GPFCON = 0x00000100;    // 設(shè)置GPF4為輸出口, 位[8:7]=0b01
    GPFDAT = 0x00000000;    // GPF4輸出0,LED1點亮

    return 0;
}

關(guān)于*(volatile unsigned long *)的解釋請看點補充知識嵌入式中的 *(volatile unsigned int *)理解

Makefile
led_on_c.bin : crt0.S  led_on_c.c
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
    #-g:加入調(diào)試信息 -c只編譯不連接
    arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
    #-Ttext 0x0000000:指定代碼段地址0
    arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
    # binary:二進(jìn)制的 -S:不從源文件復(fù)制重定位信息和符號信息到目標(biāo)文件中去
    arm-linux-objdump -D -m arm  led_on_c_elf > 
led_on_c.dis
    # -D:反匯編所有段 -m arm:指定反匯編文件使用arm架構(gòu)
clean:
    rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉