色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>C語言|源代碼>uboot中C語言代碼入口函數(start_armboot)

uboot中C語言代碼入口函數(start_armboot)

2010-03-13 | rar | 42 | 次下載 | 10積分

資料介紹

uboot中C語言代碼入口函數(start_armboot)的注釋

uboot中C語言代碼入口函數(start_armboot)的注釋

?//打印BANK的相關信息
?display_dram_config,
?NULL, //用以標識列表數組的結束
};
//------------start_armboot--------------------
//功能: 完成uboot第二階級的一系列的
//? 硬件初始化工作, 然后轉入main函數.
//備注: 該函數是C程序的入口函數,從匯編
//? 言跳轉到此 .
//---------------------------------------------
void start_armboot (void)
{
??? init_fnc_t **init_fnc_ptr; //init_fnc_t 是各初始化函數的數組
??? 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
?? 當系統第一次加電時,指令是從0x0地址開始執行的,所以此時的 _start值
?? 應為0x0;而當uboot經過代碼重定位后,指令會從 _TEXT_BASE 處開始執行,
?? 此時的 _start值就成了 _TEXT_BASE的值.
?? CFG_MALLOC_LEN: 在/include/configs/smdk2440.h中有定義,該變量表示供
?? malloc函數使用的內存池空間,代碼中定義值為:0x10000+128*1024
?|-------|<--- _armboot_start基址
?|? 4??? |?
?|-------|<--- malloc函數池基址
?|? 3??? |
?|-------|<--- (gd_t)gd(全局變量表)基址
?|? 2??? |
?|-------|<--- (bt_t)bd(板卡信息表)基址
?|? 1??? |
? -------
?? 4 就是為malloc函數預留的數據空間
?? 3 是全信息表gd的數據區
?2 是板卡信息表bd的數據區
?網上找了個圖片,更能反應這個空間的分配關系:
?
?*/
???? //分配區域 3 給 gd ,gd是一個全局靜態變量
??? gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

??? /* compiler optimization barrier needed for GCC >= 3.4 */
??? __asm__ __volatile__("": : :"memory");
?//把gd變量的內容填充為0 ,填充 3 區的數據為0 ,即初始化gd表.注意:這里并沒有
?//初始化bd表,在gd表中的bd成員只是一個指針,因為對初始化的是個指針地址
??? memset ((void*)gd, 0, sizeof (gd_t));
?/*
? bd_t 結構體在/include/asm-arm/U-boot.h中定義, 定義板子的一些信息,包括:
? 波特率,IP地址, 以太網地址, 架構編碼,啟動參數 ,BANK的起始地址和大小等
?*/
?//分配區域 2 給bd, bd的基址 = gd的基址 - bd的尺寸
??? gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
?
?//把區域 2 填充為 0 ,即初始化 bd 表
??? memset (gd->bd, 0, sizeof (bd_t));
?/*monitor_falsh_len定義在 /lib_arm/Board.c
?
?在bin文件中 BSS 段和 TEXT 段和 DATA 段存放的順序同前向后依次是:
? TEXT(代碼段 RO)??? DATA(已初始化數據段 RW)?? BSS(未初始化數據段 ZI)
?所以 _bss_start 的基址等于 TEXT的長度加上DATA的長度.
?即: _bss_start(BSS段基址) = 代碼段長度+數據段長度
?
?BSS(Block Started by Symbol)段是未被初始化的數據段,是存放程序中
? 未被初始化的全局變量的一塊內存區域,初始化時應清零;該段只有
? 名稱和大小卻沒有值;該段不包含任何數據,只是簡單的維護開始和
? 結束的地址,以便內存區能在運行時被有效地清零,它在應用程序的
? 映像文件(ARM中也即bin文件)中并不存在.
?text :代碼段,是包含程序代碼的段
?dat? :已經初始化的數據段,保存已經初始化的全局變量.
?
??? 在嵌入式系統中,bin文件(又稱Image文件)中只包含text和data段,
? 而bss段不在其中,它是由系統初始化為零.
??? */
? //_armboot_start 在start.S中定義為_start,而_start為代碼的起始地址
??? //只包含 RO(TEXT) 和 RW(DATA) 段.重定位前的值為0x0,此時指向flash,
?//重定位后則指向RAM中的某一地址
?//由此可以知道:? _bss_start - _armboot_start 的值即是在第一階段從
?//flash中重定位到RAM中的那部分代碼的長度,也即可TEXT和DATA數據段,
?//這個值與start.S中的重定位那部分代碼所計算的值是相等的
?//所以,monitor_flash_len表示從flash中搬來的代碼的長度
??? monitor_flash_len = _bss_start - _armboot_start;? //_bss_start 在u-boot.lds中定位
?
?//各設置的初始化.當返回值不為0時表示初始化失敗 ,此時會調用 hang()函數
?//打印一錯誤提示信息,然后進入死循環
??? for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
??????? if ((*init_fnc_ptr)() != 0) {
??????????? hang ();
??????? }
??? }
//CFG_NO_FLASH 表示沒有flash,如果沒定義該常量則表示板子上有flash,此時調用flash_init()對其進行初始化.
#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(內存)空間
???? /* 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; //為顯存緩沖區地址變量賦值
#endif /* CONFIG_LCD */
?/* armboot_start is defined in the board-specific linker script */
?//malloc函數使用緩沖區的初始化
??? 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 環境的初始化,代碼在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中出現,應該是該常量
?/* 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
?}
?//這個函數涉及好多,我沒深入分析,若哪位分析了希望能分享一下:cczy_english@163.com,將不勝感激
?devices_init (); /* get the devices list going. */
#ifdef CONFIG_CMC_PU2
?load_sernum_ethaddr ();
#endif /* CONFIG_CMC_PU2 */
//初始化跳轉表,對gd中的jt(函數跳轉表)數組進行初始化,其中保存著一些函數的入口地址

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1490次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費
  11. 6基于AT89C2051/4051單片機編程器的實驗
  12. 0.11 MB  |  4次下載  |  免費
  13. 7藍牙設備在嵌入式領域的廣泛應用
  14. 0.63 MB  |  3次下載  |  免費
  15. 89天練會電子電路識圖
  16. 5.91 MB  |  3次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關電源設計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537791次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費
