uboot源码——根目录下的Makefile文件分析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

uboot来源于uboot官网,或者SoC官方(研发s5pv210这款芯片的公司推出的开发板叫SMDKV210),或者具体开发板的官方(深圳市九鼎科技公司推出的、基于s5pv210芯片的X210开发板)。本文以x210开发板为例,详细分析uboot配置及编译阶段的流程。

uboot的主要目录与文件

主要文件包括:/mkconfig,/Makefile,/config.mk

主要文件夹有:board,cpu,common、include

board文件夹中每个子文件夹表示一个开发板,cpu文件夹中每个子文件夹都是一个SoC系列。

uboot的配置与编译的步骤

(1)将源码解压在适当的目录下。

(2)配置,即在uboot的根目录下执行“make x210_sd_config”。

(3)编译,即在uboot的根目录下执行“make”(或者“make -s”,表示静默编译)。

uboot的配置与编译的流程

下图是配置及编译阶段代码执行的具体流程。

 对uboot主目录下的Makefile文件进行分析

(1)uboot的版本号。(24~29行)

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
  • 这四个变量的含义依次为:主版本号、次版本号、再次版本号、附加的版本信息(值为空,可以给用户使用)。
  • U-Boot_VERSION,这个变量的值为真正的uboot版本号,易知其值为1.3.4。
  • VERSION_FILE,这个变量的值是一个.h文件,注意=是并行赋值的意思,类似于Verilog语言中的<=。要注意:=(可以理解为串行赋值)和=的区别。$(obj)这个变量是在后面定义并赋值的,其值是编译输出路径。
  • version_autogenerated.h这个文件是在make之后自动生成的,文件内容是一条宏,这条宏给将其他.c文件提供uboot的版本号。

(2)确定主机信息然后导出。(31~43行)

HOSTARCH := $(shell uname -m | \sed -e s/i.86/i386/ \-e s/sun4u/sparc64/ \-e s/arm.*/arm/ \-e s/sa110/arm/ \-e s/powerpc/ppc/ \-e s/ppc64/ppc/ \-e s/macppc/ppc/)
  • HOSTARCH、HOSTOS分别表示主机的CPU架构和操作系统。
  • makefile的函数调用与变量调用很类似,格式是$( function arguments),其实上面一大段的意思是变量HOSTARCH的值是一个函数的返回值。
  • shell是makefile中的一个函数,$(shell XXX)会被解析成执行shell命令XXX;此处是执行了一条 uname -m |sed -e ……,符号 \是makefile的换行符。
  • 其中,|是shell语法中的管道结构,例如:XXX | YYY ,表达式XXX 的输出将作为表达式YYY的输入,YYY的输出才是整句表达式的输出。
  • uname -m 指令将输出负责编译的主机cpu架构,比如ixx86;sed -e是替换命令,比如把ixx86替换为i386。
  • 由此可见这个HOSTARCH变量的值是负责编译的主机cpu架构。大部分情况下我们得到的都是i386。
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \sed -e 's/\(cygwin\).*/cygwin/')export	HOSTARCH HOSTOS
  • 这个HOSTOS变量和上一句HOSTARCH变量的原理类似,管道第一部分uname -s会得到负责编译的主机的OS,比如Linux。
  • 管道第二部分是将大写转换成小写。
  • 管道第三部分的意思是如果前面一个部分得到了cygwin系统,则格式要转换一下。不必深究,因为cygwin基本没人用……
  • 由此可见这个HOSTOS变量的值是负责编译的主机操作系统。大部分情况下我们得到的都是linux。
  • 导出两个变量到全局,使其为环境变量,让其他的文件也可以使用架构和系统信息。

(3)实现静默编译功能。(49~54行)

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
  • 这整段是为了实现make的静默选项功能。其中,findstring一个函数,$(findstrings, $ (MAKEFLAGS))功能是从$(MAKEFLAGS)中找出字符‘s’。
  • $(MAKEFLAGS)是make的flag(选项),如果在控制台中输入“make -s”,则$(MAKEFLAGS)的值为‘s’。
  • 如果$(findstring $(MAKEFLAGS))没找到‘s’,这个表达式的值为空,则ifeq()为真,即make时无需静默。
  • 无需静默的实现方法是令变量XECHO值为关键字echo,因为makefile中每次需要打印都会使用XECHO,而不是直接使用echo本身。
  • 静默make的实现方法是令变量XECHO值为空,当makefile需要打印时会调用XECHO,由于其为空,故无法打印make信息。
  • 注:编译工具链的信息是永远打印的,和make的静默选项无关。

