www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]在介紹該函數(shù)之前,我們需要看一看幾個(gè)數(shù)據(jù)結(jié)構(gòu),這些是u-boot中幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu):1)、gd_t該數(shù)據(jù)結(jié)構(gòu)保存了u-boot需要的配置信息(我暫時(shí)稱它為全局信息表),typedef struct global_data { bd_t *bd;//與板子

在介紹該函數(shù)之前,我們需要看一看幾個(gè)數(shù)據(jù)結(jié)構(gòu),這些是u-boot中幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu):
1)、gd_t該數(shù)據(jù)結(jié)構(gòu)保存了u-boot需要的配置信息(我暫時(shí)稱它為全局信息表),
typedef struct global_data {
bd_t *bd;//與板子相關(guān)的結(jié)構(gòu),見下面
unsigned long flags;
unsigned long baudrate;//波特率
unsigned long have_console; /* serial_init() was called */
unsigned long reloc_off; /* Relocation Offset,重定位偏移*/
unsigned long env_addr; /* Addressof Environment struct ,存放環(huán)境變量結(jié)構(gòu)的地址*/
unsigned long env_valid; /* Checksum of Environment valid? */
#ifdef CONFIG_VFD//我們一般沒有配置這個(gè),這個(gè)是frame buffer的首地址
unsigned long fb_base; /* base address of frame buffer,顯存緩存區(qū)基址*/
#endif
#if 0
unsigned long cpu_clk;/* CPU clock in Hz! CPU的時(shí)鐘頻率*/
unsigned long bus_clk;//總線的時(shí)鐘頻率
unsigned long ram_size;/* RAM size, RAM的大小*/
unsigned long reset_status;/* reset status register at boot */
#endif
void**jt;/* jump table ,保存著些函數(shù)的入口地址,在common/Exports.c中進(jìn)行填充*/
} gd_t;
2)、bd_t保存與板子相關(guān)的配置參數(shù)
typedef struct bd_info

{
int bi_baudrate; /* serial console baudrate ,串口波特率*/
unsigned long bi_ip_addr; /* IP Address ,IP地址*/
unsigned char bi_enetaddr[6];/* Ethernet adress ,以太網(wǎng)地址*/
struct environment_s *bi_env;//環(huán)境變量地址指針
ulong bi_arch_number; /* unique id for this board架構(gòu)號(hào)碼*/
ulong bi_boot_params; /* where this board expects params */
struct /* RAM configuration */
{
ulong start;//RAM的起始地址
ulong size;//RAM的大小
}

bi_dram[CONFIG_NR_DRAM_BANKS];
} bd_t;
3).初始化函數(shù)列表(以數(shù)組的形式)
init_fnc_t *init_sequence[] =

