5414|4

1098

帖子

0

TA的资源

至上芯片

楼主
 

linux2.6内核Makefile详解 [复制链接]

熟悉内核的Makefile对开发设备驱动、理解内核代码结构都是非常重要的linux2.6内核Makefile的许多特性和2.4内核差别很大,在内核目录的documention/kbuild/makefiles.txt中有详细的说明。给大家一个中文版的翻译=== 目录        === 1 概述    === 2 用户与作用        === 3 Kbuild文件       --- 3.1 目标定义          --- 3.2 编译进内核 - obj-y       --- 3.3 编译可装载模块 - obj-m       --- 3.4 输出的符号       --- 3.5 目标库文件 - lib-y       --- 3.6 递归躺下访问目录       --- 3.7 编辑标志           --- 3.8 命令行的依赖关系(原文中没有写:-))        --- 3.9 跟踪依赖       --- 3.10 特殊规则       --- 3.11 $(CC) 支持的函数    === 4 本机程序支持       --- 4.1 简单的本机程序       --- 4.2 复合的本机程序       --- 4.3 定义共享库       --- 4.4 使用用C++编写的本机程序       --- 4.5 控制本机程序的编译选项       --- 4.6 编译主机程序时       --- 4.7 使用 hostprogs-$(CONFIG_FOO)        === 5 Kbuild清理    === 6 架构Makefile       --- 6.1 调整针对某一具体架构生成的镜像       --- 6.2 将所需文件加到 archprepare 中       --- 6.3 递归下向时要访问的目录列表       --- 6.4 具体架构的启动镜像       --- 6.5 构造非Kbuild目标       --- 6.6 构建启动镜像的命令       --- 6.7 Kbuild自定义命令       --- 6.8 联接器预处理脚本    === 7 Kbuild 变量    === 8 Makefile语言    === 9 关于作者    === 10 TODO=== 1 概述Linux内核的Makefile分为5个部分:              Makefile                 顶层Makefile     .config                  内核配置文件     arch/$(ARCH)/Makefile    具体架构的Makefile     scripts/Makefile.*       通用的规则等。面向所有的Kbuild Makefiles。     kbuild Makefiles         内核源代码中大约有500个这样的文件顶层Makefile阅读的.config文件,而该文件是由内核配置程序生成的。顶层Makefile负责制作:vmlinux(内核文件)与模块(任何模块文件)。制作的过程主要是通过递归向下访问子目录的形式完成。并根据内核配置文件确定访问哪些子目录。顶层Makefile要原封不动的包含一具体架构的Makefile,其名字类似于 arch/$(ARCH)/Makefile。该架构Makefile向顶层Makefile提供其架构的特别信息。每一个子目录都有一个Kbuild Makefile文件,用来执行从其上层目录传递下来的命令。Kbuild Makefile从.config文件中提取信息,生成Kbuild完成内核编译所需的文件列表。scripts/Makefile.*包含了所有的定义、规则等信息。这些文件被用来编译基于kbuildMakefile的内核。(**有点不通**)=== 2 用户与作用可以将人们与内核Makefile的关系分成4类。*使用者* 编译内核的人。他们只是键入"make menuconfig"或"make"这样的命令。一般情况下是不会读或编辑任何内核Makefile(或者任何的源文件)。*普通开发人员* 这是一群工作在内核某一功能上的人,比如:驱动开发,文件系统或网络协议。他们所需要维护的只是他们所工作的子系统的Kbuild Makefile。为了提高工作的效率,他们也需要对内核Makefile有一个全面的认识,并且要熟悉Kbuild的接口。*架构开发人员* 这是一些工作在具体架构,比如sparc 或者ia64,上面的人。架构开发者需要在熟悉kbuild Makefile的同时,也要熟悉他所工作架构的Makefile。*Kbuild开发者* 维护Kbuild系统的人。他们需要知晓内核Makefile的方方面面。该文件是为普通开发人员与架构开发人员所写。

最新回复

很乱, 不过还是要谢谢!!  详情 回复 发表于 2008-8-3 23:06
点赞 关注

回复
举报

1098

帖子