主站蜘蛛池模板: 欧美亚洲另类图片| 亚洲国产在线精品国偷产拍| 伊人久久综合影院首页| 成年人视频在线观看免费| 久久99re66热这里只有精品| 色怕怕| 2019午夜福利757视频第12集| 国产精品人妻无码99999| 嫩草影院成人| 亚洲免费在线播放| 国产成人精品电影| 暖暖视频免费观看高清完整版 | qvod免费电影| 久久精品视频在线看15| 香蕉久久一区二区三区啪啪| 超碰最新网站| 免费观看美女的网站| 伊人狠狠丁香婷婷综合尤物| 国产乱辈通伦影片在线播放亚洲 | 国内高清在线观看视频| 人妻夜夜爽天天爽三区麻豆AV网站| 中国女人hd| 久久 这里只精品 免费| 亚洲高清视频免费| 光棍天堂在线a| 日本一区不卡在线播放视频免费| 92午夜理论第1000集 app| 久久精品亚洲AV高清网站性色| 亚洲国产日韩欧美在线a乱码| 国产成人免费观看在线视频| 日本乱子人伦在线视频| jaPanesmature儿母| 免费毛片视频网站| 中文在线观看永久免费| 久久久精品3d动漫一区二区三区| 亚洲精品视频在线免费| 国产在线午夜| 亚洲第一页视频| 国产在线高清视频无码不卡| 小柔的性放荡羞辱日记动漫| 国产高清视频a在线大全|