(4)设置各种路径。(78~123行)

  • makefile支持“单独外部路径编译”,它的原理和keil把.o、.l、.bin、.a等中间文件放在单独的文件夹内的原理相同,都是为了使源码更简洁明了,防止被中间文件污染;以及为了同时维护多个配置编译方式。
  • 有两种方式实现“单独外部路径编译”。方法一:例如在控制台中输入“make O=输出目录路径” ,将输出文件夹的路径作为参数。方法二:在Makefile中导出环境变量,即“export BUILD_DIR=输出目录路径”。
  • 方法一的优先级高,会覆盖方法二;而且方法一必须每次输入make时都要输入参数(不论是make clean还是make config 的时候),格式如“make O=输出目录 disclean”。
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endififneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
  • 上面这段是方法一的具体实现。如果make时输入参数“O=输出目录”,那么makefile会认为定义了变量O,于是乎这段代码会开始执行。
  • 其中,$(origin O)中origin是函数名,$(origin O)的功能是返回变量O的来源;由此可知,如果O的来源是控制台命令,则变量BUILD_DIR的值就是变量O的值。
  • 然后进行一个判断,如果变量BUILD_DIR不为空,则变量saved-output的值为BUILD_DIR,即saved-output的值也是输出目录的路径。
# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
  • 上面这句是shell语法中简写的if表达式,其作用是当输出文件夹路径不存在时就创建它。
  • 其中包含两个表达式,表达式1||表达式2。当表达式1为真时,表达式2不会被解释器执行,因为总结果一定为真,(尽管总的结果没有意义)。唯有表达式1为假时,解释器才会去执行表达式2,这样就能用逻辑表达式来实现if语句的功能了。
  • 表达式1中,方括号是固定用法,是为了突出里面表达式是判断语句。-d是shell中判断路径是否存在的符号,如果路径存在则为表达式1为真;如果路径不存在,表达式1为假,解释器会执行表达式2,即创建输出文件夹路径。
# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
  • 这几句代码是确保输出文件夹路径创建成功。&&的功能是连续执行两句语句,当cd $(BUILD_DIR)执行完后,执行/bin/pwd,即打印当前路径。
  • $(if xxx,yyy,zzz)是makefile的判断函数,如果xxx为真,则执行yyy并返回值,否则执行zzz并返回值。由此可知如果未成功创建BUILD_DIR,就会输出错误打印信息。
OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE
  • 这段代码是设置并导出了很多和路径有关的环境变量。
  • 如果BUILD_DIR不为空,OBJTREE(放产生的.o文件)的值就为BUILD_DIR,如果为空,则OBJTREE的值就为CURDIR(即current direction,当前源码所在的目录)。
  • SRCTREE的值为当前源码所在目录,TOPDIR的值为SRCTREE的值即当前源码所在目录,LNDIR(应该是放链接产生的文件)的值和OBJTREE相同。
MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG
  • 将变量MKCONFIG的值设置为当前源码目录下的mkconfig文件,并导出为环境变量。
  • 这个shell脚本文件是正式make之前的配置脚本,十分重要。
ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD	:= 1
export REMOTE_BUILD
endif
  • 判断OBJTREE的值和SRCTREE的值是否不相等,即判断是否使用了“单独外部路径编译”,如果使用了这个功能,则REMOTE_BUILD值为1,并将其导出至全局。
# $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc.
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
  • 判断OBJTREE的值和SRCTREE的值是否不相等,即判断是否使用了“单独外部路径编译”功能,如果使用了这个功能, 则将obj的值赋为OBJTREE的值,将src的值赋为SRCTREE的值;反之则值都为空。最后将他们全部导出至全局。

(5)设置编译工具链。(126~185行)