{

cpu_init,/* basic cpu dependent setup|| cpu/arm920t/cpu.c ,cpu的初始化,有待于分析*/
//這個(gè)是對(duì)板子的初始化,
board_init,/* basic board dependent setup|| board/smdk2440/smdk2440.c */
interrupt_init,/* set up exceptions || cpu/arm920t,s3c24x0/interrupts.c */
env_init, /* initialize environment */
init_baudrate,/* initialze baudrate settings */
serial_init,/* serial communications setup || cpu/arm920t/s3c24x0/serial.c */
//串口初始化后我們就可以打印信息了
console_init_f,/* stage 1 init of console */
display_banner,/* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo,/* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard,/* display board info */
#endif
dram_init,/* configure available RAM banks */
display_dram_config,
NULL,
};
//===========================================
int cpu_init (void)//cpu/arm920t/Cpu.c中的函數(shù)
{
/*
* setup up stacks if necessary
*/
//這里只是做了對(duì)中斷棧和快速中斷??臻g地址的定義
//IRQ_STACK_START和FIQ_STACK_START的值在start.S的開始幾行中有定義
//其中的那個(gè)-4操作是難道是為PC跳轉(zhuǎn)留的一個(gè)地址???
#ifdef CONFIG_USE_IRQ
IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;
FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
#endif
return 0;
}
//===================================================
//---------mem_malloc_init----------------
//參數(shù): malloc內(nèi)在區(qū)的起始地址
//功能:完成malloc函數(shù)所要用到的靜態(tài)變量的初始化.
//返回值:無(wú)
//----------------------------------------
static void mem_malloc_init (ulong dest_addr)
{
mem_malloc_start = dest_addr;//緩沖區(qū)起始地址
mem_malloc_end = dest_addr + CFG_MALLOC_LEN;//緩沖區(qū)結(jié)束地址
mem_malloc_brk = mem_malloc_start;//已使用塊的地址,初始時(shí)應(yīng)指向起始地址
memset ((void *) mem_malloc_start, 0, mem_malloc_end - mem_malloc_start);//把這段空間初始化為0
}
......
init_fnc_t *init_sequence[] = {
//該函數(shù)只是做了對(duì)中斷棧和快速中斷??臻g地址的定義
cpu_init, /* basic cpu dependent setup|| cpu/arm920t/cpu.c */
//完成各時(shí)鐘和端口還有g(shù)d中的兩個(gè)成員的初始化
board_init,/* basic board dependent setup|| board/smdk2440/smdk2440.c */
//PWM(Pulse Width Modulation脈寬調(diào)制器) TIMER的初始化,
interrupt_init,/* set up exceptions || cpu/arm920t,s3c24x0/interrupts.c */
//環(huán)境的初始化,沒深入分析
env_init, /* initialize environment */
//初始化波特率,并寫進(jìn)gd的成員變量中
init_baudrate,/* initialze baudrate settings */

//串口初始化后我們就可以打印信息了
serial_init,/* serial communications setup || cpu/arm920t/s3c24x0/serial.c */

console_init_f,/* stage 1 init of console */

//打印一些信息
display_banner,/* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo,/* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard,/* display board info */
#endif
//DRAM的初始化,這里只是對(duì)gd中的bi_dram結(jié)構(gòu)中的兩個(gè)成員賦值,
//也即BANK的起始地址和大小
dram_init,/* configure available RAM banks */

//打印BANK的相關(guān)信息
display_dram_config,
NULL,//用以標(biāo)識(shí)列表數(shù)組的結(jié)束
};
//------------start_armboot--------------------
//功能:完成uboot第二階級(jí)的一系列的硬件初始化工作,然后轉(zhuǎn)入main函數(shù).
//備注:該函數(shù)是C程序的入口函數(shù),從匯編語(yǔ)言跳轉(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)過(guò)代碼重定位后,指令會(huì)從_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)閷?duì)初始化的是個(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的長(zhǎng)度加上DATA的長(zhǎng)度.
即: _bss_start(BSS段基址) =代碼段長(zhǎng)度+數(shù)據(jù)段長(zhǎng)度

BSS(Block Started by Symbol)段是未被初始化的數(shù)據(jù)段,是存放程序中未被初始化的全局變量的一塊內(nèi)存區(qū)域,初始化時(shí)應(yīng)清零;該段只有名稱和大小卻沒有值;該段不包含任何數(shù)據(jù),只是簡(jiǎn)單的維護(hù)開始和結(jié)束的地址,以便內(nèi)存區(qū)能在運(yùn)行時(shí)被有效地清零,它在應(yīng)用程序的映像文件(ARM中也即bin文件)中并不存在.
text :代碼段,是包含程序代碼的段
data:已經(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中的那部分代碼的長(zhǎng)度,也即可TEXT和DATA段,這個(gè)值與start.S中的重定位那部分代碼所計(jì)算的值是相等的;所以,monitor_flash_len表示從flash中搬來(lái)的代碼的長(zhǎng)度
monitor_flash_len = _bss_start - _armboot_start;//_bss_start在u-boot.lds中定位
//各設(shè)置的初始化.當(dāng)返回值不為0時(shí)表示初始化失敗,此時(shí)會(huì)調(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()對(duì)其進(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 */
//把視頻幀緩沖區(qū)設(shè)置在bss_end后面

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