資料介紹
uboot中C語言代碼入口函數(shù)(start_armboot)的注釋
?//打印BANK的相關(guān)信息
?display_dram_config,
?NULL, //用以標(biāo)識列表數(shù)組的結(jié)束
};
//------------start_armboot--------------------
//功能: 完成uboot第二階級的一系列的
//? 硬件初始化工作, 然后轉(zhuǎn)入main函數(shù).
//備注: 該函數(shù)是C程序的入口函數(shù),從匯編語
//? 言跳轉(zhuǎn)到此 .
//---------------------------------------------
void start_armboot (void)
{
??? init_fnc_t **init_fnc_ptr; //init_fnc_t 是各初始化函數(shù)的數(shù)組
??? char *s;
#ifndef CFG_NO_FLASH
??? ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
??? unsigned long addr;
#endif
? /* Pointer is writable since we allocated a register for it
????? gd_t: 定義在 /include/asm-arm/Global_data.h中,包含一些全局通用的變量.
??? _armboot_start: 代碼的起始地址,它定義在start.S中的前幾行中,定義為 _start
?? 當(dāng)系統(tǒng)第一次加電時(shí),指令是從0x0地址開始執(zhí)行的,所以此時(shí)的 _start值
?? 應(yīng)為0x0;而當(dāng)uboot經(jīng)過代碼重定位后,指令會從 _TEXT_BASE 處開始執(zhí)行,
?? 此時(shí)的 _start值就成了 _TEXT_BASE的值.
?? CFG_MALLOC_LEN: 在/include/configs/smdk2440.h中有定義,該變量表示供
?? malloc函數(shù)使用的內(nèi)存池空間,代碼中定義值為:0x10000+128*1024
?|-------|<--- _armboot_start基址
?|? 4??? |?
?|-------|<--- malloc函數(shù)池基址
?|? 3??? |
?|-------|<--- (gd_t)gd(全局變量表)基址
?|? 2??? |
?|-------|<--- (bt_t)bd(板卡信息表)基址
?|? 1??? |
? -------
?? 4 就是為malloc函數(shù)預(yù)留的數(shù)據(jù)空間
?? 3 是全信息表gd的數(shù)據(jù)區(qū)
?2 是板卡信息表bd的數(shù)據(jù)區(qū)
?網(wǎng)上找了個(gè)圖片,更能反應(yīng)這個(gè)空間的分配關(guān)系:
?
?*/
???? //分配區(qū)域 3 給 gd ,gd是一個(gè)全局靜態(tài)變量
??? gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
??? /* compiler optimization barrier needed for GCC >= 3.4 */
??? __asm__ __volatile__("": : :"memory");
?//把gd變量的內(nèi)容填充為0 ,填充 3 區(qū)的數(shù)據(jù)為0 ,即初始化gd表.注意:這里并沒有
?//初始化bd表,在gd表中的bd成員只是一個(gè)指針,因?yàn)閷Τ跏蓟氖莻€(gè)指針地址
??? memset ((void*)gd, 0, sizeof (gd_t));
?/*
? bd_t 結(jié)構(gòu)體在/include/asm-arm/U-boot.h中定義, 定義板子的一些信息,包括:
? 波特率,IP地址, 以太網(wǎng)地址, 架構(gòu)編碼,啟動(dòng)參數(shù) ,BANK的起始地址和大小等
?*/
?//分配區(qū)域 2 給bd, bd的基址 = gd的基址 - bd的尺寸
??? gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
?
?//把區(qū)域 2 填充為 0 ,即初始化 bd 表
??? memset (gd->bd, 0, sizeof (bd_t));
?/*monitor_falsh_len定義在 /lib_arm/Board.c
?
?在bin文件中 BSS 段和 TEXT 段和 DATA 段存放的順序同前向后依次是:
? TEXT(代碼段 RO)??? DATA(已初始化數(shù)據(jù)段 RW)?? BSS(未初始化數(shù)據(jù)段 ZI)
?所以 _bss_start 的基址等于 TEXT的長度加上DATA的長度.
?即: _bss_start(BSS段基址) = 代碼段長度+數(shù)據(jù)段長度
?
?BSS(Block Started by Symbol)段是未被初始化的數(shù)據(jù)段,是存放程序中
? 未被初始化的全局變量的一塊內(nèi)存區(qū)域,初始化時(shí)應(yīng)清零;該段只有
? 名稱和大小卻沒有值;該段不包含任何數(shù)據(jù),只是簡單的維護(hù)開始和
? 結(jié)束的地址,以便內(nèi)存區(qū)能在運(yùn)行時(shí)被有效地清零,它在應(yīng)用程序的
? 映像文件(ARM中也即bin文件)中并不存在.
?text :代碼段,是包含程序代碼的段
?dat? :已經(jīng)初始化的數(shù)據(jù)段,保存已經(jīng)初始化的全局變量.
?
??? 在嵌入式系統(tǒng)中,bin文件(又稱Image文件)中只包含text和data段,
? 而bss段不在其中,它是由系統(tǒng)初始化為零.
??? */
? //_armboot_start 在start.S中定義為_start,而_start為代碼的起始地址
??? //只包含 RO(TEXT) 和 RW(DATA) 段.重定位前的值為0x0,此時(shí)指向flash,
?//重定位后則指向RAM中的某一地址
?//由此可以知道:? _bss_start - _armboot_start 的值即是在第一階段從
?//flash中重定位到RAM中的那部分代碼的長度,也即可TEXT和DATA數(shù)據(jù)段,
?//這個(gè)值與start.S中的重定位那部分代碼所計(jì)算的值是相等的
?//所以,monitor_flash_len表示從flash中搬來的代碼的長度
??? monitor_flash_len = _bss_start - _armboot_start;? //_bss_start 在u-boot.lds中定位
?
?//各設(shè)置的初始化.當(dāng)返回值不為0時(shí)表示初始化失敗 ,此時(shí)會調(diào)用 hang()函數(shù)
?//打印一錯(cuò)誤提示信息,然后進(jìn)入死循環(huán)
??? for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
??????? if ((*init_fnc_ptr)() != 0) {
??????????? hang ();
??????? }
??? }
//CFG_NO_FLASH 表示沒有flash,如果沒定義該常量則表示板子上有flash,此時(shí)調(diào)用flash_init()對其進(jìn)行初始化.
#ifndef CFG_NO_FLASH
??? /* configure available FLASH banks */
??? size = flash_init ();
??? display_flash_config (size); //打印flash的信息,這里僅輸出它的大小
#endif /* CFG_NO_FLASH */
#ifdef CONFIG_VFD
#?? ifndef PAGE_SIZE
#???? define PAGE_SIZE 4096
#?? endif
???? /*
????? * reserve memory for VFD display (always full pages)
????? */
??? /* bss_end is defined in the board-specific linker script */
??? addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); //???
??? size = vfd_setmem (addr);
??? gd->fb_base = addr;
#endif /* CONFIG_VFD */
#ifdef CONFIG_LCD
# ifndef PAGE_SIZE
#?? define PAGE_SIZE 4096
# endif
???? /*
????? * reserve memory for LCD display (always full pages)
????? *///為LCD分配RAM(內(nèi)存)空間
???? /* bss_end is defined in the board-specific linker script */
??? addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
??? size = lcd_setmem (addr);
??? gd->fb_base = addr; //為顯存緩沖區(qū)地址變量賦值
#endif /* CONFIG_LCD */
?/* armboot_start is defined in the board-specific linker script */
?//malloc函數(shù)使用緩沖區(qū)的初始化
??? mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);?
//如果定義了命令和NAND命令,則初始化nand
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
??? puts ("NAND:? ");
??? nand_init();? /* go init the NAND */
#endif
#ifdef CONFIG_HAS_DATAFLASH
??? AT91F_DataflashInit();
??? dataflash_print_info();
#endif
???? /* initialize environment 環(huán)境的初始化,代碼在common\env_common.c中 */
??? env_relocate ();
#ifdef CONFIG_VFD
???? /* must do this after the framebuffer is allocated */
??? drv_vfd_init();
#endif /* CONFIG_VFD */
???? /* IP Address 為全局變量的成員賦值:IP地址*/
??? gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");//ipaddr在smdk2440.h中的CONFIG_IPADDR中出現(xiàn),應(yīng)該是該常量
?/* MAC Address *///高處MAC地址 ,并賦給gd的成員變量
?{
??? int i;
??? ulong reg;
??? char *s, *e;
??? char tmp[64];
??? i = getenv_r ("ethaddr", tmp, sizeof (tmp));
??? s = (i > 0) ? tmp : NULL;
??? for (reg = 0; reg < 6; ++reg) {
??? gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
??? if (s)
??????? s = (*e) ? e + 1 : e;
}
#ifdef CONFIG_HAS_ETH1
? i = getenv_r ("eth1addr", tmp, sizeof (tmp));
? s = (i > 0) ? tmp : NULL;
? for (reg = 0; reg < 6; ++reg) {
?? gd->bd->bi_enet1addr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
?? if (s)
??? s = (*e) ? e + 1 : e;
? }
#endif
?}
?//這個(gè)函數(shù)涉及好多,我沒深入分析,若哪位分析了希望能分享一下:cczy_english@163.com,將不勝感激
?devices_init (); /* get the devices list going. */
#ifdef CONFIG_CMC_PU2
?load_sernum_ethaddr ();
#endif /* CONFIG_CMC_PU2 */
//初始化跳轉(zhuǎn)表,對gd中的jt(函數(shù)跳轉(zhuǎn)表)數(shù)組進(jìn)行初始化,其中保存著一些函數(shù)的入口地址
掃碼添加小助手
加入工程師交流群
- C語言函數(shù)速查手冊 11次下載
- C語言標(biāo)準(zhǔn)庫函數(shù) 0次下載
- C++ C語言函數(shù)查詢電子版下載 0次下載
- C語言串口通信-源代碼pdf免費(fèi)下載 31次下載
- C語言冒泡排序工程代碼匯總 3次下載
- DSP載波移相控制C語言源代碼下載 58次下載
- 無線遙控頻率計(jì)C語言源代碼下載 37次下載
- C語言編程常用的文件處理函數(shù)匯總下載 9次下載
- C語言編程函數(shù)庫分類匯總資源下載 17次下載
- C語言編程字符串函數(shù)匯總資源下載 9次下載
- C語言函數(shù)為什么不能返回?cái)?shù)組?資料下載
- 基于C語言的LED呼吸燈簡單源代碼 16次下載
- 延時(shí)函數(shù)的C語言源代碼免費(fèi)下載 3次下載
- C語言程序的main函數(shù)免費(fèi)下載 3次下載
- Uboot中start.S源碼的指令級的詳盡解析 28次下載
- 詳解hal_entry入口函數(shù) 1.8k次閱讀
- 使用C語言實(shí)現(xiàn)函數(shù)模板 1.3k次閱讀
- U-Boot啟動(dòng)過程概述 U-Boot啟動(dòng)代碼具體分析 4.7k次閱讀
- C語言代碼規(guī)范 1.9k次閱讀
- main函數(shù)不一定就是程序入口 1.2k次閱讀
- 深入探索Linux中的C語言 2.8k次閱讀
- C語言內(nèi)聯(lián)函數(shù) 1.8k次閱讀
- C語言使用函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么? 2k次閱讀
- C語言中函數(shù)的創(chuàng)建以及使用 6.9k次閱讀
- C語言怎么跳出while函數(shù) 3.9w次閱讀
- C語言里函數(shù)的定義、子函數(shù)的使用及變量的作用域 8.1k次閱讀
- C語言模擬實(shí)現(xiàn)strcmp函數(shù) 3.1k次閱讀
- keil c51是如何啟動(dòng)c程序的 4.6k次閱讀
- 如何將STM32單片機(jī)中的函數(shù)調(diào)用到入口參數(shù) 6.1k次閱讀
- uboot中的SPL作用詳解 2.8w次閱讀
下載排行
本周
- 1MDD品牌三極管BC807數(shù)據(jù)手冊
- 3.00 MB | 次下載 | 免費(fèi)
- 2MDD品牌三極管BC817數(shù)據(jù)手冊
- 2.51 MB | 次下載 | 免費(fèi)
- 3MDD品牌三極管D882數(shù)據(jù)手冊
- 3.49 MB | 次下載 | 免費(fèi)
- 4MDD品牌三極管MMBT2222A數(shù)據(jù)手冊
- 3.26 MB | 次下載 | 免費(fèi)
- 5MDD品牌三極管MMBTA56數(shù)據(jù)手冊
- 3.09 MB | 次下載 | 免費(fèi)
- 6MDD品牌三極管MMBTA92數(shù)據(jù)手冊
- 2.32 MB | 次下載 | 免費(fèi)
- 7STM32G474 HRTIME PWM 丟波問題分析與解決
- 1.00 MB | 次下載 | 3 積分
- 8新能源電動(dòng)汽車高壓線束的銅鋁連接解決方案
- 2.71 MB | 次下載 | 2 積分
本月
- 1愛華AIWA HS-J202維修手冊
- 3.34 MB | 37次下載 | 免費(fèi)
- 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊
- 1.63 MB | 23次下載 | 免費(fèi)
- 3NB-IoT芯片廠商的資料說明
- 0.31 MB | 22次下載 | 1 積分
- 4H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
- 0.63 MB | 6次下載 | 1 積分
- 5UWB653Pro USB口測距通信定位模塊規(guī)格書
- 838.47 KB | 5次下載 | 免費(fèi)
- 6技嘉H110主板IT8628E_BX IO電路圖資料
- 2.61 MB | 4次下載 | 1 積分
- 7蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 8蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
- 0.08 MB | 2次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論