0

TA的资源

至上芯片

沙发
 

linux2.6内核Makefile详解

=== 3 Kbuild文件大部分内核中的Makefile都是使用Kbuild组织结构的Kbuild Makefile。这章介绍了Kbuild Makefile的语法。Kbuild文件倾向于"Makefile"这个名字,"Kbuild"也是可以用的。但如果"Makefile""Kbuild"同时出现的话,使用的将会是"Kbuild"文件。3.1节 目标定义是一个快速介绍,以后的几章会提供更详细的内容以及实例。--- 3.1 目标定义        目标定义是Kbuild Makefile的主要部分,也是核心部分。主要是定义了要编    译的文件,所有的选项,以及到哪些子目录去执行递归操作。        最简单的Kbuild makefile 只包含一行:        例子:          obj-y += foo.o        该例子告诉Kbuild在这目录里,有一个名为foo.o的目标文件。foo.o将从foo.c    或foo.S文件编译得到。        如果foo.o要编译成一模块,那就要用obj-m了。所采用的形式如下:        例子:          obj-$(CONFIG_FOO) += foo.o        $(CONFIG_FOO)可以为y(编译进内核) 或m(编译成模块)。如果CONFIG_FOO不是y    和m,那么该文件就不会被编译联接了。--- 3.2 编译进内核 - obj-y        Kbuild Makefile 规定所有编译进内核的目标文件都存在$(obj-y)列表中。而    这些列表依赖内核的配置。        Kbuild编译所有的$(obj-y)文件。然后,调用"$(LD) -r"将它们合并到一个    build-in.o文件中。稍后,该build-in.o会被其父Makefile联接进vmlinux中。        $(obj-y)中的文件是有顺序的。列表中有重复项是可以的:当第一个文件被联    接到built-in.o中后,其余文件就被忽略了。        联接也是有顺序的,那是因为有些函数(module_init()/__initcall)将会在启    动时按照他们出现的顺序进行调用。所以,记住改变联接的顺序可能改变你    SCSI控制器的检测顺序,从而导致你的硬盘数据损害。        例子:          #drivers/isdn/i4l/Makefile          # Makefile for the kernel ISDN subsystem and device drivers.          # Each configuration option enables a list of files.          obj-$(CONFIG_ISDN)        += isdn.o          obj-$(CONFIG_ISDN_PPP_BSDCOMP)    += isdn_bsdcomp.o--- 3.3 编译可装载模块 - obj-m        $(obj-m) 列举出了哪些文件要编译成可装载模块。        一个模块可以由一个文件或多个文件编译而成。如果是一个源文件,Kbuild    Makefile只需简单的将其加到$(obj-m)中去就可以了。        例子:          #drivers/isdn/i4l/Makefile          obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o        注意:此例中 $(CONFIG_ISDN_PPP_BSDCOMP) 的值为'm'        如果内核模块是由多个源文件编译而成,那你就要采用上面那个例子一样的    方法去声明你所要编译的模块。        Kbuild需要知道你所编译的模块是基于哪些文件,所以你需要通过变量    $(-objs)来告诉它。        例子:          #drivers/isdn/i4l/Makefile          obj-$(CONFIG_ISDN) += isdn.o          isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o        在这个例子中,模块名将是isdn.o,Kbuild将编译在$(isdn-objs)中列出的    所有文件,然后使用"$(LD) -r"生成isdn.o。        Kbuild能够识别用于组成目标文件的后缀-objs和后缀-y。这就让Kbuild    Makefile可以通过使用 CONFIG_ 符号来判断该对象是否是用来组合对象的。        例子:          #fs/ext2/Makefile          obj-$(CONFIG_EXT2_FS)        += ext2.o          ext2-y                 := balloc.o bitmap.o          ext2-$(CONFIG_EXT2_FS_XATTR)    += xattr.o        在这个例子中,如果 $(CONFIG_EXT2_FS_XATTR) 是 'y',xattr.o将是复合    对象 ext2.o的一部分。        注意:当然,当你要将其编译进内核时,上面的语法同样适用。所以,如果    你的 CONFIG_EXT2_FS=y,那Kbuild会按你所期望的那样,生成 ext2.o文件    ,然后将其联接到 built-in.o中。--- 3.4 输出的符号          在Makefile中,没有对模块输出的符号有特殊要求。--- 3.5 目标库文件 - lib-y        在 obj-* 中所列文件是用来编译模块或者是联接到特定目录中的 built-in.o    。同样,也可以列出一些将被包含在lib.a库中的文件。    在 lib-y 中所列出的文件用来组成该目录下的一个库文件。        在 obj-y 与 lib-y 中同时列出的文件,因为都是可以访问的,所以该文件是    不会被包含在库文件中的。    同样的情况, lib-m 中的文件就要包含在 lib.a 库文件中。        注意,一个Kbuild makefile可以同时列出要编译进内核的文件与要编译成库    的文件。所以,在一个目录里可以同时存在 built-in.o 与 lib.a 两个文件。        例子:          #arch/i386/lib/Makefile          lib-y    := chechsum.o delay.o        这将由 checksum.o 和delay.o 两个文件创建一个库文件 lib.a。为了让    Kbuild 真正认识到这里要有一个库文件 lib.a 要创建,其所在的目录要加    到 libs-y 列表中。    还可参考"6.3 递归下向时要访问的目录列表"    lib-y 使用一般限制在 lib/ 和 arch/*/lib 中。--- 3.6 递归向下访问目录        一个Makefile只对编译所在目录的对象负责。在子目录中的文件的编译要由    其所在的子目录的Makefile来管理。只要你让Kbuild知道它应该递归操作,    那么该系统就会在其子目录中自动的调用 make 递归操作。            这就是 obj-y 和 obj-m 的作用。    ext2 被放的一个单独的目录下,在fs目录下的Makefile会告诉Kbuild使用    下面的赋值进行向下递归操作。        例子:          #fs/Makefile          obj-$(CONFIG_EXT2_FS) += ext2/        如果 CONFIG_EXT2_FS 被设置为 'y'(编译进内核)或是'm'(编译成模块),相    应的 obj- 变量就会被设置,并且Kbuild就会递归向下访问 ext2 目录。    Kbuild只是用这些信息来决定它是否需要访问该目录,而具体怎么编译由该目    录中的Makefile来决定。    将 CONFIG_ 变量设置成目录名是一个好的编程习惯。这让Kbuild在完全忽略那    些相应的 CONFIG_ 值不是'y'和'm'的目录。
 
 