ifeq ($(ARCH),powerpc)
ARCH = ppc
endififeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
  • 开头三句是powerpc架构的名称转换。
  • 最后一句$(wildcard xxx) ,参数xxx是一个文件名格式(可使用通配符),这个函数的返回值是一列和格式匹配且真实存在的文件的名称。但是这句应该没什么意义,因为连endif都没有。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC
  • config.mk这个文件是在配置过程创建的, 也就是“make x210_sd_config”(这个目标在2588行)时创建的。它会去执行/mkconfig脚本,而/mkconfig脚本将创建include/config.mk并将参数填充进去。
  • config.mk的内容分别定义了ARCH、CPU、BOARD、VENDOR、SOC这几个变量的值(这些值来自主Makefile第2589行的配置项里的传参)。
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110
  • 通过把config.mk文件包含进来,其内容将在本makefile中原地展开。
  • 主Makefile得到这几个变量值后,再将它们导出到环境变量。
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
#中间略去
ifeq ($(ARCH),sparc)
CROSS_COMPILE = sparc-elf-
endif	# sparc
endif	# HOSTARCH,ARCH
endif	# CROSS_COMPILEexport	CROSS_COMPILE
  • 这上面一整段是配置交叉编译工具链的前缀,即arm-none-linux-gnueabi- ,一旦确定了前缀,加上后缀就能定义在编译过程中用到的各种工具,如ar、gcc等;
  • 前缀的选择是通过前面获得的变量ARCH(目标cpu的架构)来判断的。
# load other configuration
include $(TOPDIR)/config.mk
  • 此处将/config.mk文件包含进来,它将在原地展开,继续对编译属性和链接属性进行设置。由于文件内容过多,另辟文章讨论,见博客:uboot源码——根目录下的config.mk文件分析_天糊土的博客-CSDN博客
  • 注意:此处的config.mk文件是源码自带的,与x210_sd_config生成的include/config.mk不同。

(6)设置规则。

OBJS  = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endifOBJS := $(addprefix $(obj),$(OBJS))
  • 这里将众多.o文件赋给了OBJS变量,这个变量会成为后面目标u-boot的依赖。
  • 其中用到了多次“+=”赋值符号,此赋值符号的含义其实是在变量原本的值后面在续上新的值,就是额外添加的意思。
LIBS  = lib_generic/libgeneric.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
ifeq ($(CPU),ixp)
LIBS += cpu/ixp/npe/libnpe.a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
#略去
LIBS += drivers/spi/libspi.a
ifeq ($(CPU),mpc83xx)
LIBS += drivers/qe/qe.a
endif
ifeq ($(CPU),mpc85xx)
LIBS += drivers/qe/qe.a
endif
LIBS += drivers/rtc/librtc.a
#略去LIBS := $(addprefix $(obj),$(LIBS))
.PHONY : $(LIBS) $(VERSION_FILE)LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))# Add GCC lib
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
  • 将众多.a库文件赋给了LIBS变量,以及将和板子有关的.a文件赋给了LIBBOARD变量,这两个变量会成为后面目标u-boot的依赖。
# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS	= tools \examples \api_examples.PHONY : $(SUBDIRS)ifeq ($(CONFIG_NAND_U_BOOT),y)
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endififeq ($(CONFIG_ONENAND_U_BOOT),y)
ONENAND_IPL = onenand_bl1
U_BOOT_ONENAND = $(obj)u-boot-onenand.bin
endif__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
  • 根据autoconf.mk中nand和onenand的CONFIG做了一个判断,是否使用相应的.bin文件。
ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
ifeq ($(ARCH),blackfin)
ALL += $(obj)u-boot.ldr
endifall:		$(ALL)
  • 本段出现了顶层makefile的第一条规则(即目标-依赖-操作),故默认情况下将以all这个变量作为最终目标。由于本条规则没有任何操作, 因此一旦把依赖(也就是$(ALL))实现了,整个makefile文件的最终目标就达成了。
  • 可以认为,本makefile的终极目标,其实是$(ALL)所代表的那些文件。
