U-Boot编译系统简要分析

u-boot编译流程简要分析 本文基于版本进行分析。1.1、参考资料 u-boot的编译系统介绍可以参考:U-Boot 完全分析与移植,这篇文章。1.2、编译入口 在执行编译u-boot时,由于没有指定目标,因此执行的是顶层Makefile中的第一个目标。在顶层Makefile中,从文件开头往下查找第一个编译目标,会找到如下部分: 会发现这里的没有做任何操作,也没有任何依赖,继续往下找,会发现会重载: 由于执行是我们没有指定,因此这里的就为空,就为真,最终被重载为,如下: 这里依赖于,需要确定做了哪些事情,继续往下找: 这里会发现,依赖 阅读详情

U-Boot编译系统简要分析

注:本文的编写参考了以下网络文章:

1.U-Boot简介

在此不废话,相信大家都已经了解。
在此要说明的是,其源代码目录下的README对需要了解U-Boot及其移植方法的人有很大帮助。其中有说U-Boot的目录结构如下:
Directory Hierarchy:====================

    /arch           Architecture specific files
      /arm          Files generic to ARM architecture
        /cpu        CPU specific files
          /arm720t      Files specific to ARM 720 CPUs
          /arm920t      Files specific to ARM 920 CPUs
        /at91       Files specific to Atmel AT91RM9200 CPU
        /imx        Files specific to Freescale MC9328 i.MX CPUs
        /s3c24x0    Files specific to Samsung S3C24X0 CPUs
          /arm925t      Files specific to ARM 925 CPUs
          /arm926ejs    Files specific to ARM 926 CPUs
          /arm1136      Files specific to ARM 1136 CPUs
          /ixp      Files specific to Intel XScale IXP CPUs
          /pxa      Files specific to Intel XScale PXA CPUs
          /s3c44b0      Files specific to Samsung S3C44B0 CPUs
          /sa1100       Files specific to Intel StrongARM SA1100 CPUs
        /lib        Architecture specific library files
      /avr32        Files generic to AVR32 architecture
        /cpu        CPU specific files
        /lib        Architecture specific library files
      /blackfin     Files generic to Analog Devices Blackfin architecture
        /cpu        CPU specific files
        /lib        Architecture specific library files
      /x86          Files generic to x86 architecture
        /cpu        CPU specific files
        /lib        Architecture specific library files
      /m68k         Files generic to m68k architecture
        /cpu        CPU specific files
          /mcf52x2      Files specific to Freescale ColdFire MCF52x2 CPUs
          /mcf5227x     Files specific to Freescale ColdFire MCF5227x CPUs
          /mcf532x      Files specific to Freescale ColdFire MCF5329 CPUs
          /mcf5445x     Files specific to Freescale ColdFire MCF5445x CPUs
          /mcf547x_8x   Files specific to Freescale ColdFire MCF547x_8x CPUs
        /lib        Architecture specific library files
      /microblaze       Files generic to microblaze architecture
        /cpu        CPU specific files
        /lib        Architecture specific library files
      /mips         Files generic to MIPS architecture
        /cpu        CPU specific files
          /mips32       Files specific to MIPS32 CPUs
          /xburst       Files specific to Ingenic XBurst CPUs
        /lib        Architecture specific library files
      /nds32        Files generic to NDS32 architecture
        /cpu        CPU specific files
          /n1213        Files specific to Andes Technology N1213 CPUs
        /lib        Architecture specific library files
      /nios2        Files generic to Altera NIOS2 architecture
        /cpu        CPU specific files
        /lib        Architecture specific library files
      /powerpc      Files generic to PowerPC architecture
        /cpu        CPU specific files
          /74xx_7xx     Files specific to Freescale MPC74xx and 7xx CPUs
          /mpc5xx       Files specific to Freescale MPC5xx CPUs
          /mpc5xxx      Files specific to Freescale MPC5xxx CPUs
          /mpc8xx       Files specific to Freescale MPC8xx CPUs
          /mpc8220      Files specific to Freescale MPC8220 CPUs
          /mpc824x      Files specific to Freescale MPC824x CPUs
          /mpc8260      Files specific to Freescale MPC8260 CPUs
          /mpc85xx      Files specific to Freescale MPC85xx CPUs
          /ppc4xx       Files specific to AMCC PowerPC 4xx CPUs
        /lib        Architecture specific library files
      /sh           Files generic to SH architecture
        /cpu        CPU specific files
          /sh2      Files specific to sh2 CPUs
          /sh3      Files specific to sh3 CPUs
          /sh4      Files specific to sh4 CPUs
        /lib        Architecture specific library files
      /sparc        Files generic to SPARC architecture
        /cpu        CPU specific files
          /leon2        Files specific to Gaisler LEON2 SPARC CPU
          /leon3        Files specific to Gaisler LEON3 SPARC CPU
        /lib        Architecture specific library files
    /api            Machine/arch independent API for external apps
    /board          Board dependent files
    /common         Misc architecture independent functions
    /disk           Code for disk drive partition handling
    /doc            Documentation (don't expect too much)
    /drivers        Commonly used device drivers
    /examples       Example code for standalone applications, etc.
    /fs         Filesystem code (cramfs, ext2, jffs2, etc.)
    /include        Header Files
    /lib            Files generic to all architectures
      /libfdt       Library files to support flattened device trees
      /lzma         Library files to support LZMA decompression
      /lzo          Library files to support LZO decompression
    /net            Networking code
    /post           Power On Self Test
    /rtc            Real Time Clock drivers
    /tools          Tools to build S-Record or U-Boot images, etc.

而其中的配置也分为两种,并详细介绍了各配置项:
There are two classes of configuration variables:

  • Configuration OPTIONS: These are selectable by the user and have names beginning with "CONFIG_".

  • Configuration SETTINGS: These depend on the hardware etc. and should not be meddled with if you don't know what you're doing; they have names beginning with "CONFIG_SYS_".

另外对U-boot的编译、移植方法及生成的映像的格式也作了介绍。

2.U-Boot的编译过程

  • 编译步骤
    根据U-Boot源代码README之介绍,U-Boot的编译分为两个步骤:
    make NAME_CONFIG
    make all
    那么,这两部都做了什么操作呢,既然执行的是make命令,那么我们就不得不打开Makefile一探究竟了。
  • Makefile初探
    打开Makefile,我们首先是奔着make NAME_CONFIG来的,搜索xx_config发现,MAkefile里面只有为数不多的几个带xx_config的target,而有一个很特别:%_config。
    根据《跟我一起写Makefile》p36之模式变量介绍:
  • 在GNU的make中,还支持模式变量(Pattern-specific Variable ),模式变量的好处就是,我们可以给定一种“ 模式” ,可以把变量定义在符合这种模式的所有目标上。
    我们知道,make的“ 模式” 一般是至少含有一个“%” 的,所以,我们可以以如下方式给所有以[.o] 结尾的目标定义目标变量: %.o : CFLAGS = -O
    由此可见,只要看%_config的命令即可。
    %_config依赖于unconfig,即配置之前先清除之前的配置,然后执行下面的命令:
    @$(MKCONFIG) -A $(@:_config=)
    事实上是执行了源代码根目录下之脚本,并把你传入的NAME_config去掉结尾的config传递过去( $(@:_config=) 参考《跟我一起写Makefile》p30之变量高级用法:
    我们可以替换变量中的共有的部分,其格式是“$(var:a=b)” 或是“${var:a=b}” ,其意思是,把变量“var”中所有以“a”字串“ 结尾” 的“a”替换成“b”字串。这里的“ 结尾” 意思是“ 空格” 或是“ 结束符” 。*):
    mkconfig -A NAME
  • mkconfig详解
    于是我们来到了mkconfig,shell脚本,哈哈,没什么好怕的了。
    首先是在board.cfg中寻找你传进来的NAME的配置行,board.cfg的格式类似如下: smdk2410 arm arm920t - samsung s3c24x
    第一个是配置文件名称,第二个是体系结构,第三个是cpu,第四个是board名称,若-,则board名称为去掉配置文件名_config后的部分。第五个是厂商vendor,第六个是soc的名称。如果有第七个参数则指定了选项,这里不做详细介绍。
    得到这些参数之后干什么了呢?
    仍以smdk2410为例,将arch目录下的inlcude/asm链接到include/asm:

        cd ./include
        rm -f asm
        ln -s ../arch/${arch}/include/asm asm
    

    将链接过来的asm目录里的arch目录删除,然后根据soc更新:

        if [ -z "${soc}" ] ; then
            ln -s ${LNPREFIX}arch-${cpu} asm/arch
        else
            ln -s ${LNPREFIX}arch-${soc} asm/arch
    

    如果是arm体系,还要更新asm目录下的proc目录:

        if [ "${arch}" = "arm" ] ; then
            rm -f asm/proc
            ln -s ${LNPREFIX}proc-armv asm/proc
        fi
    

    接着创建了include/config.mk文件,config.mk文件在后边编译时会被Makefile包含,并写入以下内容:

        echo "ARCH   = ${arch}"  >  config.mk
        echo "CPU    = ${cpu}"   >> config.mk
        echo "BOARD  = ${board}" >> config.mk
        [ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk
        [ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk
    

    在此vendor指没指定有一个很重要的区别,其board目录可能是vendor/board或者board:

        if [ -z "${vendor}" ] ; then
            BOARDDIR=${board}
        else
            BOARDDIR=${vendor}/${board}
        fi
    

    接下来生成include/config.h:

        for i in ${TARGETS} ; do
            i="`echo ${i} | sed '/=/ {s/=/  /;q; } ; { s/$/ 1/; }'`"
            echo "#define CONFIG_${i}" >>config.h ;
        done
    
        echo "#define CONFIG_SYS_ARCH  \"${arch}\""  >> config.h
        echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h
        echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h
    
        [ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
    
        [ "${soc}"    ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h
    
        cat << EOF >> config.h
        #define CONFIG_BOARDDIR board/$BOARDDIR
        #include <config_cmd_defaults.h>
        #include <config_defaults.h>
        #include <configs/${CONFIG_NAME}.h>
        #include <asm/config.h>
        #include <config_fallbacks.h>
        EOF
    

    config.h包含了arch,cpu,board,vendor,soc,board_dir这些宏定义。
    关于一开始的TARGETS循环,在boards.cfg中的选项字段即会转化为此处的宏定义,一可以使用-t传递参数给mkconfig。
    至此,配置工作基本完成了,生成了include目录下的config.mk和config.h两个文件。

  • Makefile 二探
    a.根据顶层README的介绍,编译U-Boot的第二个阶段就是

        make all
    

    于是再次打开Makefile

        all:        $(ALL-y) $(SUBDIR_EXAMPLES)
        $(obj)u-boot.srec:  $(obj)u-boot
                $(OBJCOPY) -O srec $< $@
        $(obj)u-boot.bin:   $(obj)u-boot
                $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
                $(BOARD_SIZE_CHECK)
        $(SUBDIR_EXAMPLES): $(obj)u-boot
        ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map
    

    由此可见,编译的话首先是编译生成u-boot,然后objcopy出另外的两个镜像类型的文件。关键是u-boot的生成:

        $(obj)u-boot:   depend \
                $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
                $(GEN_UBOOT)
    

    b.$(SUBDIR_TOOLS)

        SUBDIR_TOOLS = tools
        SUBDIRS = $(SUBDIR_TOOLS)
        $(SUBDIRS): depend
                $(MAKE) -C $@ all
    

    因此SUBDIR_TOOLS是进入tools目录执行make命令(make -C tools)生成的。此目录的主要作用,就是会生成一系列的工具:

        BIN_FILES-$(CONFIG_LCD_LOGO) += bmp_logo$(SFX)
        BIN_FILES-$(CONFIG_VIDEO_LOGO) += bmp_logo$(SFX)
        BIN_FILES-$(CONFIG_BUILD_ENVCRC) += envcrc$(SFX)
        BIN_FILES-$(CONFIG_CMD_NET) += gen_eth_addr$(SFX)
        BIN_FILES-$(CONFIG_CMD_LOADS) += img2srec$(SFX)
        BIN_FILES-$(CONFIG_XWAY_SWAP_BYTES) += xway-swap-bytes$(SFX)
        BIN_FILES-y += mkenvimage$(SFX)
        BIN_FILES-y += mkimage$(SFX)
        BIN_FILES-$(CONFIG_SMDK5250) += mksmdk5250spl$(SFX)
        BIN_FILES-$(CONFIG_MX28) += mxsboot$(SFX)
        BIN_FILES-$(CONFIG_NETCONSOLE) += ncb$(SFX)
        BIN_FILES-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1$(SFX)
        BIN_FILES-$(CONFIG_KIRKWOOD) += kwboot$(SFX)
    

    当然,最重要的是mkimage,还有bmp_logo等等,此处不详解了。
    c.$(OBJS)

        OBJS  = $(CPUDIR)/start.o
        ifeq ($(CPU),x86)
        OBJS += $(CPUDIR)/start16.o
        OBJS += $(CPUDIR)/resetvec.o
        endif
        ifeq ($(CPU),ppc4xx)
        OBJS += $(CPUDIR)/resetvec.o
        endif
        ifeq ($(CPU),mpc85xx)
        OBJS += $(CPUDIR)/resetvec.o
        endif
        OBJS := $(addprefix $(obj),$(OBJS))
        $(OBJS):    depend
                $(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
    

    由此可见,OBJS最最重要的就是进入CPUDIR编译出start.o了。
    那么,CPUDIR是怎么定义的呢,顶层的Makefile中有:

        include $(obj)include/config.mk
        export  ARCH CPU BOARD VENDOR SOC 
        include $(TOPDIR)/config.mk
    

    include/config.mk根据之前的解析是在make NAME_config时生成了,里面定义了ARCH,CPU,BOARD,VENDOR,SOC等这几个变量。
    根据顶层目录下config之定义:

        CPUDIR=arch/$(ARCH)/cpu/$(CPU)
        ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))
        CPUDIR=arch/$(ARCH)/cpu
        endif
    

    由此就进入了正确的某个CPU的目录并编译了正确start.o启动代码。
    d.$(LIBBOARD)

        LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
        LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
        $(LIBBOARD):    depend $(LIBS)
                $(MAKE) -C $(dir $(subst $(obj),,$@))
    

    同理,顶层目录的config.mk对BOARDDIR的定义如下:

        ifdef   VENDOR
        BOARDDIR = $(VENDOR)/$(BOARD)
        else
        BOARDDIR = $(BOARD)
        endif
    

    因此就是进入开发板的目录编译并链接,仍以smdk2410为例:

        include $(TOPDIR)/config.mk
        LIB = $(obj)lib$(BOARD).o
        COBJS   := smdk2410.o
        SOBJS   := lowlevel_init.o
        SRCS    := $(SOBJS:.o=.S) $(COBJS:.o=.c)
        OBJS    := $(addprefix $(obj),$(COBJS))
        SOBJS   := $(addprefix $(obj),$(SOBJS))
        $(LIB): $(obj).depend $(OBJS) $(SOBJS)
            $(call cmd_link_o_target, $(OBJS) $(SOBJS))
    

    $(obj)lib$(BOARD).o依赖于smdk2410.o和lowlevel_init.o,编译吧,然后cmd_link_o_target进行链接。

        cmd_link_o_target = $(if $(strip $1),\
                      $(LD) $(LDFLAGS) -r -o $@ $1,\
                      rm -f $@; $(AR) rcs $@ )
    

    e.$(LIBS)
    呃,这个是最麻烦的啦,哎。

        LIBS  = lib/libgeneric.o
        LIBS += lib/lzma/liblzma.o
        LIBS += lib/lzo/liblzo.o
        LIBS += lib/zlib/libz.o
        ......
        LIBS += $(CPUDIR)/lib$(CPU).o
        ifdef SOC 
        LIBS += $(CPUDIR)/$(SOC)/lib$(SOC).o
        endif
        ......
        LIBS += arch/$(ARCH)/lib/lib$(ARCH).o
        LIBS += fs/cramfs/libcramfs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o \
            fs/reiserfs/libreiserfs.o fs/ext2/libext2fs.o fs/yaffs2/libyaffs2.o \
            fs/ubifs/libubifs.o
        LIBS += net/libnet.o
        LIBS += disk/libdisk.o
        LIBS += drivers/bios_emulator/libatibiosemu.o
        LIBS += drivers/block/libblock.o
        ......(省略N多驱动)
        LIBS += common/libcommon.o
        LIBS += lib/libfdt/libfdt.o
        LIBS += api/libapi.o
        LIBS += post/libpost.o
        ......
        ifeq ($(SOC),s5pc1xx)
        LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
        endif
        ifeq ($(SOC),exynos)
        LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
        endif
        $(LIBS):    depend $(SUBDIR_TOOLS)
                $(MAKE) -C $(dir $(subst $(obj),,$@))
    

    虽然繁琐,但不复杂,就是编译N多个lib,分别进入其源目录执行make -C。
    需要指出的是,LIBS += $(CPUDIR)/$(SOC)/lib$(SOC).o,即CPU目录的子目录是作为lib在此编译的,在编译start.o时并没有编译。
    这样大部分的编译工作就完成了,CPU的初始化,板子的初始化,再到包含很多驱动的LIBS。
    接下来就该链接了吧。
    f. $(LDSCRIPT)

        # If there is no specified link script, we look in a number of places for it
        ifndef LDSCRIPT
            ifeq ($(CONFIG_NAND_U_BOOT),y)
                LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
                ifeq ($(wildcard $(LDSCRIPT)),)
                    LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot-nand.lds
                endif
            endif
            ifeq ($(wildcard $(LDSCRIPT)),)
                LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
            endif
            ifeq ($(wildcard $(LDSCRIPT)),)
                LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot.lds
            endif
            ifeq ($(wildcard $(LDSCRIPT)),)
                LDSCRIPT := $(TOPDIR)/arch/$(ARCH)/cpu/u-boot.lds
                # We don't expect a Makefile here
                LDSCRIPT_MAKEFILE_DIR =
            endif
            ifeq ($(wildcard $(LDSCRIPT)),)
        $(error could not find linker script)
            endif
        endif
        $(LDSCRIPT):    depend
                $(MAKE) -C $(dir $@) $(notdir $@)
    

    首先在N多个地方寻找链接脚本,找到之后,进入其目录执行make -Cg.$(obj)u-boot.lds
    执行了一条命令:

        $(obj)u-boot.lds: $(LDSCRIPT)
                $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
    

    将LDSCRIPT预处理下,然后生成$(obj)u-boot.ldsi.$(GEN_UBOOT)
    这个简单,是结束,也是开始吧,仅仅一个命令。

        ifeq ($(CONFIG_SANDBOX),y)
        GEN_UBOOT = \
                cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \
                    -Wl,--start-group $(__LIBS) -Wl,--end-group \
                    $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -o u-boot
        else
        GEN_UBOOT = \
                UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
                sed  -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
                cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) $$UNDEF_SYM $(__OBJS) \
                    --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
                    -Map u-boot.map -o u-boot
        endif
    

    因为编译已经完成,剩下的只是把编译出来的文件链接成u-boot。

    3.总结

    至此,U-Boot就编译完了。  呵呵,看起来总是比写起来简单,咱看人家写好的编译配置都这么麻烦,想来足见此工程之艰巨。  不管怎么说,还是让咱给大概看懂了。接下来就该是代码的事了吧,阅读代码,然后移植。。。

zynq petalinux编译系统启动文件实战应用 第一种是linaro,我移植过的版本linaro2010~linaro2016,它的交叉编译器是arm-xilinx-linux-gnueabi-,不支持在线编译,支持根文件系统和操作系统两种模式。6,打包:petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force。将系统烧入flash,有多种方式:串口,网口,JTAG下载器,SD卡,U盘等,只要填对FLAH地址或偏移地址,理论上都是可以的。 阅读详情

相关推荐

Linux学习系列四:Kernel编译下载.pdf

Linux学习系列四:Kernel编译下载.pdf

编译U-boot中出现hello_world.srec出错之对策

采用arm-linux-gcc 2.95.3 编译 u-boot 1.1.3 或者 u-boot 1.1.4出现如下错误提示:make[1]: *** No rule to make target `hello_world.srec, needed by `all.  Stop.make[1]: Leaving directory `/home/mort/src/targa/u-boot/

wiserstar的专栏 1253

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3755

U-boot Makefile 分析

1.make at91rm9200dk_config2.make all arm 以上两步是编译u-boot的步骤。第一步是让make 生成相应的开发板配置。第二步是让make 生成开发板上所需的所有目标,以及开发cpu目标。 Makefile基本知识:# CURDIR这个变量是Makefile提供的,代表了make当前的工作路径。 现在先从第一步开始分析:

ruixj的专栏 3844

从零开始深入理解 AI Agent(完整版)

AI Agent(智能体)是一个能够自主感知环境、做出决策、执行行动并记忆经验的智能系统。特性传统程序AI Agent决策方式固定逻辑(if-else)动态推理(LLM 思考)灵活性需要重新编程自然语言描述即可能力边界明确限定可通过工具扩展学习能力无可通过记忆积累经验│ 感知 │ ───→ │ 推理 │ ───→ │ 行动 │↑ │ ││ ↓ ││ 记忆 │ ←─── │ 反思 │ ←─────────┘感知(Perception)

qq_20096229的博客 756

积木报表导出数据量太大报错

‌性能问题‌:‌当数据量非常大时,‌积木报表在导出过程中可能会遇到性能瓶颈,‌导致导出过程缓慢甚至失败。‌解决这一问题的方法包括优化SQL查询、‌调整分页大小、‌使用更适合处理大量数据的库(‌如阿里巴巴的EasyExcel)‌进行导出,‌或者采用异步处理的方式来避免接口超时1。‌内存溢出‌:‌如果报表工具或其依赖的库不支持流式(‌分批)‌导出,‌大量数据的处理可能会导致内存溢出。‌数据处理方式‌:‌如果待导出的数据包含特殊字符,‌如英文双引号或等号,‌这可能导致JSON反序列化报错。

Activiti工作流 1906

uboot_编译过程_2

2.3开始执行ALL #########################################################################   ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)   all:        $(ALL)   $(ob

soooooong的博客 359

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

u-boot编译连接分析

时间 :2016年4月3日09:24:04地点 :宿舍。功能 :u-boot编译连接阶段分析。(以smdk2410开发板为例) 在顶层目录下执行完"make smdk2410_config"命令后,就把u-boot给配置好了,接着就可以在执行"make all"或者"make"命令去编译u-boot了,完成后就可以烧写到开发板去运行了。(在Makefile中的all目标是第一个目标,因为Make...

weixin_33772645的博客 145

【sap2000】部分模型通过.s2k文件合并模型generating a global model through partial models by .s2k text file

现在需要通过选项File → Import → SAP2000 .s2k Text File → Add to existing model(如果使用其中一个部分模型作为基础)或New model(如果使用新文件)添加部分模型,并使用以下导入选项。模型A(阶段1/5) Model A (Phase 1/5)模型B(阶段2/5) Model B (Phase 2/5)模型C(阶段3/5) Model C (Phase 3/5)模型E(阶段5/5) Model E (Phase 5/5)

hmywillstronger的博客 1750

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规考试的试题解析,内容涵盖《个人信息保护法》相关规定。试卷包含单选题、多选题、判断题、简答题和案例分析题五种题型,总分100分,考试时间120分钟。试题重点考察个人信息处理的基本原则、敏感个人信息处理要求、合规审计流程、个人信息保护影响评估等内容。通过案例分析题详细解析了人脸识别登录、数据共享、跨境传输等场景下的合规要求。参考答案均严格依据《个人信息保护法》等法律法规,为个人信息处理活动提供了明确的合规指引。

qq_41525079的博客 850

【u-boot-2018.11】make工具之fixdep

1. 概述 fixdep工具的源码位于scripts/basic/fixdep.c中,代码本身并不复杂,但其作用是什么?哪里调用?如何调用?请看下面一一道来。 2. 哪里调用 直接在u-boot源码目录下搜索: 命令: grep -rnw fixdep . --exclude-dir=basic 结果: ./scripts/Makefile.build:270: ...

linuxweiyh的博客 4870

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1863

告别官方EVK:手把手教你为i.MX6ULL定制专属uboot(基于v2020.04版本)

本文详细指导如何为i.MX6ULL处理器定制专属uboot(基于v2020.04版本),涵盖硬件差异分析、源码框架解析、设备树深度定制及编译系统优化。通过实战案例和调试技巧,帮助开发者解决非官方开发板uboot移植中的常见问题,提升嵌入式开发效率。

weixin_30386713的博客 190

大数据Alluxio面试题及参考答案

Alluxio 在大数据生态里的定位是作为数据编排层,能在不同计算框架和存储系统之间起到桥梁的作用。它的核心功能在于加速数据访问,让大数据应用能够更高效地使用数据。Alluxio 把数据存储和数据处理分离开来,使计算框架可以在不考虑底层存储细节的情况下访问数据,这样就提高了系统的灵活性和可扩展性。Alluxio 和 HDFS 既存在关联又有区别。从关联方面来看,HDFS 是一种广泛使用的分布式文件系统,很多大数据应用都将其作为主要的数据存储系统。Alluxio 可以和 HDFS 集成,把 HDFS 当作底层

大模型大数据攻城狮的专栏 862

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Uboot源码目录分析

u-boot.bin.cmd里面定义了一个变量:cmd_u-boot.bin,此变量的值为cp u-boot-nodtb.bin u-boot.bin,也就是拷贝一份u-boot-nodtb.bin,并重命名为u-boot.bin。uboot在编译的时候会将同一个目录中所有.c文件便已在一起,并命名为built-in.o,相当于将总多的.c文件对应的.o文件集合在一起,这个就是u-boot文件的来源。.u-boot-nodtb.bin.cmd就是用于生成u-boot.nodtb.bin 的。

Caramel_biscuit的博客 1611

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android2.2的移植

Android2.2的移植的详细步骤 一、  安卓系统的组成 a.  应用层 b.  应用程序框架 c.  库和运行环境 d.  内核 e.  硬件 二、  移植的主要步骤  1)安装sunJDK 开发环境:ubuntu 10.04 32位 a.  卸载系统中的open JDK 为了标准我们先把系统中的openJDK卸载掉,把从网上下载的jdk-1_5_0_22-linux-

longguopeng168的专栏 2656

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

避坑指南:IMX6ULL移植U-Boot时遇到的5个典型错误及解决方案(网络超时、FDT修复等)

本文深度解析了在NXP IMX6ULL开发板上移植U-Boot时常见的5个典型错误及解决方案,包括网络PHY自协商超时、FDT修复失败等关键问题。针对每个错误,提供了从硬件原理到软件配置的详细修复方法,帮助开发者高效完成U-Boot移植工作。文章特别强调了设备树修改和网络环境配置等易错环节,是IMX6ULL开发者的实用避坑指南。

weixin_30463341的博客 714

【imx6ULL uboot源码编译与分析 make xxx_defconfig部分】

学习原子哥的教程,所做的笔记。

qq_51384120的博客 1309

从零构建:U-Boot编译系统背后的自动化魔法

本文深入解析U-Boot编译系统的自动化构建流程,从defconfig配置到二进制镜像生成的全过程。详细介绍了Kconfig配置架构、Makefile条件编译机制以及fixdep依赖追踪工具链,帮助开发者掌握嵌入式系统启动代码的工业级构建方法,提升硬件适配和编译效率。

weixin_29189987的博客 296

U-Boot 编译系统深度解析:从 `make menuconfig` 到 `u-boot.bin`

本文基于U-Boot 2020.04源码,以LED驱动为例解析其五层编译系统架构:1)Kconfig配置层实现条件裁剪;2)决议层将.config转换为auto.conf等格式;3)递归Makefile.build实现模块化编译;4)链接层;5)最终镜像生成。核心设计通过Kconfig定义硬件依赖关系,配合递归Makefile实现源码复用,使同一套代码支持数千种硬件平台。文章详细剖析了Kconfig语法、配置文件的转换过程(auto.conf/autoconf.mk/config.h)及其在编译流程中的作用

qq_41870170的博客 415

U-Boot分析【学习笔记】(5)

本篇文章介绍了 Make 工具工作时各个文件之间的关系,梳理了编译流程

kdxiaojie的博客 666

U-Boot分析【学习笔记】(3)

本文介绍了U-Boot 裁剪与定制的核心逻辑,读者看此文章可初步理解 U-Boot 的工作原理

kdxiaojie的博客 734

Tiny6410 U-boot移植

前言 最近手头上的活松活了下来,趁着有闲工夫先自己又复习了一下一些基础知识,顺便深入了解了一下一些调试技巧,例如栈回溯的原理。想了想部门正在热火朝天的搞Android和Linux移植工作,又看了看我那吃灰已久的ARM 11开发板,也正好拿出来搞一搞。手头上的ARM 11的开发板是友善之臂的Tiny6410系列,当初读大三买来捣鼓了一学期,系统移植方面的东西初略接触了一点,算是入了个门吧。其实也就...

胧霖的博客 659

U-Boot分析【学习笔记】(10)

本文深入拆解了 U-Boot 启动流程中承上启下的核心枢纽 —— _main 函数的第一阶段执行逻辑。文章以 i.MX6ULL(ARMv7-A 架构)为例,详细分析了系统如何从芯片级汇编(start.S)无缝过渡到 ARM 通用架构库(crt0.S)的物理全景。

kdxiaojie的博客 756

U-Boot 移植(2)

本文详细记录了基于 NXP i.MX6ULL 芯片的 U-Boot(2017.03版本)自定义单板解耦与移植全过程。文章从底层的 Kconfig 配置机制出发,深入剖析了 U-Boot 图形化配置系统的依赖链条。通过在顶层 arch/arm/cpu/armv7/mx6/Kconfig 中注册全新的单板宏符号 TARGET_MX6ULL_KD 并打通路径检索,实现了从原厂 EVK 评估板向自定义开发板的完整技术解耦。

kdxiaojie的博客 374
上一篇: 版本管理的选择——Git
下一篇: 一切,从头开始
穷游的兔子
博客等级 码龄17年 17粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值