




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《嵌入式操作系統(tǒng)》實驗報告《嵌入式操作系統(tǒng)》試驗報告
班級計算機(jī)
學(xué)號
姓名
指導(dǎo)老師莊旭菲
工業(yè)高校信息工程學(xué)院計算機(jī)系
2024年6月
試驗一Linux核移植與編譯試驗
1.試驗?zāi)康?/p>
?了解Linux核相關(guān)學(xué)問與核結(jié)構(gòu)
?了解Linux核在ARM設(shè)備上移植的基本步驟和方法
?把握Linux核裁剪與定制的基本方法
2.試驗容
?分析Linux核的基本結(jié)構(gòu),了解Linux核在ARM設(shè)備上移植的一些基本步驟及常識。
?學(xué)習(xí)Linux核裁剪定制的基本配置方法,利用UP-Magic210型設(shè)備配套Linux核進(jìn)行
自定義功能(如helloworld顯示)的添加,并重新編譯核源碼,生成核壓縮文件zImage,下載到UP-Magic210型設(shè)備中測試。
3.試驗步驟
試驗名目:/UP-Magic210/SRC/kernel/linux-/
編譯核:在宿主機(jī)端為UP-Magic210設(shè)備的Linux核編寫簡潔的測試驅(qū)動(核)程序helloworld.c并修改核名目中相關(guān)文件,添加對測試驅(qū)動程序的支持。
(1)、使用vim編輯器手動編寫試驗代碼helloworld.c
helloworld.c如如下:
#include
#include
MODULE_LICENSE("DualBSD/GPL");
//驅(qū)動程序入口函數(shù)
staticinthello_init(void)
{
printk(KERN_ALERT"##############Hello,world############\n");
return0;
}
//驅(qū)動程序出口函數(shù)
staticvoidhello_exit(void)
{
printk(KERN_ALERT"###############Goodbye,world#########\n");
}
module_init(hello_init);
module_exit(hello_exit);
有關(guān)驅(qū)動程序的編寫規(guī),請參考課程教材,本試驗只在編寫簡潔的驅(qū)動(核)程序并加入到Linux核名目樹中,使用戶熟識編譯核的過程。該驅(qū)動程序是向終端輸出相關(guān)程序信息。編寫好helloworld.c后將其拷貝到核源碼樹的drivers/char/名目下。
#cphelloworld.c/UP-Magic210/SRC/kernel/linux-/drivers/char/(2)、進(jìn)入試驗核源碼名目修改driver/char/名目下的Kconfig文件,根據(jù)Kconfig語法添加helloworld程序的菜單支持
#cdUP-Magic210/SRC/kernel/linux-/
#vidrivers/char/Kconfig
例如:在Kconfig文件中的source“driver/char/hw_random/Kconfig”下面添加如下:source“driver/char/hw_random/Kconfig”
configHELLO_MODULE
bool"HelloWorldTest"
dependsonCPU_S5PV210
help
ThisisademototestkernelexperimentOnUP-Magic210.
(3)、進(jìn)入試驗核源碼名目修改driver/char/名目下的Makefile文件,根據(jù)核中Makefile語法添加helloworld程序的編譯支持
#vidrivers/char/Makefile
在Makefile中(大約在91行)添加如下一行
obj-$(CONFIG_TOSHIBA)+=toshiba.o
obj-$(CONFIG_I8K)+=i8k.o
obj-$(CONFIG_DS1620)+=ds1620.o
obj-$(CONFIG_HW_RANDOM)+=hw_random/
obj-$(CONFIG_HELLO_MODULE)+=helloworld.o
obj-$(CONFIG_PPDEV)+=ppdev.o
(4)、運行makemenuconfig配置核對helloworld程序的支持:
#makedistclean
#makemenuconfig
先加載核配置單,如圖:
然后進(jìn)入到DeviceDrivers--->菜單中如圖:
進(jìn)入到Characterdevices--->如圖:
進(jìn)入該菜單會發(fā)覺HelloWorldTest選項,按下空格將其靜態(tài)編譯進(jìn)核
退出保存核配置
(5)、重新編譯核
在核源碼的頂層名目下編譯核
#make
scripts/kconfig/conf-sarch/arm/Kconfig
CHKinclude/linux/version.h
CHKinclude/generated/utsrelease.h
make:“include/generated/mach-types.h”是最新的。
CALLscripts/checksyscalls.sh
CHKinclude/generated/pile.h
CCdrivers/char/helloworld.o
LDdrivers/char/built-in.o
LDdrivers/built-in.o
LDvmlinux.o
MODPOSTvmlinux.o
初次編譯核源碼,由核代碼浩大,所需較長時間(大約幾分鐘至10幾分鐘不等)。編譯勝利后會在核源碼名目的arch/arm/boot/名目下生成核壓縮文件zImage。
#lsarch/arm/boot/zImage
arch/arm/boot/zImage
#
(6)、將新生成的核鏡像文件zImage燒寫到UP-Magic210型設(shè)備中,這里不在贅述(燒寫步驟可以參考文檔“UP-Magic210出廠程序燒寫手冊(LINUX)V1.0.pdf”第23頁)。新核燒寫勝利后啟動UP-Magic210型系統(tǒng),可以在串口終端中查看到Linux核在啟動過程中打印出來的如下信息:
S3C_LCDclockgotenabled::133.000Mhz
Window-FB1:map_video_memory:clearff600000:00096000
FB1:map_video_memory:dma=57100000cpu=ff600000size=00096000
Console:switchingtocolourframebufferdevice80x30
fb-1069494052:framebufferdevice
###################Hello,world###################
ppdev:user-spaceparallelportdriver
s3c-uart.0:ttySAC0atMMIO0x7f005000(irq=37)isaS3C
s3c-uart.1:ttySAC1atMMIO0x7f005400(irq=38)isaS3C
s3c-uart.2:ttySAC2atMMIO0x7f005800(irq=39)isaS3C
RAMDISKdriverinitialized:16RAMdisksof4096Ksize1024blocksize
loop:loaded(max8devices)
nbd:registereddeviceatmajor43
dm9000EthernetDriver
eth0:dm9000atc7866000,c7866002IRQ78MAC:00:22:12:34:56:90
S3CIrDAdriver,(c)2024SamsungElectronics
Linuxvideocaptureinterface:v2.00
可以看到在終端上打印出###################Hello,world###################信息。同樣進(jìn)入ARM系統(tǒng)后也可以通過dmesg命令查看核啟動信息。
#dmesg
S3C_LCDclockgotenabled::133.000Mhz
Window-FB1:map_video_memory:clearff600000:00096000
FB1:map_video_memory:dma=57100000cpu=ff600000size=00096000
Console:switchingtocolourframebufferdevice80x30
fb-1069494052:framebufferdevice
###################Hello,world###################ppdev:user-spaceparallelportdriver
s3c-uart.0:ttySAC0atMMIO0x7f005000(irq=37)isaS3C
s3c-uart.1:ttySAC1atMMIO0x7f005400(irq=38)isaS3C
s3c-uart.2:ttySAC2atMMIO0x7f005800(irq=39)isaS3CRAMDISKdriverinitialized:16RAMdisksof4096Ksize1024blocksize4.試驗結(jié)果
思索:如何能在Linux系統(tǒng)啟動時,輸出顯示自定義的文本信息,請修改Linux核啟動代碼,完成此功能。
5.試驗中遇到的問題及解決方法
在試驗中遇到一些問題,例如在復(fù)制的時候我記得原來用cp–a/tmp/linux-2.4.18-br.tar.gz就可以了,可這次不行必需要用cp–a/tmp/linux-2.4.18-br.tar.gz./到自己的名目下。不過最終都順當(dāng)解決了問題,在編譯復(fù)習(xí)了makemenuconfig的編譯配置。
試驗二根文件系統(tǒng)試驗
1.試驗?zāi)康?/p>
?了解UP-Magic210魔法師試驗套件Linux系統(tǒng)下根文件系統(tǒng)結(jié)構(gòu)
?把握根文件系統(tǒng)的搭建過程
?把握busybox、mkcramfs等工具的使用方法
2.試驗容
?使用busybox生成文件系統(tǒng)中的命令部分,使用mkcramfs工具制作CRAMFS格式的
根文件系統(tǒng)。
?分析根文件系統(tǒng)etc名目下重要配置文件的格式及語法,熟識根文件系統(tǒng)的啟動過程3.試驗步驟
試驗名目:/UP-Magic210/SRC/kernel/linux-/
/UP-Magic210/SRC/rootfs/
一、在核中添加文件系統(tǒng)類型支持
(1)、進(jìn)入宿主機(jī)中UP-Magic210型光盤核名目:
#cd/UP-Magic210/SRC/kernel/linux-/(2)、運行makemenuconfig命令配置核文件系統(tǒng)相關(guān)支持添加對CRAMFS根文件以及YAFFS2文件系統(tǒng)系統(tǒng)支持
進(jìn)入Filesystems--->菜單
進(jìn)入Miscellaneousfilesystems--->菜單
選擇CompressedROMfilesystemsupport(cramfs)支持,如圖:
選擇YAFFS2filesystemsupport支持,配置如下圖
退出保存核配置
運行make編譯核,重新燒寫核。
二、根文件系統(tǒng)的實現(xiàn)
(1)、制作BUSYBOX工具集
進(jìn)入本次試驗名目
#cd/UP-Magic210/SRC/rootfs/
#ls
bash-4.0.tar.bz2busybox-1.19.3.tar.bz2rootfs
解壓busybox-1.19.3.tar.bz2壓縮包
#tarxjvfbusybox-1.19.3.tar.bz2
產(chǎn)生busybox-1.19.3名目
#ls
bash-4.0.tar.bz2busybox-1.19.3busybox-1.19.3.tar.bz2rootfs
進(jìn)入busybox-1.19.3名目進(jìn)行busybox的修改及配置
修改此名目的Makefile文件,更改ARCH?和CROSS_PILE?=宏定義,如下:CROSS_PILE?=arm-none-linux-gnueabi-
ARCH?=arm
退出保存。
運行makemenuconfig對工具集進(jìn)行定制
#makemenuconfig
進(jìn)入BusyboxSettings--->選項
進(jìn)入BusyboxLibraryTuning--->選項
選中Fancyshellprompts支持
進(jìn)入MiscellaneousUtilities--->選項
去除inotifyd選項
接下來的配置可以依據(jù)詳細(xì)狀況來設(shè)置或裁剪相關(guān)工具。退出保存設(shè)置。
編譯busybox
#make
安裝busybox
#makeinstall
勝利后會在當(dāng)前名目下生成_install名目,編譯的工具也都集成在該安裝名目下。
#cd_install/
#ls
binlinuxrcsbinusr
#
可以看到_install名目下生成了根文件系統(tǒng)常用的命令及工具,接下來的工作,用戶可以依據(jù)需要將_install名目下生成的命令拷貝到根文件系統(tǒng)相應(yīng)名目下。
例如:將從busybox生成的which命令拷貝到根文件系統(tǒng)名目的usr/bin名目下,這樣,我們的根文件系統(tǒng)就支持which命令了。
(2)、制作CRAMFS根文件系統(tǒng)鏡像
試驗中已經(jīng)供應(yīng)了mkcramfs制作工具以及mkrootfs.sh腳本文件,用戶只需執(zhí)行mkrootfs.sh腳本文件來使用mkcramfs制作根文件系統(tǒng)鏡像即可。
當(dāng)然也可以手動的執(zhí)行命令:./mkcramfsrootfs_up210rootfs_up210.cramfs
#./mkrootfs.sh
此時在當(dāng)前名目下生成根文件系統(tǒng)鏡像文件rootfs_up210.cramfs
#ls
mkcramfsmkrootfs.shrootfs_up210rootfs_up210.cramfs
三、燒寫根文件系統(tǒng)
將新生成的根文件系統(tǒng)鏡像文件rootfs_up210.cramfs燒寫到UP-Magic210型設(shè)備中進(jìn)行測試,這里不在贅述(燒寫步驟可以參考文檔“UP-Magic210出廠程序燒寫手冊
(LINUX)V1.0.pdf”第24頁)。假如用戶新添加了相關(guān)命令或工具(例如which命令)啟動系統(tǒng)后可以驗證用戶添加入的新命令或工具。
4.試驗結(jié)果
5.試驗中遇到的問題及解決方法
make編譯有錯誤,進(jìn)行源代碼的修改。之后再makemenuconfig中將這個宏對應(yīng)的東西配置成沒有就好了,假如沒有這個宏,那么就直接用出錯的那個文件的名字找就行了,找到后給它去掉,將來make的時候就不會編譯這個文件了,在次進(jìn)行make編譯后,編譯出來了busybox這個東西,就在證明編譯通過了。
試驗三模塊方式驅(qū)動試驗
1.試驗?zāi)康?/p>
學(xué)習(xí)在LINUX下進(jìn)行驅(qū)動設(shè)計的原理
?把握使用模塊方式進(jìn)行驅(qū)動開發(fā)調(diào)試的過程
2.試驗容
?在PC機(jī)上編寫簡潔的虛擬硬件驅(qū)動程序并進(jìn)行調(diào)試,試驗驅(qū)動的各個接口函數(shù)的實
現(xiàn),分析并理解驅(qū)動與應(yīng)用程序的交互過程。
?在ARM設(shè)備上創(chuàng)建設(shè)備驅(qū)動節(jié)點,編寫用戶空間應(yīng)用程序,對驅(qū)動程序進(jìn)行測試。
3.試驗步驟
(1)、編譯驅(qū)動程序/UP-Magic210/SRC/exp/driver/01_demo/demo.c,手工加載驅(qū)動程序,通過設(shè)備號建立驅(qū)動設(shè)備節(jié)點,執(zhí)行應(yīng)用程序測試該驅(qū)動及設(shè)備,分析驅(qū)動程序demo.c。
進(jìn)入試驗名目編譯源程序
#cd/UP-Magic210/SRC/exp/driver/01_demo/
清除中間代碼,重新編譯
#makeclean
#make
當(dāng)前名目下生成驅(qū)動程序demo.ko和應(yīng)用測試程序test_demo。
啟動UP-Magic210試驗系統(tǒng),連好網(wǎng)線、串口線。通過串口終端掛載宿主機(jī)試驗名目(留意:虛擬機(jī)IP地址需要設(shè)置為:57)。
#mount-tnfs-onolock57:/UP-Magic210/mnt/nfs
進(jìn)入串口終端的NFS共享試驗名目
#cd/mnt/nfs/SRC/exp/driver/01_demo/
手動加載驅(qū)動程序demo.ko
#insmoddemo.ko
通過設(shè)備號建立驅(qū)動設(shè)備節(jié)點
#mknod/dev/democ2510
執(zhí)行應(yīng)用程序測試該驅(qū)動及設(shè)備,分析應(yīng)用程序測試結(jié)果。
#./test_demo
(2)、請參考驅(qū)動程序demo.c,編寫一個虛擬字符設(shè)備驅(qū)動程序并進(jìn)行調(diào)試,該虛擬字符設(shè)備驅(qū)動程序完成如下功能:
◆在核模塊初始化函數(shù)中,實現(xiàn)動態(tài)申請設(shè)備號并注冊該設(shè)備,動態(tài)建立設(shè)備文件節(jié)
點;
◆在核模塊的退出函數(shù)中,實現(xiàn)設(shè)備注銷,刪除該設(shè)備文件節(jié)點;
◆實現(xiàn)file_operations設(shè)備驅(qū)動文件結(jié)構(gòu)體中的open、read、write、ioctl和release
函數(shù)功能,其中:
?open函數(shù):設(shè)置一個計數(shù)器count,每調(diào)用一次open函數(shù),計數(shù)器count加1。
?read函數(shù):讀取用戶寫入的字符串?dāng)?shù)據(jù)的排列結(jié)果。
?write函數(shù):實現(xiàn)將用戶寫入的字符串?dāng)?shù)據(jù),根據(jù)每個字符的ASCII值逆序或升序排序(依據(jù)開關(guān)值asc排序:asc=0,逆序排序;asc=1,升序排序;)。
?ioctl函數(shù):設(shè)置排序方式開關(guān)值asc。
?release函數(shù):每調(diào)用一次release函數(shù),計數(shù)器count減1。
4.試驗結(jié)果
5.試驗中遇到的問題及解決方法。
沒有修改makefile文件直接進(jìn)行編譯導(dǎo)致出錯。試驗前沒有仔細(xì)閱讀試驗原理,看懂試驗代碼,所以在使用make命令以后無法實現(xiàn)。最終在同學(xué)的關(guān)心下找到了緣由。忽視了自己使用的是gcc編譯而不是交叉編譯,因而沒有設(shè)置節(jié)點。嘗試了許多次以后才發(fā)覺了問題,期間以為是test_demo文件的問題,但是導(dǎo)入導(dǎo)出許多次都沒有解決,問了同學(xué)才找到了問題。
試驗四LED驅(qū)動及掌握試驗
1.試驗?zāi)康?/p>
?了解ARM設(shè)備外圍電路結(jié)構(gòu)與接口原理
?熟識Linux系統(tǒng)下硬件驅(qū)動編程
?編程實現(xiàn)對嵌入式設(shè)備上LED燈的掌握
2.試驗容
?閱讀UP-Magic210平臺硬件文檔,熟識ARM處理硬件外圍接口電路
?編程實現(xiàn)UP-Magic210平臺設(shè)備上LED驅(qū)動及應(yīng)用測試程序
3.試驗步驟
編寫UP-Magic210平臺設(shè)備上LED驅(qū)動及應(yīng)用測試程序并進(jìn)行調(diào)試,該LED驅(qū)動程序完成如下功能:
◆在核模塊初始化函數(shù)中,實現(xiàn)動態(tài)申請設(shè)備號并注冊該設(shè)備,動態(tài)建立設(shè)備文件節(jié)
點;
◆在核模塊的退出函數(shù)中,實現(xiàn)設(shè)備注銷,刪除該設(shè)備文件節(jié)點;
◆實現(xiàn)file_operations設(shè)備驅(qū)動文件結(jié)構(gòu)體中的ioctl函數(shù),完成如下功能:
?一次調(diào)用掌握全部的LED亮或滅;
?掌握單個LED亮或滅;
?實現(xiàn)流水燈顯示,流水燈顯示效果自行定義,流水燈循環(huán)顯示次數(shù)由用戶應(yīng)用程序傳入。
程序:
驅(qū)動程序分析:
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
#defineDEVICE_NAME"leds"http://驅(qū)動名稱
#defineDEVICE_MAJOR231//驅(qū)動主設(shè)備號
#defineDEVICE_MINOR0//驅(qū)動次設(shè)備號
//聲明字符設(shè)備類結(jié)構(gòu)
structcdev*mycdev;
structclass*myclass;
dev_tdevno;
//LEDGPIO列表
staticunsignedlongled_table={
S3C_GPQ2,
S3C_GPQ3,
S3C_GPQ4,
S3C_GPQ5,
S3C_GPQ6,
};
//LEDGPIO輸出類型配置列表
staticunsignedintled_cfg_table={
S3C_GPQ2_OUTP,
S3C_GPQ3_OUTP,
S3C_GPQ4_OUTP,
S3C_GPQ5_OUTP,
S3C_GPQ6_OUTP,
};
//LEDIOCTRL處理函數(shù),主要完成從用戶空間傳遞數(shù)據(jù)進(jìn)行GPIO引腳設(shè)置功能
staticintuptech_leds_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
{
switch(cmd){
case0:
case1:
if(arg>6){
return-EINVAL;
}
//LEDGPIO設(shè)置函數(shù)接口
s3c_gpio_setpin(led_table,!cmd);
return0;
default:
return-EINVAL;
}
}
//驅(qū)動層file_operations接口函數(shù)初始化
staticstructfile_operationsuptech_leds_fops={
.owner=THIS_MODULE,
.ioctl=uptech_leds_ioctl,
};
//驅(qū)動程序入口初始化函數(shù),設(shè)置LEDGPIO、向核注冊設(shè)備。staticint__inituptech_leds_init(void)
{
intret;
inti;
//注冊LED設(shè)備
devno=MKDEV(DEVICE_MAJOR,DEVICE_MINOR);//獵取設(shè)備號mycdev=cdev_alloc();
cdev_init(mycdev,//初始化字符設(shè)備err=cdev_add(mycdev,devno,1);//向系統(tǒng)添加LED設(shè)備if(err!=0)
printk("s3cledsdeviceregisterfailed!\n");
myclass=class_create(THIS_MODULE,"leds");
if(IS_ERR(myclass)){
printk("Err:failedincreatingclass.\n");
return-1;
}
//建立LED設(shè)備節(jié)點
class_device_create(myclass,NULL,MKDEV(DEVICE_MAJOR,DEVICE_MINOR),NULL,DEVICE_NAME,DEVICE_MINOR);
//LEDGPIO配置初始化
for(i=0;i
#include
#include
#include
intmain(intargc,char**argv)
{
inti;
inton;
intled_number;
intfd;
/*
依據(jù)命令行參數(shù)容,進(jìn)行掌握。將命令行參數(shù)1設(shè)置成LEDnumber,參數(shù)2設(shè)置成LED點亮熄滅狀態(tài)on
*/
if(argc!=3||sscanf(argv,"%d",
fprintf(stderr,"\t./ledled_numberon|off\n");
fprintf(stderr,"Options:\n");
fprintf(stderr,"\tled_numberfrom0to4\n");
fprintf(stderr,"\ton:1off:0\n");
exit(1);
}
//打開LED設(shè)備節(jié)點
fd=open("/dev/leds",0);
if(fdtm_gmtoff為:
#defineTIMEZONE_OFFSET(foo)foo->tm_gmtoff
修改boa.c:
修改:
if(setuid(0)!=-1){
DIE("ickyLinuxkernelbug!");
}
為:
//if(setuid(0)!=-1){
//DIE("ickyLinuxkernelbug!");
//}
修改defines.h:
修改:
#ifndefSERVER_ROOT
#defineSERVER_ROOT"/etc/boa"
#endif
為:
#ifndefSE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程質(zhì)量管理流程標(biāo)準(zhǔn)化方案
- 陜西省西安市新城區(qū)2024-2025學(xué)年八年級上學(xué)期期末生物學(xué)試題(含答案)
- 投資理財借款合同
- 城市公園建設(shè)與管理合作協(xié)議
- 教育培訓(xùn)領(lǐng)域在線教育平臺內(nèi)容優(yōu)化策略研究
- 客戶關(guān)系管理解決方案實施報告
- 農(nóng)業(yè)產(chǎn)業(yè)鏈延伸作業(yè)指導(dǎo)書
- 干砌擋土墻現(xiàn)場質(zhì)量檢驗報告單
- 國際貿(mào)易術(shù)語題庫
- 院感知識崗前培訓(xùn)
- 品管圈PDCA案例-介入中心提高手術(shù)患者交接記錄書寫合格率醫(yī)院品質(zhì)管理成果匯報
- 第十七屆山東省職業(yè)院校技能大賽中職組“西式烹飪”賽項規(guī)程
- 華東師范大學(xué)《外國人文經(jīng)典(下)》2022-2023學(xué)年第一學(xué)期期末試卷
- 儲能電池模組PACK和系統(tǒng)集成項目可行性研究報告
- 2024年安徽省公務(wù)員錄用考試《行測》真題及解析
- 2024年陜西省中考數(shù)學(xué)試題含答案
- 牙慢性損傷-楔狀缺損
- JTJ034-2000 公路路面基層施工技術(shù)規(guī)范
- 2024-2030年中國光伏建筑一體化(BIPV)市場規(guī)模預(yù)測與競爭格局分析研究報告
- 零售業(yè)視覺營銷與商品展示技巧考核試卷
- 民營醫(yī)院并購合同范本
評論
0/150
提交評論