回复

1098

帖子

0

TA的资源

至上芯片

板凳
 

linux2.6内核Makefile详解

--- 3.7 编辑标志    EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS    所有的 EXTRA_ 变量只在所定义的Kbuild Makefile中起作用。EXTRA_ 变量可    以在Kbuild Makefile中所有命令中使用。    $(EXTRA_CFLAGS) 是用 $(CC) 编译C源文件时的选项。    例子:          # drivers/sound/emu10kl/Makefile          EXTRA_CFLAGS += -I$(obj)          ifdef DEBUG              EXTRA_CFLAGS += -DEMU10KL_DEBUG          endif    该变量是必须的,因为顶层Makefile拥有变量 $(CFLAGS) 并用来作为整个源    代码树的编译选项。    $(EXTRA_AFLAGS) 也是一个针对每个目录的选项,只不过它是用来编译汇编    源代码的。    例子:        #arch/x86_64/kernel/Makefile        EXTRA_AFLAGS := -traditional    $(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)分别与 $(LD)和 $(AR)类似,只不    过,他们是针对每个目录的。    例子:        #arch/m68k/fpsp040/Makefile        EXTRA_LDFLAGS := -x    CFLAGS_$@, AFLSGA_$@    CFLAGS_$@ 和 AFLAGS_$@ 只能在当前Kbuild Makefile中的命令中使用。    $(CFLAGS_$@) 是 $(CC) 针对每个文件的选项。$@ 表明了具体操作的文件。    例子:        # drivers/scsi/Makefile        CFLAGS_aha152x.o =  -DAHA152X_STAT -DAUTOCONF        CFLAGS_gdth.o    =  # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \                      -DGDTH_STATISTICS        CFLAGS_seagate.o =  -DARBITRATE -DPARITY -DSEAGATE_USE_ASM    以上三行分别设置了aha152x.o,gdth.o 和 seagate.o的编辑选项。    $(AFLAGS_$@) 也类似,只不是是针对汇编语言的。    例子:        # arch/arm/kernel/Makefile        AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional        AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional--- 3.9 跟踪依赖    Kbuild 跟踪在以下方面依赖:    1) 所有要参与编译的文件(所有的.c 和.h文件)    2) 在参与编译文件中所要使用的 CONFIG_ 选项    3) 用于编译目标的命令行    因此,如果你改变了 $(CC) 的选项,所有受影响的文件都要重新编译。--- 3.10 特殊规则    特殊规则就是那Kbuild架构不能提供所要求的支持时,所使用的规则。一个    典型的例子就是在构建过程中生成的头文件。    另一个例子就是那些需要采用特殊规则来准备启动镜像。    特殊规则的写法与普通Make规则一样。    Kbuild并不在Makefile所在的目录执行,所以所有的特殊规则都要提供参与    编译的文件和目标文件的相对路径。    在定义特殊规则时,要使用以下两个变量:    $(src)    $(src) 表明Makefile所在目录的相对路径。经常在定位源代码树中的文件时    ,使用该变量。    $(obj)    $(obj) 表明目标文件所要存储目录的相对路径。经常在定位所生成的文件时    ,使用该变量。    例子:        #drivers/scsi/Makefile        $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl            $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl    这就是一个特殊规则,遵守着make所要求的普通语法。    目标文件依赖于两个源文件。用$(obj)来定位目标文件,用$(src)来定位源文    件(因为它们不是我们生成的文件)。--- 3.11 $(CC) 支持的函数    内核可能由多个不同版本的$(CC)编译,而每个版本都支持一不同的功能集与    选项集。Kbuild提供了检查 $(CC) 可用选项的基本功能。$(CC)一般情况下是    gcc编译器,但也可以使用其它编译器来代替gcc。    as-option    as-option,当编译汇编文件(*.S)时,用来检查 $(CC) 是否支持特定选项。如    果第一个选项不支持的话,可选的第二个选项可以用来指定。    例子:        #arch/sh/Makefile        cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),)    在上面的例子里,如果 $(CC) 支持选项 -Wa$(comma)-isa=$(isa-y),    cflags-y就会被赋予该值。    第二个参数是可选的,当第一个参数不支持时,就会使用该值。    ld-option    ld-option,当联接目标文件时,用来检查 $(CC) 是否支持特定选项。如果第    一个选项不支持的话,可选的第二个选项可以用来指定。    例子:        #arch/i386/kernel/Makefile        vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv)    在上面的例子中,如果 $(CC)支持选项 -Wl$(comma)--hash-style=sysv,    ld-option就会被赋予该值。    第二个参数是可选的,当第一个参数不支持时,就会使用该值。    cc-option    cc-option,用来检查 $(CC) 是否支持特定选项,并且不支持使用可选的第二    项。    例子:        #arch/i386/Makefile        cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586)    在上面的例子中,如果 $(CC)支持选项 -march=pentium-mmx,cc-option就    会被赋予该值,否则就赋 -march-i586。    cc-option的第二个参数是可选的。如果忽略的话,当第一个选项不支持时,    cflags-y 不会被赋值。    cc-option-yn        cc-option-yn,用来检查 gcc 是否支持特定选项,返回'y'支持,否则为'n'。    例子:        #arch/ppc/Makefile        biarch  := $(call cc-option-yn, -m32)        aflags-$(biarch) += -a32        cflags-$(biarch) += -m32    在上面的例子里,当 $(CC) 支持 -m32选项时,$(biarch)设置为y。当     $(biarch) 为y时,扩展的 $(aflags-y) 和 $(cflags-y)变量就会被赋值为    -a32 和 -m32。    cc-option-align    gcc版本大于3.0时,改变了函数,循环等用来声明内存对齐的选项。当用到    对齐选项时,$(cc-option-align) 用来选择正确的前缀:    gcc < 3.00        cc-option-align = -malign    gcc >= 3.00        cc-option-align = -falign    例子:        CFLAGS += $(cc-option-align)-functions=4    在上面的例子中,选项 -falign-funcions=4 被用在gcc >= 3.00的时候。对    于小于3.00时, 使用 -malign-funcions=4 。    cc-version    cc-version以数学形式返回 $(CC) 编译器的版本号。    其格式是:,二者都是数学。比如,gcc 3.41 会返回 0341。    当某版本的 $(CC) 在某方面有缺陷时,cc-version就会很有用。比如,选项    -mregparm=3 虽然会被gcc接受,但其实现是有问题的。    例子:        #arch/i386/Makefile        cflags-y += $(shell \        if [ $(call cc-version) -ge 0300 ] ; then \            echo "-meregparm=3"; fi ;)    在上面的例子中,-mregparm=3只会在gcc的版本号大于等于3.0的时候使用。    cc-ifversion    cc-ifversion测试 $(CC) 的版本号,如果版本表达式为真,就赋值为最后的    参数。    例子:        #fs/reiserfs/Makefile        EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1)    在这个例子中,如果 $(CC) 的版本小于4.2,EXTRA_CFLAGS就被赋值 -O1。    cc-ifversion 可使用所有的shell 操作符:-eq,-ne,-lt,-le,-gt,和-ge。    第三个参数可以像上面例子一样是个文本,但也可以是个扩展的变量或宏。/*这段翻译的不好*/=== 4 本机程序支持Kbuild 支持编译那些将在编译阶段使用的可执行文件。为了使用该可执行文件,要将编译分成二个阶段。第一阶段是告诉Kbuild存在哪些可执行文件。这是通过变量 hostprogs-y来完成的。第二阶段是添加一个对可执行文件的显性依赖。有两种方法:增加依赖关系到一个规则中,或是利用变量 $(always)。以下是详细叙述.
 
 
 

