当前位置:首页 > 单片机 > 单片机
[导读]1.Bootloader概念系统上电后,需要一段程序来初始化重要的硬件,有些程序是固化在固件firmwware上的,如PC的BIOS。然后是Bootloader,如PC上的GRUB。对于嵌入式系统来说,一般只有Bootloader,它负责初始化内核运行的

1.Bootloader概念

系统上电后,需要一段程序来初始化重要的硬件,有些程序是固化在固件firmwware上的,如PC的BIOS。然后是Bootloader,如PC上的GRUB。对于嵌入式系统来说,一般只有Bootloader,它负责初始化内核运行的硬件环境,如内存,然后调用操作系统内核。一般最终产品它只需要启动内核就足够了,为了方便开发,还可以增强Bootloader功能,比如网络功能,通过网络下载文件,烧写文件到Flash中。


2.嵌入式系统结构

嵌入式系统一般包含4部分。

1、引导加载程序,包括固化在固件的boot代码(可选)和Bootloader。

2、Linux内核

3、文件系统,包括根文件系统和其他挂载的文件系统。从某方面说,Android也属于嵌入式,只是它的文件系统比较庞大,比QT漂亮而已。

4、用户应用程序,就是如计数器之类的应用。


3.U-Boot

U-Boot全称UniversalBootLoader,即通用Bootloader。确实,现在很多公司的bootloader都采用u-boot,基本上成为标准。u-boot可以看成是一个大型的裸机程序,它的优点是集成了很多好用的工具,命令,支持很多平台。


4.U-Boot配置

4.1.Makefile

u-boot要经过配置、编译、连接过程。先说配置,从readme文件可以知道,要使用开发板board/,要先make_config。比如我的2440开发板,makehyq2440_config。首先要修改makefile,增加编译选项

hyq2440_config:unconfig

@$(MKCONFIG)$(@:_config=)armarm920thyq2440samsungs3c24x0

unconfig是一些清理事情,不重要,根据makefile目标依赖命令的原理,分析一下@$(MKCONFIG)$(@:_config=)armarm920thyq2440samsungs3c24x0

做了什么事情。makefile的前面定义了MKCONFIG:=$(SRCTREE)/mkconfig,STRTREE就是当前目录,所以MKCONFIG就是源码根目录下的mkconfig。$(@:_config=)展开就是hyq2440_config。所以就变成

mkconfighyq2440armarm920thyq2440samsungs3c24x0

$0$1$2$3$4$5$6


4.2.mkconfig

进入mkconfig看看干了什么事情。


4.2.1.确定开发板名称BOARD_NAME

["${BOARD_NAME}"]||BOARD_NAME="$1"。定义了BOARD_NAME=hyq2440。


4.2.2.创建平台相关的头文件链接

ln-s${SRCTREE}/include/asm-$2asm。创建链接ln-sasm-armasm。

ln-s${LNPREFIX}arch-$6asm-$2/arch。创建链接ln-sarch-s3c24x0asm-arm/arch


4.2.3.创建顶层makefile包含的文件include/config.mk

echo"ARCH=$2">config.mk

echo"CPU=$3">>config.mk

echo"BOARD=$4">>config.mk

则config.mk配置文件内容为:

ARCH=arm

CPU=arm920t

BOARD=hyq2440

VENDOR=samsung

SOC=s3c24x0


4.2.4.创建开发板相关头文件config.h

echo"#include">>config.h

echo"#include">>config.h

>config.h表示新建文件

/*Automaticallygenerated-donotedit*/

#include

#include

从配置中可以知道,如果在board新建一个开发板,则在include/configs目录下要建一个.h的头文件。


4.3.配置文件

1、这个文件主要用来定制u-boot的功能,比如:

/*----------------------------------体系配置----------------------------------*/

#defineCONFIG_ARM920T 1 /*ThisisanARM920TCore */

#define CONFIG_S3C2440 1 /*inaSAMSUNGS3C2440SoC*/

#define CONFIG_HYQ2440 1 /*inaHYQ2440Board*/

/*---------------------------------内存配置--------------------------------------*/

#defineCONFIG_NR_DRAM_BANKS 1 /*wehave1bankofDRAM*/

#definePHYS_SDRAM_1 0x30000000/*SDRAMBank#1*/

#definePHYS_SDRAM_1_SIZE 0x04000000/*64MB*/

/*--------------------------------NorFlash驱动配置-----------------------------*/

#definePHYS_FLASH_1 0x00000000/*FlashBank#1*/

