資料介紹
本文通過整理之前研發(fā)的一個項目(ARM7TDMI +uCLinux),分析內(nèi)核啟動過程及需要修改的文件,以供內(nèi)核移植者參考。整理過程中也同時參考了眾多網(wǎng)友的帖子,在此謝過。由于整理過程匆忙,難免錯誤及講解的不夠清楚之處,請各位網(wǎng)友指正,這里提前謝過。本文分以下部分進行介紹:
1. Bootloader及內(nèi)核解壓
2. 內(nèi)核啟動方式介紹
3. 內(nèi)核啟動地址的確定
4. arch/armnommu/kernel/head-armv.S分析
5. start_kernel()函數(shù)分析
1. Bootloader及內(nèi)核解壓
Bootloader將內(nèi)核加載到內(nèi)存中,設(shè)定一些寄存器,然后將控制權(quán)交由內(nèi)核,該過程中,關(guān)閉MMU功能。通常,內(nèi)核都是以壓縮的方式存放,如zImage,這里有兩種解壓方法:
使用內(nèi)核自解壓程序。
arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S
arch/arm/boot/compressed/misc.c
在Bootloader中增加解壓功能。
使用該方法時內(nèi)核不需要帶有自解壓功能,而使用Bootloader中的解壓程序代替內(nèi)核自解壓程序。其工作過程與內(nèi)核自解壓過程相似:Bootloader把壓縮方式的內(nèi)核解壓到內(nèi)存中,然后跳轉(zhuǎn)到內(nèi)核入口處開始執(zhí)行。
2. 幾種內(nèi)核啟動方式介紹
XIP (EXECUTE IN PLACE) 是指直接從存放代碼的位置上啟動運行。
2.1 非壓縮,非XIP
非XIP方式是指在運行之前需對代碼進行重定位。該類型的內(nèi)核以非壓縮方式存放在Flash中,啟動時由Bootloader加載到內(nèi)存后運行。
2.2 非壓縮,XIP
該類型的內(nèi)核以非壓縮格式存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行。Data段復(fù)制和BSS段清零的工作由內(nèi)核自己完成。這種啟動方式常用于內(nèi)存空間有限的系統(tǒng)中,另外,程序在ROM/Flash中運行的速度相對較慢。
2.3 RAM自解壓
壓縮格式的內(nèi)核由開頭一段自解壓代碼和壓縮內(nèi)核數(shù)據(jù)組成,由于以壓縮格式存放,內(nèi)核只能以非XIP方式運行。RAM自解壓過程如下:壓縮內(nèi)核存放于ROM/Flash中,Bootloader啟動后加載到內(nèi)存中的臨時空間,然后跳轉(zhuǎn)到壓縮內(nèi)核入口地址執(zhí)行自解壓代碼,內(nèi)核被解壓到最終的目的地址然后運行。壓縮內(nèi)核所占據(jù)的臨時空間隨后被Linux回收利用。這種方式的內(nèi)核在嵌入式產(chǎn)品中較為常見。
2.4 ROM自解壓
解壓縮代碼也能夠以XIP的方式在ROM/Flash中運行。ROM自解壓過程如下:壓縮內(nèi)核存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行其自解壓代碼,將壓縮內(nèi)核解壓到最終的目的地址并運行。ROM自解壓方式存放的內(nèi)核解壓縮速度慢,而且也不能節(jié)省內(nèi)存空間。
3. 內(nèi)核啟動地址的確定
內(nèi)核自解壓方式
Head.S/head-XXX.S獲得內(nèi)核解壓后首地址ZREALADDR,然后解壓內(nèi)核,并把解壓后的內(nèi)核放在ZREALADDR的位置上,最后跳轉(zhuǎn)到ZREALADDR地址上,開始真正的內(nèi)核啟動。
arch/armnommu/boot/Makefile,定義ZRELADDR和ZTEXTADDR。ZTEXTADDR是自解壓代碼的起始地址,如果從內(nèi)存啟動內(nèi)核,設(shè)置為0即可,如果從Rom/Flash啟動,則設(shè)置ZTEXTADDR為相應(yīng)的值。ZRELADDR是內(nèi)核解壓縮后的執(zhí)行地址。
arch/armnommu/boot/compressed/vmlinux.ld,引用LOAD_ADDR和TEXT_START。
arch/armnommu/boot/compressed/Makefile, 通過如下一行:
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;
使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。
說明:
執(zhí)行完decompress_kernel函數(shù)后,代碼跳回head.S/head-XXX.S中,檢查解壓縮之后的kernel起始地址是否緊挨著kernel image。如果是,beqcall_kernel,執(zhí)行解壓后的kernel。如果解壓縮之后的kernel起始地址不是緊挨著kernelimage,則執(zhí)行relocate,將其拷貝到緊接著kernel image的地方,然后跳轉(zhuǎn),執(zhí)行解壓后的kernel。
Bootloader解壓方式
Bootloader把解壓后的內(nèi)核放在內(nèi)存的TEXTADDR位置上,然后跳轉(zhuǎn)到TEXTADDR位置上,開始內(nèi)核啟動。
arch/armnommu/Makefile,一般設(shè)置TEXTADDR為PAGE_OFF+0x8000,如定義為0x00008000, 0xC0008000等。
arch/armnommu/vmlinux.lds,引用TEXTADDR
4. arch/armnommu/kernel/head-armv.S
該文件是內(nèi)核最先執(zhí)行的一個文件,包括內(nèi)核入口ENTRY(stext)到start_kernel間的初始化代碼,主要作用是檢查CPUID,Architecture Type,初始化BSS等操作,并跳到start_kernel函數(shù)。在執(zhí)行前,處理器應(yīng)滿足以下狀態(tài):
r0 - should be 0
r1 - unique architecture number
MMU - off
I-cache - on or off
D-cache – off
/* 部分源代碼分析 */
/* 內(nèi)核入口點 */
ENTRY(stext)
/* 程序狀態(tài),禁止FIQ、IRQ,設(shè)定SVC模式 */
mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode
/* 置當前程序狀態(tài)寄存器 */
msr cpsr_c, r0 @ and all irqs disabled
/* 判斷CPU類型,查找運行的CPU ID值與Linux編譯支持的ID值是否支持 */
bl __lookup_processor_type
/* 跳到__error */
teq r10, #0 @ invalid processor?
moveq r0, #‘p’ @ yes, error ‘p’
beq __error
/* 判斷體系類型,查看R1寄存器的Architecture Type值是否支持 */
bl __lookup_architecture_type
/* 不支持,跳到出錯 */
teq r7, #0 @ invalid architecture?
moveq r0, #‘a(chǎn)’ @ yes, error ‘a(chǎn)’
beq __error
/* 創(chuàng)建核心頁表 */
bl __create_page_tables
adr lr, __ret @ return address
add pc, r10, #12 @ initialise processor
/* 跳轉(zhuǎn)到start_kernel函數(shù) */
b start_kernel
__lookup_processor_type這個函數(shù)根據(jù)芯片的ID從proc.info獲取proc_info_list結(jié)構(gòu),proc_info_list結(jié)構(gòu)定義在include/asm-armnommu/proginfo.h中,該結(jié)構(gòu)的數(shù)據(jù)定義在arch/armnommu/mm/proc-arm*.S文件中,ARM7TDMI系列芯片的proc_info_list數(shù)據(jù)定義在arch/armnommu/mm/proc-arm6,7.S文件中。函數(shù)__lookup_architecture_type從arch.info獲取machine_desc結(jié)構(gòu),machine_desc結(jié)構(gòu)定義在include/asm-armnommu/mach/arch.h中,針對不同arch的數(shù)據(jù)定義在arch/armnommu/mach-*/arch.c文件中。
在這里如果知道processor_type和architecture_type,可以直接對相應(yīng)寄存器進行賦值。
5. start_kernel()函數(shù)分析
下面對start_kernel()函數(shù)及其相關(guān)函數(shù)進行分析。
5.1 lock_kernel()
/* Getting the big kernel lock.
* This cannot happen asynchronously,
* so we only need to worry about other
* CPU‘s.
*/
extern __inline__ void lock_kernel(void)
{
if (!++current-》lock_depth)
spin_lock(&kernel_flag);
}
kernel_flag是一個內(nèi)核大自旋鎖,所有進程都通過這個大鎖來實現(xiàn)向內(nèi)核態(tài)的遷移。只有獲得這個大自旋鎖的處理器可以進入內(nèi)核,如中斷處理程序等。在任何一對lock_kernel/unlock_kernel函數(shù)里至多可以有一個程序占用CPU。進程的lock_depth成員初始化為-1,在kerenl/fork.c文件中設(shè)置。在它小于0時(恒為-1),進程不擁有內(nèi)核鎖;當大于或等于0時,進程得到內(nèi)核鎖。
5.2 setup_arch()
setup_arch()函數(shù)做體系相關(guān)的初始化工作,函數(shù)的定義在arch/armnommu/kernel/setup.c文件中,主要涉及下列主要函數(shù)及代碼。
5.2.1 setup_processor()
該函數(shù)主要通過
for (list = &__proc_info_begin; list 《 &__proc_info_end ; list++)
if ((processor_id & list-》cpu_mask) == list-》cpu_val)
break;
這樣一個循環(huán)來在.proc.info段中尋找匹配的processor_id,processor_id在head_armv.S文件
中設(shè)置。
5.2.2 setup_architecture(machine_arch_type)
該函數(shù)獲得體系結(jié)構(gòu)的信息,返回mach-xxx/arch.c 文件中定義的machine結(jié)構(gòu)體的指針,包含以下內(nèi)容:
MACHINE_START (xxx, “xxx”)
MAINTAINER (“xxx”)
BOOT_MEM (xxx, xxx, xxx)
FIXUP (xxx)
MAPIO (xxx)
INITIRQ (xxx)
MACHINE_END
5.2.3內(nèi)存設(shè)置代碼
if (meminfo.nr_banks == 0)
{
meminfo.nr_banks = 1;
meminfo.bank[0].start = PHYS_OFFSET;
meminfo.bank[0].size = MEM_SIZE;
}
meminfo結(jié)構(gòu)表明內(nèi)存情況,是對物理內(nèi)存結(jié)構(gòu)meminfo的默認初始化。nr_banks指定內(nèi)存塊的數(shù)量,bank指定每塊內(nèi)存的范圍,PHYS_OFFSET指定某塊內(nèi)存塊的開始地址,MEM_SIZE指定某塊內(nèi)存塊長度。PHYS_OFFSET和MEM_SIZE都定義在include/asm-armnommu/arch-XXX/memory.h文件中,其中PHYS_OFFSET是內(nèi)存的開始地址,MEM_SIZE就是內(nèi)存的結(jié)束地址。這個結(jié)構(gòu)在接下來內(nèi)存的初始化代碼中起重要作用。
1. Bootloader及內(nèi)核解壓
2. 內(nèi)核啟動方式介紹
3. 內(nèi)核啟動地址的確定
4. arch/armnommu/kernel/head-armv.S分析
5. start_kernel()函數(shù)分析
1. Bootloader及內(nèi)核解壓
Bootloader將內(nèi)核加載到內(nèi)存中,設(shè)定一些寄存器,然后將控制權(quán)交由內(nèi)核,該過程中,關(guān)閉MMU功能。通常,內(nèi)核都是以壓縮的方式存放,如zImage,這里有兩種解壓方法:
使用內(nèi)核自解壓程序。
arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S
arch/arm/boot/compressed/misc.c
在Bootloader中增加解壓功能。
使用該方法時內(nèi)核不需要帶有自解壓功能,而使用Bootloader中的解壓程序代替內(nèi)核自解壓程序。其工作過程與內(nèi)核自解壓過程相似:Bootloader把壓縮方式的內(nèi)核解壓到內(nèi)存中,然后跳轉(zhuǎn)到內(nèi)核入口處開始執(zhí)行。
2. 幾種內(nèi)核啟動方式介紹
XIP (EXECUTE IN PLACE) 是指直接從存放代碼的位置上啟動運行。
2.1 非壓縮,非XIP
非XIP方式是指在運行之前需對代碼進行重定位。該類型的內(nèi)核以非壓縮方式存放在Flash中,啟動時由Bootloader加載到內(nèi)存后運行。
2.2 非壓縮,XIP
該類型的內(nèi)核以非壓縮格式存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行。Data段復(fù)制和BSS段清零的工作由內(nèi)核自己完成。這種啟動方式常用于內(nèi)存空間有限的系統(tǒng)中,另外,程序在ROM/Flash中運行的速度相對較慢。
2.3 RAM自解壓
壓縮格式的內(nèi)核由開頭一段自解壓代碼和壓縮內(nèi)核數(shù)據(jù)組成,由于以壓縮格式存放,內(nèi)核只能以非XIP方式運行。RAM自解壓過程如下:壓縮內(nèi)核存放于ROM/Flash中,Bootloader啟動后加載到內(nèi)存中的臨時空間,然后跳轉(zhuǎn)到壓縮內(nèi)核入口地址執(zhí)行自解壓代碼,內(nèi)核被解壓到最終的目的地址然后運行。壓縮內(nèi)核所占據(jù)的臨時空間隨后被Linux回收利用。這種方式的內(nèi)核在嵌入式產(chǎn)品中較為常見。
2.4 ROM自解壓
解壓縮代碼也能夠以XIP的方式在ROM/Flash中運行。ROM自解壓過程如下:壓縮內(nèi)核存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行其自解壓代碼,將壓縮內(nèi)核解壓到最終的目的地址并運行。ROM自解壓方式存放的內(nèi)核解壓縮速度慢,而且也不能節(jié)省內(nèi)存空間。
3. 內(nèi)核啟動地址的確定
內(nèi)核自解壓方式
Head.S/head-XXX.S獲得內(nèi)核解壓后首地址ZREALADDR,然后解壓內(nèi)核,并把解壓后的內(nèi)核放在ZREALADDR的位置上,最后跳轉(zhuǎn)到ZREALADDR地址上,開始真正的內(nèi)核啟動。
arch/armnommu/boot/Makefile,定義ZRELADDR和ZTEXTADDR。ZTEXTADDR是自解壓代碼的起始地址,如果從內(nèi)存啟動內(nèi)核,設(shè)置為0即可,如果從Rom/Flash啟動,則設(shè)置ZTEXTADDR為相應(yīng)的值。ZRELADDR是內(nèi)核解壓縮后的執(zhí)行地址。
arch/armnommu/boot/compressed/vmlinux.ld,引用LOAD_ADDR和TEXT_START。
arch/armnommu/boot/compressed/Makefile, 通過如下一行:
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;
使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。
說明:
執(zhí)行完decompress_kernel函數(shù)后,代碼跳回head.S/head-XXX.S中,檢查解壓縮之后的kernel起始地址是否緊挨著kernel image。如果是,beqcall_kernel,執(zhí)行解壓后的kernel。如果解壓縮之后的kernel起始地址不是緊挨著kernelimage,則執(zhí)行relocate,將其拷貝到緊接著kernel image的地方,然后跳轉(zhuǎn),執(zhí)行解壓后的kernel。
Bootloader解壓方式
Bootloader把解壓后的內(nèi)核放在內(nèi)存的TEXTADDR位置上,然后跳轉(zhuǎn)到TEXTADDR位置上,開始內(nèi)核啟動。
arch/armnommu/Makefile,一般設(shè)置TEXTADDR為PAGE_OFF+0x8000,如定義為0x00008000, 0xC0008000等。
arch/armnommu/vmlinux.lds,引用TEXTADDR
4. arch/armnommu/kernel/head-armv.S
該文件是內(nèi)核最先執(zhí)行的一個文件,包括內(nèi)核入口ENTRY(stext)到start_kernel間的初始化代碼,主要作用是檢查CPUID,Architecture Type,初始化BSS等操作,并跳到start_kernel函數(shù)。在執(zhí)行前,處理器應(yīng)滿足以下狀態(tài):
r0 - should be 0
r1 - unique architecture number
MMU - off
I-cache - on or off
D-cache – off
/* 部分源代碼分析 */
/* 內(nèi)核入口點 */
ENTRY(stext)
/* 程序狀態(tài),禁止FIQ、IRQ,設(shè)定SVC模式 */
mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode
/* 置當前程序狀態(tài)寄存器 */
msr cpsr_c, r0 @ and all irqs disabled
/* 判斷CPU類型,查找運行的CPU ID值與Linux編譯支持的ID值是否支持 */
bl __lookup_processor_type
/* 跳到__error */
teq r10, #0 @ invalid processor?
moveq r0, #‘p’ @ yes, error ‘p’
beq __error
/* 判斷體系類型,查看R1寄存器的Architecture Type值是否支持 */
bl __lookup_architecture_type
/* 不支持,跳到出錯 */
teq r7, #0 @ invalid architecture?
moveq r0, #‘a(chǎn)’ @ yes, error ‘a(chǎn)’
beq __error
/* 創(chuàng)建核心頁表 */
bl __create_page_tables
adr lr, __ret @ return address
add pc, r10, #12 @ initialise processor
/* 跳轉(zhuǎn)到start_kernel函數(shù) */
b start_kernel
__lookup_processor_type這個函數(shù)根據(jù)芯片的ID從proc.info獲取proc_info_list結(jié)構(gòu),proc_info_list結(jié)構(gòu)定義在include/asm-armnommu/proginfo.h中,該結(jié)構(gòu)的數(shù)據(jù)定義在arch/armnommu/mm/proc-arm*.S文件中,ARM7TDMI系列芯片的proc_info_list數(shù)據(jù)定義在arch/armnommu/mm/proc-arm6,7.S文件中。函數(shù)__lookup_architecture_type從arch.info獲取machine_desc結(jié)構(gòu),machine_desc結(jié)構(gòu)定義在include/asm-armnommu/mach/arch.h中,針對不同arch的數(shù)據(jù)定義在arch/armnommu/mach-*/arch.c文件中。
在這里如果知道processor_type和architecture_type,可以直接對相應(yīng)寄存器進行賦值。
5. start_kernel()函數(shù)分析
下面對start_kernel()函數(shù)及其相關(guān)函數(shù)進行分析。
5.1 lock_kernel()
/* Getting the big kernel lock.
* This cannot happen asynchronously,
* so we only need to worry about other
* CPU‘s.
*/
extern __inline__ void lock_kernel(void)
{
if (!++current-》lock_depth)
spin_lock(&kernel_flag);
}
kernel_flag是一個內(nèi)核大自旋鎖,所有進程都通過這個大鎖來實現(xiàn)向內(nèi)核態(tài)的遷移。只有獲得這個大自旋鎖的處理器可以進入內(nèi)核,如中斷處理程序等。在任何一對lock_kernel/unlock_kernel函數(shù)里至多可以有一個程序占用CPU。進程的lock_depth成員初始化為-1,在kerenl/fork.c文件中設(shè)置。在它小于0時(恒為-1),進程不擁有內(nèi)核鎖;當大于或等于0時,進程得到內(nèi)核鎖。
5.2 setup_arch()
setup_arch()函數(shù)做體系相關(guān)的初始化工作,函數(shù)的定義在arch/armnommu/kernel/setup.c文件中,主要涉及下列主要函數(shù)及代碼。
5.2.1 setup_processor()
該函數(shù)主要通過
for (list = &__proc_info_begin; list 《 &__proc_info_end ; list++)
if ((processor_id & list-》cpu_mask) == list-》cpu_val)
break;
這樣一個循環(huán)來在.proc.info段中尋找匹配的processor_id,processor_id在head_armv.S文件
中設(shè)置。
5.2.2 setup_architecture(machine_arch_type)
該函數(shù)獲得體系結(jié)構(gòu)的信息,返回mach-xxx/arch.c 文件中定義的machine結(jié)構(gòu)體的指針,包含以下內(nèi)容:
MACHINE_START (xxx, “xxx”)
MAINTAINER (“xxx”)
BOOT_MEM (xxx, xxx, xxx)
FIXUP (xxx)
MAPIO (xxx)
INITIRQ (xxx)
MACHINE_END
5.2.3內(nèi)存設(shè)置代碼
if (meminfo.nr_banks == 0)
{
meminfo.nr_banks = 1;
meminfo.bank[0].start = PHYS_OFFSET;
meminfo.bank[0].size = MEM_SIZE;
}
meminfo結(jié)構(gòu)表明內(nèi)存情況,是對物理內(nèi)存結(jié)構(gòu)meminfo的默認初始化。nr_banks指定內(nèi)存塊的數(shù)量,bank指定每塊內(nèi)存的范圍,PHYS_OFFSET指定某塊內(nèi)存塊的開始地址,MEM_SIZE指定某塊內(nèi)存塊長度。PHYS_OFFSET和MEM_SIZE都定義在include/asm-armnommu/arch-XXX/memory.h文件中,其中PHYS_OFFSET是內(nèi)存的開始地址,MEM_SIZE就是內(nèi)存的結(jié)束地址。這個結(jié)構(gòu)在接下來內(nèi)存的初始化代碼中起重要作用。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- RT-Thread文檔_內(nèi)核移植
- 嵌入式Linux系統(tǒng)移植(Linux內(nèi)核配置)
- Armlinux內(nèi)核移植及系統(tǒng)初始化過程分析 11次下載
- 如何實現(xiàn)Linux內(nèi)核移植和yaffs2根文件系統(tǒng)制作 9次下載
- Google Android的操作系統(tǒng)內(nèi)核編譯圖文教程 10次下載
- Linux內(nèi)核的源代碼漫游詳細資料說明 15次下載
- 解析MLD自動化操作系統(tǒng)移植降低 Linux 成本 17次下載
- 怎樣去讀Linux內(nèi)核源代碼 13次下載
- 基于DSP的嵌入式Linux內(nèi)核移植的研究與實現(xiàn)_王曉東 1次下載
- 嵌入式Linux內(nèi)核移植詳解(頂嵌) 19次下載
- 嵌入式Linux在s3c2440上的移植研究 67次下載
- HHARM9200移植2.6內(nèi)核移植文檔
- Linux-2.6.25移植
- 嵌入式Linux2.6在S3C2410上的移植技術(shù)探析
- 嵌入式Linux系統(tǒng)開發(fā)基礎(chǔ)
- Linux內(nèi)核內(nèi)存管理架構(gòu)解析 539次閱讀
- 獲取Linux內(nèi)核源碼的方法 514次閱讀
- 嵌入式Linux移植與系統(tǒng)啟動解讀 1214次閱讀
- Linux系統(tǒng)內(nèi)核與Linux發(fā)行套件的區(qū)別 1092次閱讀
- U-Boot介紹 3597次閱讀
- Linux:QEMU調(diào)試內(nèi)核的步驟 3040次閱讀
- 深入linux內(nèi)核架構(gòu) Linux內(nèi)核架構(gòu)分析解讀 3604次閱讀
- Linux 5.4.1內(nèi)核已經(jīng)發(fā)布你期待使用嗎 3193次閱讀
- 基于嵌入式Linux內(nèi)核的ARM9運行實現(xiàn)方式介紹 1475次閱讀
- Linux內(nèi)核與Android的關(guān)系 4504次閱讀
- 基于嵌入式Linux內(nèi)核的系統(tǒng)設(shè)備驅(qū)動程序開發(fā)設(shè)計 1113次閱讀
- Linux內(nèi)核地址映射模型與Linux內(nèi)核高端內(nèi)存詳解 3397次閱讀
- ARMSYS開發(fā)板上的uClinux內(nèi)核移植 910次閱讀
- PowerPC平臺Linux的移植(二) 1194次閱讀
- Linux內(nèi)核開發(fā)工具介紹 4641次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關(guān)電源基礎(chǔ)知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發(fā)板設(shè)計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多