$(obj)u-boot.hex:	$(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@$(obj)u-boot.srec:	$(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@$(obj)u-boot.bin:	$(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@#略$(obj)System.map:	$(obj)u-boot@$(NM) $< | \grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \sort > $(obj)System.map
  • 这些都是为了产生最终文件的规则。
# Auto-generate the autoconf.mk file (which is included by all makefiles)
#
# This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.
# the dep file is only include in this top level makefile to determine when
# to regenerate the autoconf.mk file.
$(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h@$(XECHO) Generating $@ ; \set -e ; \: Generate the dependancies ; \$(CC) -x c -DDO_DEPS_ONLY -M $(HOST_CFLAGS) $(CPPFLAGS) \-MQ $(obj)include/autoconf.mk include/common.h > $@$(obj)include/autoconf.mk: $(obj)include/config.h@$(XECHO) Generating $@ ; \set -e ; \: Extract the config macros ; \$(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \sed -n -f tools/scripts/define2mk.sed > $@sinclude $(obj)include/autoconf.mk.dep
  • 本段的功能是根据include/configs/x210_sd.h来生成autoconf.mk,makefile利用这些autoconf.mk中的变量来指导编译过程的走向(条件编译)。

(7)设置与cpu相关的伪目标。

由于这些代码都与cpu本身有关,有2000多行,且功能重复,我们挑选板子上的s5pv210为例子来分析,这行代码大概位于2589行。

x210_sd_config :	unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
  • 本段代码主要负责编译之前的配置过程,即在控制台输入“make x210_sd_config”。其依赖是unconfig,此变量代表未配置的意思,通过这个方法,我们便可以多次配置。
  • MKCONFIG这个变量代表的是源码目录下最关键的一个shell文件即mkconfig,这个shell文件负责了make之前的配置过程。
  • 行首的@代表静默执行,这段代码在执行$(MKCONFIG)前,还把$(@:_config=)、arm、s5pc11x、x210、samsung、s5pc110这6个主要参数传给了mkconfig。
  • 其中参数$(@:_config=)是引用了一个替换函数,将该规则中的目标(用@表示)中的_config用空替换,故$(@:_config=)的值为“x210_sd”。
  • 最后把TEXT_BASE的值填充入config.mk文件,指定uboot的虚拟链接地址,完成所有配置工作。
  • 关于mkconfig文件,见博客uboot源码——根目录下的mkconfig文件分析_天糊土的博客-CSDN博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springside 参考地址

2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/wind520/article/details/8917944 http://blog.chinaunix.net/uid-122937-id-3935052.html 转载于:https://my.oschina.net/china008/blog/330265

虚拟机下安装vmtool

Ubuntu 12.04下安装VMware Tools 安装前准备&#xff1a; 1、一定要先安装 build-essential 软件,否则不能够顺利安装 命令&#xff1a;sudo apt-get install build-essential 2、要安装linux-headers 包&#xff0c;这个包要在配置VMware-tools之前装&#xff0c;即可…

认识伪类元素:before和:after

起因于不理解下图点的写法&#xff0c;后来发现是个很基础的东西 运用了伪类元素:before&#xff0c;如下 注意&#xff0c;他的css写法也是非常简洁高效的。 查阅了些关于伪类before和after的知识帮助理解&#xff0c;以下摘自&#xff1a;http://www.hulufei.com/post/about-…

uboot源码——内核启动分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、uboot作用简介 uboot的主要作用是用来启动linux内核。 CPU不能直接从块设备中执行代码&#xff0c;因此需要把块设备中的程序复制到内存中&#xff0c;而复制之前还需要进行很多初始化工作&…

票据单号生产软件

有个老师要做excel表格&#xff0c;里面要罗列某票据还是什么单号的编号&#xff0c;格式如上图所示。一开始她说能不能写个excel函数&#xff0c;一拖就搞定~我觉得很难搞出来&#xff0c;就写个软件&#xff0c;生产单号保存在TXT文件&#xff0c;然后让她复制粘贴到excel表就…

uboot源码——C阶段的start_armboot函数

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、start_armboot函数简介 uboot第一阶段&#xff0c;start.S文件中进行一系列的SoC内部硬件的初始化&#xff0c;然后长跳转到start_armboot 函数中。 uboot第二阶段&#xff0c;start_armboot函数…

source insight的使用方法

1、下载与安装 下载与安装方法见链接。 “Insight3.exe”这个是汉化版&#xff0c;直接打开&#xff0c;不需要安装。 “Si35Setup.exe”这个是英文版&#xff0c;安装后需要自己找到应用图标并发送快捷方式到桌面。 2、快速新建工程 &#xff08;1&#xff09;点击 Project —…

TortoiseSVN检出链接(可用于与站点集成)

为什么80%的码农都做不了架构师&#xff1f;>>> TortoiseSVN&#xff08;简称TSVN&#xff09; 是一个 Windows 下的版本控制系统 Apache™ Subversion 的客户端工具。 如果你希望你的 Subversion 版本库对于别人可用&#xff0c;你可以在你的站点包含一个链接。 为…

foreman架构的引入2-安装前环境准备

零基础学习Puppet自动化配置管理系列文档Foreman官网提供了每个版本非常完善的安装步骤&#xff0c;无论是源码安装还是rpm包安装都变得非常方便。而且Foreman通过puppet模块对安装步骤进行了封装并提供了大量的安装参数可以传输&#xff0c;相当的方便。不过由于其体系过大&am…

软件集成策略故事连载----对项目的不利影响竟然这么大

2&#xff0e;对项目的不利影响竟然这么大 项目经理老刘跟晓川说&#xff0c;等这一轮集成做完&#xff0c;一起聊一聊。晓川听了有点紧张。不过想一想&#xff0c;自己已经很努力了&#xff0c;也没有什么可担心的。其实关键是程序员提交的质量。倒正好可以借这个机会跟领导沟…

uboot源码——汇编阶段的start.S文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、总结 1、关于阶段的定义 第一阶段&#xff0c;即在内部SRAM运行的阶段&#xff0c;简单地理解为汇编阶段。此阶段主要涉及start.S文件&#xff0c;在cpu/s5pc11x/目录下。第一阶段以ldr pc _sta…

机器学习算法之旅

在理解了我们需要解决的机器学习问题之后&#xff0c;我们可以思考一下我们需要收集什么数据以及我们可以用什么算法。本文我们会过一遍最流行的机器学习算法&#xff0c;大致了解哪些方法可用&#xff0c;很有帮助。 机器学习领域有很多算法&#xff0c;然后每种算法又有很多延…

Android Handler的使用方法

如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人&#xff0c;在不知道Handler的用法之前是怎么样写的程序,代码如下所示: package com.example.androidhandletest; import java.util.Timer;import java.util.TimerTask; import android.os.Bundle;import andro…

windows 下查看进程占用

2019独角兽企业重金招聘Python工程师标准>>> //查找出占用8086端口进程的ID netstat -nao | findstr8086 //本机输出效果为: TCP 0.0.0.0:8086 0.0.0.0:0 LISTENING 804 //很显然&#xff0c;进程ID是804 //找出ID为804的进程名 …

MySQL数据库增删改查

常用的数据类型&#xff1a; int&#xff1a;整数类型&#xff0c;无符号的范围【0&#xff0c;2^32-1】&#xff0c;有符号【-2^31,2^31-1】 float&#xff1a;单精度浮点&#xff0c;4字节64位 double&#xff1a;双精度浮点&#xff0c;8字节64位 char&#xff1a;固定长…

chmod的理解

ll file 共有是十位第一位&#xff1a;如果是 - 表示它是文件第一位&#xff1a;如果是d 表示它是目录剩下的333 分别表示 属主u属组g其他用户o所以如下&#xff1a;转载于:https://blog.51cto.com/zlong37/1567472

中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题

最近写了很多文章&#xff0c;同时&#xff0c;也上传了很多免积分的FansUnion原创的优质资源&#xff0c;有兴趣的同学可以看来我的CSDN博客瞧瞧 http://blog.csdn.net/FansUnion。近期&#xff0c;收到了不少读者的评论、反馈、留言。对于其中的一些问题&#xff0c;我想专门…

第九周项目6-穷举法之年龄几何

张三、李四、王五、刘六的年龄成一等差数列&#xff0c;他们四人的年龄相加是26&#xff0c;相乘是880&#xff0c;求以他们的年龄为前4项的等差数列的前20项。 构建代码&#xff1a; /**Copyright (c) 2014,烟台大学计算机学院*All gight reserved.*文件名称&#xff1a;temp.…

JavaScript操作大全整理(思维导图七--字符串函数)

7. JavaScript 字符串函数 转载于:https://www.cnblogs.com/yuxia/p/3360824.html

进入shell的两种方法

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 方法一&#xff1a;在图形界面中打开终端 在图形界面下&#xff0c;进入 Shell 的方法是使用 Linux 桌面环境中的终端模拟包&#xff0c;也就是我们常说的终端&#xff0c;这样在图形桌…