#defineCONFIG_SYS_FLASH_BASE PHYS_FLASH_1

#defineCONFIG_SYS_MAX_FLASH_BANKS 1 /*maxnumberofmemorybanks*/

#defineCONFIG_AMD_LV160B 1

#definePHYS_FLASH_SIZE 0x00200000/*2MB*/

#defineCONFIG_SYS_MAX_FLASH_SECT (35) /*maxnumberofsectorsononechip*/

#defineCONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ)/*TimeoutforFlashErase*/

#defineCONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ)/*TimeoutforFlashWrite*/

需要哪些代码有效,就开启响应的宏。


5.U-Boot编译链接

先编译u-boot,从编译的log反过来看u-boot编译链接过程。

cd/home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot

&&

arm-linux-ld-Bstatic-Tu-boot.lds-Ttext0x33f80000

$UNDEF_SYMcpu/arm920t/start.o

--start-group

lib_generic/libgeneric.a

lib_generic/lzma/liblzma.a

lib_generic/lzo/liblzo.a

cpu/arm920t/libarm920t.a

cpu/arm920t/s3c24x0/libs3c24x0.a

lib_arm/libarm.afs/cramfs/libcramfs.a

fs/fat/libfat.afs/fdos/libfdos.a

fs/jffs2/libjffs2.a

fs/reiserfs/libreiserfs.a

fs/ext2/libext2fs.a

fs/yaffs2/libyaffs2.a

fs/ubifs/libubifs.a

net/libnet.a

disk/libdisk.a

drivers/bios_emulator/libatibiosemu.a

drivers/block/libblock.a

drivers/dma/libdma.a

drivers/fpga/libfpga.a

drivers/gpio/libgpio.a

drivers/hwmon/libhwmon.a

drivers/i2c/libi2c.a

drivers/input/libinput.a

drivers/misc/libmisc.a

drivers/mmc/libmmc.adrivers/mtd/libmtd.a

drivers/mtd/nand/libnand.a

drivers/mtd/onenand/libonenand.a

drivers/mtd/ubi/libubi.a

drivers/mtd/spi/libspi_flash.a

drivers/net/libnet.a

drivers/net/phy/libphy.a

drivers/net/sk98lin/libsk98lin.a

drivers/pci/libpci.a

drivers/pcmcia/libpcmcia.a

drivers/power/libpower.a

drivers/spi/libspi.a

drivers/rtc/librtc.a

drivers/serial/libserial.a

drivers/twserial/libtws.a

drivers/usb/gadget/libusb_gadget.a

drivers/usb/host/libusb_host.a

drivers/usb/musb/libusb_musb.a

drivers/usb/slave/libusb_slave.a

drivers/video/libvideo.a

drivers/watchdog/libwatchdog.a

common/libcommon.a

libfdt/libfdt.a

api/libapi.a

post/libpost.a

board/samsung/hyq2440/libhyq2440.a

--end-group/home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot/lib_arm/eabi_compat.o

-L/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t

-lgcc-Mapu-boot.map-ou-boot

arm-linux-objcopy-Osrecu-bootu-boot.srec

arm-linux-objcopy--gap-fill=0xff-Obinaryu-bootu-boot.bin

从编译log看出,使用链接脚本u-boot.lds来编译,最后生成的起始地址是0x33f80000,把各个平台和驱动下面的libxxx.a链接进来,最后生成u-boot.bin二进制文件。链接脚本对应的是cpu体系下各自的u-boot.lds,

5.1.链接脚本

SECTIONS

{

.=0x00000000;

.=ALIGN(4);

.text:

{

cpu/arm920t/start.o (.text)

board/samsung/hyq2440/lowlevel_init.o (.text)

board/samsung/hyq2440/nand_read.o (.text)

*(.text)

}

.=ALIGN(4);

.rodata:{*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))}

.=ALIGN(4);

.data:{*(.data)}

.=ALIGN(4);

.got:{*(.got)}

.=.;

__u_boot_cmd_start=.;

.u_boot_cmd:{*(.u_boot_cmd)}

__u_boot_cmd_end=.;

.=ALIGN(4);

__bss_start=.;

.bss(NOLOAD):{*(.bss).=ALIGN(4);}

_end=.;

}

链接脚本指定镜像中代码段text,只读数据段rodata,全局初始化数据区data,u-boot命令和全局未初始化数据区bss的排列位置。并且知道,第一段代码是cpu/arm920t/start.o,对应目录下的汇编文件start.S。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