回复

1098

帖子

0

TA的资源

至上芯片

4
 

linux2.6内核Makefile详解

--- 4.1 简单的本机程序    在编译内核时,有时会需要编译并运行一个程序。    下面这行就告诉了kbuild,程序bin2hex应该在本机上编译。    例子:        hostprogs-y := bin2hex    在上面的例子中,Kbuild假设bin2hex是由一个与其在同一目录下,名为     bin2hex.c 的C语言源文件编译而成的。--- 4.2 复合的本机程序    本机程序可以由多个文件编译而成。    所使用的语法与内核的相应语法很相似。    $(-objs) 列出了联接成最后的可执行文件所需的所有目标文件。    例子:        #scripts/lxdialog/Makefile        hostprogs-y    := lxdialog        lxdialog-objs    := checklist.o lxdialog.o    扩展名为.o的文件是从相应的.c文件编译而来的。在上面的例子中,    checklist.c 编译成了checklist.o,lxdialog.c编译成了lxdialog.o。    最后,两个.o文件联接成了一可执行文件,lxdialog。    注意:语法 -y不是只能用来生成本机程序。--- 4.3 定义共享库    扩展名为so的文件称为共享库,被编译成位置无关对象。    Kbuild也支持共享库,但共享库的使用很有限。    在下面的例子中,libconfig.so共享库用来联接到可执行文件 conf中。    例子:        #scripts/kconfig/Makefile        hostprogs-y    := conf        conf-objs    := conf.o libkconfig.so        libkcofig-objs    := expr.o type.o    共享库文件经常要求一个相应的 -objs,在上面的例子中,共享库libkconfig    是由 expr.o 和 type.o两个文件组成的。    expr.o 和 type.o 将被编译成位置无关码,然后联接成共享库文件     libkconfig.so。C++并不支持共享库。--- 4.4 使用用C++编写的本机程序    kbuild也支持用C++编写的本机程序。在此专门介绍是为了支持kconfig,并且    在一般情况下不推荐使用。    例子:        #scripts/kconfig/Makefile        hostprogs-y    := qconf        qconf-cxxobjs    := qconf.o    在上面的例子中,可执行文件是由C++文件 qconf.cc编译而成的,由    $(qconf-cxxobjs)来标识。    如果qconf是由.c和.cc一起编译的,那么就需要专门来标识这些文件了。    例子:        #scripts/kconfig/Makefile        hostprogs-y    := qconf        qconf-cxxobjs    := qconf.o        qconf-objs    := check.o--- 4.5 控制本机程序的编译选项    当编译本机程序时,有可能使用到特殊选项。程序经常是利用$(HOSTCC)编译    ,其选项在 $(HOSTCFLAGS)变量中。    可通过使用变量 HOST_EXTRACFLAGS,影响所有在Makefile文件中要创建的    主机程序。    例子:        #scripts/lxdialog/Makefile        HOST_EXTRACFLAGS += -I/usr/include/ncurses    为一单个文件设置选项,可按形式进行:    例子:        #arch/ppc64/boot/Makefile        HOSTCFLAGS_pinggyback.o    := -DKERNELBASE=$(KERNELBASE)    同样也可以给联接器声明一特殊选项。    例子:        #scripts/kconfig/Makefile        HOSTLOADLIBES_qconf    := -L$(QTDIR)/lib    当联接qconf时,将会向联接器传递附加选项 "-L$(QTDIR)/lib"。--- 4.6 编译主机程序时    Kbuild只在需要时编译主机程序。    有两种方法:    (1) 在一具体的规则中显性列出所需要的文件    例子:        #drivers/pci/Makefile        hostprogs-y := gen-devlist        $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist            ( cd $(obj); ./gen-devlist ) < $<    目标 $(obj)/devlist.h 是不会在 $(obj)/gen-devlist 更新之前编译的。注意    在该规则中所有有关主机程序的命令必须以$(obj)开头。    (2) 使用 $(always)    当Makefile要编译主机程序,但没有适合的规则时,使用 $(always)。    例子:        #scripts/lxdialog/Makefile        hostprogs-y    := lxdialog        always        := $(hostprogs-y)    这就是告诉Kbuild,即使没有在规则中声明,也要编译 lxdialog。--- 4.7 使用 hostprogs-$(CONFIG_FOO)    一个典型的Kbuild模式如下:    例子:        #scripts/Makefile        hostprogs-$(CONFIG_KALLSYMS) += kallsyms    Kbuild 知道 'y' 是编译进内核,而 'm' 是编译成模块。所以,如果配置符号    是'm',Kbuild仍然会编译它。换句话说,Kbuild处理 hostprogs-m 与           hostprogs-y 的方式是完全一致的。只是,如果不用 CONFIG,最好用     hostprogs-y。=== 5 Kbuild清理(clean)"make clean"删除几乎所有的在编译内核时生成的文件,包括了主机程序在内。Kbuild 通过列表 $(hostprogs-y),$(hostprogs-m),$(always),$(extra-y) 和$(targets) 知道所要编译的目标。这些目标文件都会被 "make clean" 删除。另外,在"make clean"还会删除匹配 "*.[oas]","*.ko" 的文件,以及由 Kbuild生成的辅助文件。辅助文件由 Kbuild Makefile 中的 $(clean-files) 指明。    例子:        #drivers/pci/Makefile        clean-files  := devlist.h classlist.h当执行 "make clean" 时,"devlist.h classlist.h"这两个文件将被删除。如果不使用绝对路径(路径以'/'开头)的话,Kbuild假设所要删除的文件与Makefile在同一个相对路径上。要删除一目录:    例子:        #scripts/package/Makefile        clean-dirs := $(objtree)/debian/这就会删除目录 debian,包括其所有的子目录。如果不使用绝对路径(路径以'/'开头)的话,Kbuild假设所要删除的目录与Makefile在同一个相对路径上。一般情况下,Kbuild会根据 "obj-* := dir/" 递归访问其子目录,但有的时候,Kbuild架构还不足以描述所有的情况时,还要显式的指明所要访问的子目录。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

5
 
很乱, 不过还是要谢谢!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表