版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、教學(xué)內(nèi)容第一章 嵌入式系統(tǒng)概述第二章 學(xué)習(xí)板硬件及開發(fā)環(huán)境的建立第三章 構(gòu)建嵌入式Linux系統(tǒng)第四章 嵌入式Linux設(shè)備驅(qū)動(dòng)第五章 嵌入式Linux串口和網(wǎng)絡(luò)編程第六章 嵌入式Linux圖形編程Sunday, July 31, 2022 1第四章 嵌入式Linux驅(qū)動(dòng)程序4.1 嵌入式Linux設(shè)備驅(qū)動(dòng)簡(jiǎn)介4.2 設(shè)備的分類及特點(diǎn)4.3 構(gòu)造和運(yùn)行驅(qū)動(dòng)程序模塊Sunday, July 31, 2022 2課程目標(biāo)掌握嵌入式Linux設(shè)備驅(qū)動(dòng)程序的基本原理、架構(gòu)和設(shè)計(jì)方法字符設(shè)備驅(qū)動(dòng)塊設(shè)備驅(qū)動(dòng)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)掌握Linux設(shè)備驅(qū)動(dòng)開發(fā)中常用的機(jī)制和內(nèi)核資源中斷頂/底半部處理內(nèi)核定時(shí)器和延時(shí)操作并
2、發(fā)控制在內(nèi)核中的應(yīng)用內(nèi)存管理和分配阻塞型I/O和非阻塞型I/OSunday, July 31, 2022 3本章目標(biāo)了解Linux設(shè)備驅(qū)動(dòng)程序的基礎(chǔ)知識(shí) 掌握Linux驅(qū)動(dòng)模塊的構(gòu)造和裝載方法 Sunday, July 31, 2022 4本章結(jié)構(gòu)設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介 Linux驅(qū)動(dòng)程序概述 設(shè)備驅(qū)動(dòng)的Hello World模塊內(nèi)核驅(qū)動(dòng)模塊和應(yīng)用程序?qū)Ρ?編譯和裝載驅(qū)動(dòng)模塊 構(gòu)造和運(yùn)行模塊 設(shè)備的分類和特點(diǎn) 字符設(shè)備網(wǎng)絡(luò)設(shè)備塊設(shè)備Sunday, July 31, 2022 5驅(qū)動(dòng)程序的作用應(yīng)用程序驅(qū)動(dòng)程序操作系統(tǒng)硬件設(shè)備writeioctlreadioctl為什么要學(xué)嵌入式Linux驅(qū)動(dòng)程序開發(fā)?
3、高需求內(nèi)核代碼的大部分新芯片、新設(shè)備高門檻需要具有硬件知識(shí)需要了解內(nèi)核基礎(chǔ)知識(shí)需要了解內(nèi)核中的并發(fā)控制和同步復(fù)雜的軟件結(jié)構(gòu)框架高回報(bào)Sunday, July 31, 2022 74-1設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介驅(qū)動(dòng)程序的特點(diǎn)操控硬件,是應(yīng)用程序和硬件設(shè)備之間的一個(gè)接口隱藏硬件細(xì)節(jié),提高應(yīng)用軟件的可移植性提供安全性開發(fā)模式內(nèi)核態(tài)驅(qū)動(dòng)用戶態(tài)驅(qū)動(dòng)提供機(jī)制,而不是提供策略機(jī)制:驅(qū)動(dòng)程序能實(shí)現(xiàn)什么功能策略:用戶如何使用這些功能Sunday, July 31, 2022 8內(nèi)核態(tài)和用戶態(tài)大多數(shù)OS(包括Linux)把內(nèi)核和運(yùn)行在其上的應(yīng)用程序分為兩個(gè)層次管理,即用戶態(tài)和內(nèi)核態(tài)內(nèi)核態(tài)有較高的權(quán)限,可以控制處理器內(nèi)存的
4、映射和分配方式等等對(duì)應(yīng)于ARM的svc模式 用戶態(tài):只能運(yùn)行系統(tǒng)上的應(yīng)用程序?qū)?yīng)于ARM的usr模式內(nèi)核態(tài)與用戶態(tài)切換:可通過(guò)軟件中斷實(shí)現(xiàn)內(nèi)核態(tài)和用戶態(tài)驅(qū)動(dòng)程序作為系統(tǒng)內(nèi)核的一部分,其工作在內(nèi)核態(tài),而應(yīng)用程序工作在用戶態(tài),即不能直接通過(guò)指針,把用戶空間的數(shù)據(jù)地址傳遞給內(nèi)核(MMU映射地址不一樣)。需要經(jīng)過(guò)轉(zhuǎn)換,把用戶態(tài)“看到的空間”轉(zhuǎn)換成內(nèi)核態(tài)可訪問(wèn)的地址。Linux系統(tǒng)提供了一系列方便的函數(shù)實(shí)現(xiàn)這種轉(zhuǎn)換,如:_get_user、_put_user、_copy_from_user、_copy_to_user4-2設(shè)備的分類和特點(diǎn)設(shè)備分類字符設(shè)備(char device)塊設(shè)備(block de
5、vice)網(wǎng)絡(luò)設(shè)備(network device)Sunday, July 31, 2022 114-2設(shè)備的分類和特點(diǎn)字符設(shè)備特點(diǎn)像字節(jié)流一樣來(lái)存取的設(shè)備( 如同文件 )通過(guò)/dev下的文件系統(tǒng)結(jié)點(diǎn)來(lái)訪問(wèn)。通常至少需要實(shí)現(xiàn) open, close, read, 和 write 等系統(tǒng)調(diào)用只能順序訪問(wèn)數(shù)據(jù)通道,不能前后移動(dòng)訪問(wèn)指針。特例:比如framebuffer設(shè)備就是這樣的設(shè)備,應(yīng)用程序可以使用mmap或lseek訪問(wèn)圖像的各個(gè)區(qū)域Sunday, July 31, 2022 12Linux內(nèi)核結(jié)構(gòu)Linux內(nèi)核結(jié)構(gòu)應(yīng)用程序、庫(kù)、內(nèi)核、驅(qū)動(dòng)程序的關(guān)系open read write ioctl
6、 調(diào)用其他庫(kù)函數(shù)稱為系統(tǒng)調(diào)用,執(zhí)行swi指令進(jìn)入內(nèi)核系統(tǒng)調(diào)用的異常處理 其他功能物理設(shè)備控制器物理設(shè)備應(yīng)用程序 庫(kù)其他庫(kù)函數(shù)的實(shí)現(xiàn) 內(nèi)核open read write ioctl 驅(qū)動(dòng)程序4層軟件關(guān)系說(shuō)明(1)應(yīng)用程序使用庫(kù)函數(shù)提供的open函數(shù)打開設(shè)備文件(2)庫(kù)根據(jù)open函數(shù)傳入的參數(shù)執(zhí)行“swi”指令,引起CPU異常,進(jìn)入內(nèi)核(3)內(nèi)核的異常處理函數(shù)根據(jù)這些參數(shù)找到相應(yīng)的驅(qū)動(dòng)程序,返回一個(gè)文件描述符給庫(kù),進(jìn)而返回給應(yīng)用程序(4)應(yīng)用程序得到文件描述符后,使用庫(kù)提供的write或ioclt函數(shù)發(fā)出控制命令(5)庫(kù)根據(jù)write或ioclt函數(shù)傳入的參數(shù)執(zhí)行“swi”指令,這條指令會(huì)引起C
7、PU異常,再次進(jìn)入內(nèi)核(6)內(nèi)核的異常處理函數(shù)根據(jù)參數(shù)調(diào)用驅(qū)動(dòng)程序的相關(guān)函數(shù),控制硬件4-2設(shè)備的分類和特點(diǎn)塊設(shè)備特點(diǎn)塊設(shè)備通過(guò)位于 /dev 目錄的文件系統(tǒng)結(jié)點(diǎn)來(lái)存取塊設(shè)備和字符設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式塊設(shè)備有專門的接口,塊設(shè)備的接口必須支持掛裝(mount)文件系統(tǒng)。應(yīng)用程序一般通過(guò)文件系統(tǒng)來(lái)訪問(wèn)塊設(shè)備上的內(nèi)容Sunday, July 31, 2022 174-2設(shè)備的分類和特點(diǎn)網(wǎng)絡(luò)設(shè)備特點(diǎn)通過(guò)單獨(dú)的網(wǎng)絡(luò)接口來(lái)訪問(wèn)任何一個(gè)網(wǎng)絡(luò)事務(wù)都通過(guò)一個(gè)網(wǎng)絡(luò)接口訪問(wèn),即一個(gè)能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備。網(wǎng)卡軟件設(shè)備:環(huán)回接口(loopback)內(nèi)核調(diào)用一套和數(shù)據(jù)包傳輸相關(guān)的函數(shù)Sunda
8、y, July 31, 2022 184-3 構(gòu)造和運(yùn)行模塊驅(qū)動(dòng)程序加入內(nèi)核的方法把所有需要的功能都編譯到內(nèi)核中生成的內(nèi)核鏡像(Image)文件會(huì)很大 如果我們要在現(xiàn)有的內(nèi)核中新增或刪除功能,將不得不重新編譯和裝載內(nèi)核。 ?Sunday, July 31, 2022 194-3 驅(qū)動(dòng)程序加入內(nèi)核的方法 Linux提供了機(jī)制被稱為模塊(Module)的機(jī)制 提供了對(duì)許多模塊支持, 包括但不限于, 設(shè)備驅(qū)動(dòng)每個(gè)模塊由目標(biāo)代碼組成( 沒(méi)有連接成一個(gè)完整可執(zhí)行程序 )insmod 將模塊動(dòng)態(tài)加載到正在運(yùn)行內(nèi)核rmmod 程序移除模塊Sunday, July 31, 2022 204.3.1 設(shè)備驅(qū)動(dòng)的
9、Hello World模塊#include #include MODULE_LICENSE(Dual BSD/GPL);static int _init hello_init(void) printk(KERN_ALERT Hello worldn); return 0;static void _exit hello_exit(void) printk(KERN_ALERT Hello world exitn);module_init(hello_init);module_exit(hello_exit); 自由許可證模塊卸載宏用法類似于printf,但它有優(yōu)先級(jí)(比如KERN_ALERT)模
10、塊初始化宏宏,告訴內(nèi)核這兩個(gè)函數(shù)只會(huì)在加載和卸載模塊時(shí)使用Sunday, July 31, 2022 21打印調(diào)試printk指示日志級(jí)別的宏 KERN_EMERG 用于緊急事件消息,一般是系統(tǒng)崩潰前提示 KERN_ALERT 用于需要立即采取動(dòng)作 KERN_CRIT 臨界狀態(tài),通常涉及到嚴(yán)重的硬件或軟件操作失敗 KERN_ERR 用于報(bào)告錯(cuò)誤狀態(tài),設(shè)備驅(qū)動(dòng)程序會(huì)經(jīng)常使用其來(lái)報(bào)告來(lái)自硬件的問(wèn)題 KERN_WARNING 用于對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行警告 KERN_NOTICE 用于有必要進(jìn)行提示的正常情況 KERN_INFO 提示性信息 KERN_DEBUG 用于調(diào)試信息打印調(diào)試printk每個(gè)宏
11、表示一個(gè)中的整數(shù)(07),數(shù)值越小,優(yōu)先級(jí)越高未指定優(yōu)先級(jí)在內(nèi)核2.6版本中就是KENR_WARNING簡(jiǎn)單的內(nèi)核模塊編譯(內(nèi)核2.4)編譯內(nèi)核模塊 #gcc O -DMODULE -D_KERNEL_ -c hello.c -I /usr/src/linux/include (x86 or ARM ? ) 生成hello.o加載內(nèi)核模塊:insmod #insmod hello.o #dmesg Hello,world查看內(nèi)核中使用的模塊 #lsmod | grep hello卸載內(nèi)核模塊:rmmod #rmmod hello.o #dmesg Goodbye world簡(jiǎn)單的內(nèi)核模塊編譯(
12、內(nèi)核2.6)obj-m := led_drv.oKDIR:=/home/at9200/kernel/linux-2.6.38/PWD :=$(shell pwd)all: make -C $(KDIR) M=$(PWD) modulesclean: make -C $(KDIR) M=$(PWD) cleanMakefile文件內(nèi)容簡(jiǎn)單的內(nèi)核模塊編譯(內(nèi)核2.6)obj-m := led_drv.o表示編譯后生成led_drv.ko模塊$(KDIR) 指定了target內(nèi)核源碼的路徑,“M=”表示這是個(gè)外部模塊,M=$(PWD) 指定了該模塊文件所在的路徑。簡(jiǎn)單的內(nèi)核模塊編譯(內(nèi)核2.6)如果
13、是多個(gè)源文件編譯出一個(gè)模塊,假設(shè)模塊名是test.ko,那么源文件名不能有test.cobj-m := test.otest-objs := file1.o file2.o file3.oKDIR := /home/at9200/kernel/linux-2.6.38/PWD := $(shell pwd)all: make -C $(KDIR) M=$(PWD) modulesclean: make -C $(KDIR) M=$(PWD) clean4.3.1 設(shè)備驅(qū)動(dòng)的Hello World模塊Linux內(nèi)核模塊的程序結(jié)構(gòu)module_init()-模塊加載函數(shù)(必須) 通過(guò)insmod或
14、modprobe命令加載內(nèi)核模塊時(shí),模塊的加載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成模塊的相關(guān)初始化工作module_exit()-模塊卸載函數(shù)(必須) 當(dāng)通過(guò)rmmod命令卸載某模塊時(shí),模塊的卸載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成與模塊裝載函數(shù)相反的功能Sunday, July 31, 2022 284-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊MODULE_LICENSE()-模塊許可證聲明(必須)模塊許可證(LICENSE)聲明描述內(nèi)核模塊的許可權(quán)限如果不聲明LICENSE,模塊被加載時(shí),將收到內(nèi)核被污染(kernel tainted)的警告包括:“GPL”、 “GPL v2”、 “GPL and add
15、itional rights”、 “Dual BSD/GPL”、“Dual MPI/GPL”、 “Proprietary” Sunday, July 31, 2022 294-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊加載函數(shù)static int _init initialization_function(void) /* 初始化代碼 */module_init(initialization_function); 應(yīng)當(dāng)聲明成靜態(tài)的(static), 因?yàn)樗鼈儾粫?huì)在特定文件之外可見表明該函數(shù)只是在初始化時(shí)使用。模塊加載器在模塊加載后會(huì)丟掉這個(gè)初始化函數(shù), 這樣可將該函數(shù)占用的內(nèi)存釋放出來(lái),
16、以作他用。 原型:#define _init _attribute_ (_section_(“.init.text”)定義會(huì)在模塊目標(biāo)代碼中增加一個(gè)特殊的段, 用于說(shuō)明內(nèi)核模塊初始化函數(shù)所在的位置。沒(méi)有這個(gè)定義, 初始化函數(shù)不會(huì)被調(diào)用。Sunday, July 31, 2022 304-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊卸載函數(shù) static void _exit cleanup_function(void) /* 釋放資源 */ module_exit(cleanup_function); 在模塊被移除前注銷接口并釋放所有所占用的系統(tǒng)資源標(biāo)識(shí)這個(gè)代碼是只用于模塊卸載( 通過(guò)使編
17、譯器把它放在特殊的 ELF 段)原型:#define _exit _attribute_ (_section_(“.exit.text”)Sunday, July 31, 2022 314.3.1 設(shè)備驅(qū)動(dòng)的Hello World模塊#include #include MODULE_LICENSE(Dual BSD/GPL);static int _init hello_init(void) printk(KERN_ALERT Hello worldn); return 0;static void _exit hello_exit(void) printk(KERN_ALERT Hello w
18、orld exitn);module_init(hello_init);module_exit(hello_exit); Sunday, July 31, 2022 324-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊module_param()-模塊參數(shù)(可選)模塊參數(shù)是模塊被加載的時(shí)候可以被傳遞給它的值,它本身對(duì)應(yīng)模塊內(nèi)部的全局變量。Sunday, July 31, 2022 334-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊EXPORT_SYMBOL()-模塊導(dǎo)出符號(hào)(可選)內(nèi)核模塊可以導(dǎo)出符號(hào)(symbol,對(duì)應(yīng)于函數(shù)或變量)到內(nèi)核其他模塊可以使用本模塊中的變量或函數(shù)其他一些聲明MO
19、DULE_XXXXX()-模塊聲明(可選) Sunday, July 31, 2022 344.3.1 設(shè)備驅(qū)動(dòng)的Hello World模塊#include #include MODULE_LICENSE(Dual BSD/GPL);static char *whom = world;static int howmany = 1;static int hello_init(void)int i; for(i=0;ihowmany;i+) printk(KERN_ALERT Hello %sn,whom); return 0;static void hello_exit(void) printk
20、(KERN_ALERT Hello world exitn);module_init(hello_init);module_exit(hello_exit);module_param(howmany, int, S_IRUGO);module_param(whom, charp, S_IRUGO); module_param(參數(shù)名, 參數(shù)類型,參數(shù)讀/寫權(quán)限) Sunday, July 31, 2022 354-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊module_param(參數(shù)名,參數(shù)類型,參數(shù)讀/寫權(quán)限) 內(nèi)核支持的模塊參數(shù)類型包括: byte、short、ushort、int、u
21、int、long、ulong、charp(字符指針)、bool以u(píng)開頭的為無(wú)符號(hào)值。 static char *whom = world; static int howmany = 1; module_param(howmany, int, S_IRUGO); module_param(whom, charp, S_IRUGO); Sunday, July 31, 2022 364-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊也可以擁有參數(shù)數(shù)組形式為“module_param_array(數(shù)組名,數(shù)組類型,數(shù)組長(zhǎng),參數(shù)讀/寫權(quán)限)”。運(yùn)行insmod或modprobe命令時(shí),應(yīng)使用逗號(hào)分隔
22、輸入的數(shù)組元素裝載模塊時(shí)改變參數(shù):可通過(guò)insmod或modprobeinsmod hello_ext.ko howmany=5 whom=Students modprobe也可以從它的配置文件(/etc/modprobe.conf)讀取參數(shù)的值Sunday, July 31, 2022 374.3.1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊導(dǎo)出符號(hào)EXPORT_SYMBOL(name);EXPORT_SYMBOL_GPL(name); _GPL 版本的宏定義的導(dǎo)出符號(hào)只能對(duì) GPL 許可的模塊可用注: 符號(hào)必須在模塊文件的全局部分導(dǎo)出, 不能在函數(shù)中導(dǎo)出 Sunday, July 31,
23、2022 384.3.1 設(shè)備驅(qū)動(dòng)的Hello World模塊/hello.c#include #include MODULE_LICENSE(GPL);MODULE_AUTHOR(David Xie);MODULE_DESCRIPTION(Hello World Module);MODULE_ALIAS(a simplest module); extern int add_integar(int a,int b); extern int sub_integar(int a,int b); static int _init hello_init() int res_add = add_inte
24、gar(1,2); printk(“res_add=%dn”,res_add); return 0; static void _exit hello_exit() int res_sub = sub_integar(2,1); printk(“res_sub=%dn”,res_sub); module_init(hello_init);module_exit(hello_exit); / calculate.c#include #include MODULE_LICENSE(GPL); int add_integar(int a,int b) return a+b; int sub_integ
25、ar(int a,int b) return a-b; static int _init sym_init() return 0; static void _exit sym_exit(); module_init(sym_init);module_exit(sym_exit); EXPORT_SYMBOL(add_integar); EXPORT_SYMBOL(sub_integar); Sunday, July 31, 2022 394-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊聲明與描述 MODULE_AUTHOR(author); -聲明模塊的作者 MODULE_DESCRIPT
26、ION(description); -聲明模塊的描述MODULE_VERSION(version_string); -聲明模塊的版本 MODULE_DEVICE_TABLE(table_info); -聲明模塊的設(shè)備表MODULE_ALIAS(alternate_name); -聲明模塊的別名Sunday, July 31, 2022 404-3-1 設(shè)備驅(qū)動(dòng)的Hello World模塊模塊的使用計(jì)數(shù) Linux2.4內(nèi)核 MOD_INC_USE_COUNT(加一計(jì)數(shù)) MOD_DEC_USE_COUNT(減一計(jì)數(shù))Linux2.6內(nèi)核中int try_module_get(struct mo
27、dule *module);void module_put(struct module *module);在Linux2.6內(nèi)核下,對(duì)于設(shè)備驅(qū)動(dòng)工程師而言,很少需要親自調(diào)用try_module_get()和module_put(),因?yàn)槟K的計(jì)數(shù)管理由內(nèi)核里更底層的代碼(如總線驅(qū)動(dòng)或是此類設(shè)備共用的核心模塊)來(lái)實(shí)現(xiàn),從而簡(jiǎn)化了設(shè)備驅(qū)動(dòng)的開發(fā)Sunday, July 31, 2022 414-3-2 內(nèi)核驅(qū)動(dòng)模塊與應(yīng)用程序?qū)Ρ葢?yīng)用程序是一個(gè)進(jìn)程編程從主函數(shù)main()開始主函數(shù)main返回即是進(jìn)程結(jié)束驅(qū)動(dòng)程序是一系列內(nèi)核函數(shù)驅(qū)動(dòng)程序向內(nèi)核添加了一些函數(shù),是內(nèi)核的一部分Open()Release(
28、)Read()Write()這些函數(shù)由內(nèi)核在適當(dāng)?shù)臅r(shí)候來(lái)調(diào)用這些函數(shù)可以用來(lái)完成硬件訪問(wèn)等操作Sunday, July 31, 2022 424-3-3 編譯和裝載驅(qū)動(dòng)模塊struct file_operations struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char _user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char _user *, size_t,
29、 loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, int datasync);int (*aio_fsync) (struct kiocb *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 防電信詐騙課件培訓(xùn)內(nèi)容
- 防火安全科普培訓(xùn)講話課件
- 防火業(yè)務(wù)知識(shí)課件
- 防護(hù)用品安全佩戴培訓(xùn)課件
- 防地震安全知識(shí)培訓(xùn)課件
- 鍛造加熱爐安全培訓(xùn)課件
- 部門自我介紹
- 避雷器培訓(xùn)課件
- 道路運(yùn)輸安全培訓(xùn)會(huì)總結(jié)課件
- 江蘇省2025九年級(jí)物理上冊(cè)第十三章簡(jiǎn)單電路第二節(jié)電路連接的基本方式第1課時(shí)認(rèn)識(shí)串聯(lián)電路和并聯(lián)電路課件新版蘇科版
- 斜弱視眼科學(xué)
- 電商平臺(tái)需求規(guī)格說(shuō)明書-通用版本
- GB/T 3372-2010拖拉機(jī)和農(nóng)業(yè)、林業(yè)機(jī)械用輪輞系列
- 北京城市旅游故宮紅色中國(guó)風(fēng)PPT模板
- 經(jīng)濟(jì)學(xué)原理 第一章課件
- 安川伺服說(shuō)明書
- 社會(huì)組織管理概論全套ppt課件(完整版)
- 酒精度檢測(cè)原始記錄
- 冷渣機(jī)檢修工藝
- 建筑風(fēng)水學(xué)培訓(xùn)
- SAP成本月結(jié)操作及標(biāo)準(zhǔn)成本估算
評(píng)論
0/150
提交評(píng)論