版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 LinuxLinux驅(qū)動(dòng)程序設(shè)計(jì)驅(qū)動(dòng)程序設(shè)計(jì)課程目標(biāo)課程目標(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)開(kāi)發(fā)中常用的機(jī)制和內(nèi)核資源中斷頂/底半部處理內(nèi)核定時(shí)器和延時(shí)操作并發(fā)控制在內(nèi)核中的應(yīng)用內(nèi)存管理和分配阻塞型I/O和非阻塞型I/O課程結(jié)構(gòu)圖課程結(jié)構(gòu)圖Linux字符設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) Linux塊設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) Linux下顯示設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)1. 驅(qū)動(dòng)程序概述2. 字符驅(qū)動(dòng)程序3. 時(shí)鐘與中斷4. 并發(fā)和競(jìng)態(tài)5. 內(nèi)存管理6. 阻塞和非阻塞型I/O (第1-2章) 1. 塊設(shè)備驅(qū)動(dòng)程序2.
2、Linux下MTD驅(qū)動(dòng)3. MTD Flash驅(qū)動(dòng)實(shí)例 (第3-4章) 1. 網(wǎng)絡(luò)設(shè)備驅(qū) 程序結(jié)構(gòu)2. 網(wǎng)卡驅(qū)動(dòng)程序?qū)嵗?(第5章) 1.Framebuffer驅(qū)動(dòng)程序結(jié)構(gòu)2. 驅(qū)動(dòng)實(shí)例 (第6-7章) LinuxLinux驅(qū)動(dòng)程序概述驅(qū)動(dòng)程序概述第1章本章目標(biāo)本章目標(biāo)了解Linux設(shè)備驅(qū)動(dòng)程序的基礎(chǔ)知識(shí) 掌握Linux驅(qū)動(dòng)模塊的構(gòu)造和裝載方法 本章結(jié)構(gòu)本章結(jié)構(gòu)設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介 Linux驅(qū)動(dòng)程序概述驅(qū)動(dòng)程序概述 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊內(nèi)核驅(qū)動(dòng)模塊和應(yīng)用程序?qū)Ρ葍?nèi)核驅(qū)動(dòng)模塊和應(yīng)用程序?qū)Ρ?編譯和裝載驅(qū)動(dòng)模塊編譯和裝載驅(qū)動(dòng)模塊 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行
3、模塊 設(shè)備的分類(lèi)和特點(diǎn)設(shè)備的分類(lèi)和特點(diǎn) 字符設(shè)備字符設(shè)備網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備塊設(shè)備塊設(shè)備為什么要學(xué)習(xí)嵌入式為什么要學(xué)習(xí)嵌入式Linux驅(qū)動(dòng)程序開(kāi)發(fā)?驅(qū)動(dòng)程序開(kāi)發(fā)?高需求內(nèi)核代碼的大部分新芯片、新設(shè)備高門(mén)檻需要具有硬件知識(shí)需要了解內(nèi)核基礎(chǔ)知識(shí)需要了解內(nèi)核中的并發(fā)控制和同步復(fù)雜的軟件結(jié)構(gòu)框架高回報(bào)1-1設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介驅(qū)動(dòng)程序的特點(diǎn)驅(qū)動(dòng)程序的特點(diǎn)操控硬件,是應(yīng)用程序和硬件設(shè)備之間的一個(gè)接口隱藏硬件細(xì)節(jié),提高應(yīng)用軟件的可移植性提供安全性開(kāi)發(fā)模式 內(nèi)核態(tài)驅(qū)動(dòng) 用戶(hù)態(tài)驅(qū)動(dòng)提供機(jī)制,而不是提供策略機(jī)制:驅(qū)動(dòng)程序能實(shí)現(xiàn)什么功能策略:用戶(hù)如何使用這些功能1-2設(shè)備的分類(lèi)和特點(diǎn)設(shè)備的分類(lèi)和特點(diǎn)設(shè)備分
4、類(lèi)設(shè)備分類(lèi)字符設(shè)備字符設(shè)備(char device)塊設(shè)備塊設(shè)備(block device)網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備(network device)1-2設(shè)備的分類(lèi)和特點(diǎn)設(shè)備的分類(lèi)和特點(diǎn)字符設(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ū)域1-2設(shè)備的分類(lèi)和特點(diǎn)設(shè)備的分類(lèi)和特點(diǎn)塊設(shè)備特點(diǎn)塊設(shè)備通過(guò)位于 /dev 目錄的文件系
5、統(tǒng)結(jié)點(diǎn)來(lái)存取塊設(shè)備和字符設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式塊設(shè)備有專(zhuān)門(mén)的接口,塊設(shè)備的接口必須支持掛裝(mount)文件系統(tǒng)。應(yīng)用程序一般通過(guò)文件系統(tǒng)來(lái)訪問(wèn)塊設(shè)備上的內(nèi)容1-2設(shè)備的分類(lèi)和特點(diǎn)設(shè)備的分類(lèi)和特點(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ò)接口,即一個(gè)能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備。 網(wǎng)卡 軟件設(shè)備:環(huán)回接口(loopback)內(nèi)核調(diào)用一套和數(shù)據(jù)包傳輸相關(guān)的函數(shù)1-3 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊驅(qū)動(dòng)程序加入內(nèi)核的方法驅(qū)動(dòng)程序加入內(nèi)核的方法把所有需要的功能都編譯到內(nèi)核中把所有需要的功能都編譯到內(nèi)核中 生成的內(nèi)核鏡像(Image)文件會(huì)很大 如果我們要在現(xiàn)有
6、的內(nèi)核中新增或刪除功能,將不得不重新編譯和裝載內(nèi)核。 1-3驅(qū)動(dòng)程序加入內(nèi)核的方法驅(qū)動(dòng)程序加入內(nèi)核的方法 Linux提供了機(jī)制被稱(chēng)為模塊(Module)的機(jī)制 提供了對(duì)許多模塊支持, 包括但不限于, 設(shè)備驅(qū)動(dòng)每個(gè)模塊由目標(biāo)代碼組成( 沒(méi)有連接成一個(gè)完整可執(zhí)行程序 ) insmod 將模塊動(dòng)態(tài)加載到正在運(yùn)行內(nèi)核 rmmod 程序移除模塊1.3.1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊(hello.c)#include #include MODULE_LICENSE(Dual BSD/GPL);static int _init hello_init(void) printk(KERN
7、_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); 自由許可證自由許可證模塊卸載宏模塊卸載宏用法類(lèi)似于用法類(lèi)似于printf,但它有優(yōu)先級(jí)但它有優(yōu)先級(jí)(比如比如KERN_ALERT)模塊初始化模塊初始化宏宏宏,告訴內(nèi)核這兩個(gè)函數(shù)只會(huì)宏,告訴內(nèi)核這兩個(gè)函數(shù)只會(huì)在加載和卸載模塊時(shí)使用在加載和卸載模塊時(shí)使用1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello W
8、orld模塊模塊(hello.c)編譯內(nèi)核模塊 #gcc DMODULE D_KERNEL_ -c hello.c I /your_kernel_path/include/linux 加載內(nèi)核模塊:#insmod ./hello.ko 查看內(nèi)核中已裝載的模塊#lsmod | grep hello卸載內(nèi)核模塊:#rmmod hello 1.3.1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊Linux內(nèi)核模塊的程序結(jié)構(gòu)內(nèi)核模塊的程序結(jié)構(gòu)module_init()-模塊加載函數(shù)(必須)模塊加載函數(shù)(必須) 通過(guò)insmod或modprobe命令加載內(nèi)核模塊時(shí),模塊的加載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,
9、完成模塊的相關(guān)初始化工作module_exit()-模塊卸載函數(shù)(必須)模塊卸載函數(shù)(必須) 當(dāng)通過(guò)rmmod命令卸載某模塊時(shí),模塊的卸載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成與模塊裝載函數(shù)相反的功能1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊(hello.c)MODULE_LICENSE()-模塊許可證聲明(必須)模塊許可證聲明(必須) 模塊許可證(LICENSE)聲明描述內(nèi)核模塊的許可權(quán)限 如果不聲明LICENSE,模塊被加載時(shí),將收到內(nèi)核被污染(kernel tainted)的警告module_param()-模塊參數(shù)(可選)模塊參數(shù)(可選) 模塊參數(shù)是模塊被加載的時(shí)候可以被傳遞給
10、它的值,它本身對(duì)應(yīng)模塊內(nèi)部的全局變量。1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊(hello.c)EXPORT_SYMBOL()-模塊導(dǎo)出符號(hào)(可選)模塊導(dǎo)出符號(hào)(可選) 內(nèi)核模塊可以導(dǎo)出符號(hào)(symbol,對(duì)應(yīng)于函數(shù)或變量)到內(nèi)核 其他模塊可以使用本模塊中的變量或函數(shù)其他一些聲明其他一些聲明MODULE_XXXXX()-模塊聲明(可選)模塊聲明(可選) 1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊加載函數(shù)模塊加載函數(shù)static int _init initialization_function(void) /* 初始化代碼 */module_ini
11、t(initialization_function); 應(yīng)當(dāng)聲明成靜態(tài)的應(yīng)當(dāng)聲明成靜態(tài)的(static), 因?yàn)樗鼈儾灰驗(yàn)樗鼈儾粫?huì)在特定文件之外可見(jiàn)會(huì)在特定文件之外可見(jiàn)表明該函數(shù)只是在初始化時(shí)使用。模塊加載器在模塊加表明該函數(shù)只是在初始化時(shí)使用。模塊加載器在模塊加載后會(huì)丟掉這個(gè)初始化函數(shù)載后會(huì)丟掉這個(gè)初始化函數(shù), 這樣可將該函數(shù)占用的內(nèi)存這樣可將該函數(shù)占用的內(nèi)存釋放出來(lái),以作他用。釋放出來(lái),以作他用。 原型:原型:#define _init _attribute_ (_section_(“.init.text”)定義會(huì)在模塊目標(biāo)代碼中增加一個(gè)特殊的定義會(huì)在模塊目標(biāo)代碼中增加一個(gè)特殊的段段, 用
12、于說(shuō)明內(nèi)核模塊初始化函數(shù)所在的位用于說(shuō)明內(nèi)核模塊初始化函數(shù)所在的位置。沒(méi)有這個(gè)定義置。沒(méi)有這個(gè)定義, 初始化函數(shù)不會(huì)被調(diào)用。初始化函數(shù)不會(huì)被調(diào)用。1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊卸載函數(shù)模塊卸載函數(shù) static void _exit cleanup_function(void) /* 釋放資源 */ module_exit(cleanup_function); 在模塊被移除前注銷(xiāo)接口并在模塊被移除前注銷(xiāo)接口并釋放所有所占用的系統(tǒng)資源釋放所有所占用的系統(tǒng)資源標(biāo)識(shí)這個(gè)代碼是只用于模塊卸載標(biāo)識(shí)這個(gè)代碼是只用于模塊卸載( 通過(guò)使編譯器把它放在通過(guò)使編譯器把它放在特殊
13、的特殊的 ELF 段段)原型:原型:#define _exit _attribute_ (_section_(“.exit.text”)1.3.1 設(shè)備驅(qū)動(dòng)的設(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
14、 void hello_exit(void) printk(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ù)類(lèi)型,參數(shù)讀參數(shù)類(lèi)型,參數(shù)讀/寫(xiě)權(quán)限)寫(xiě)權(quán)限) 1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊module_param(參數(shù)名,參數(shù)類(lèi)型,參數(shù)讀(參數(shù)名,參數(shù)類(lèi)型,參數(shù)讀/寫(xiě)
15、權(quán)限)寫(xiě)權(quán)限) 內(nèi)核支持的模塊參數(shù)類(lèi)型包括:內(nèi)核支持的模塊參數(shù)類(lèi)型包括: byte、short、ushort、int、uint、long、ulong、charp(字符指針)、bool以u(píng)開(kāi)頭的為無(wú)符號(hào)值。 static char *whom = world; static int howmany = 1; module_param(howmany, int, S_IRUGO); module_param(whom, charp, S_IRUGO); 1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊也可以擁有參數(shù)數(shù)組模塊也可以擁有參數(shù)數(shù)組形式為“module_param_arr
16、ay(數(shù)組名,數(shù)組類(lèi)型,數(shù)組長(zhǎng),參數(shù)讀/寫(xiě)權(quán)限)”。運(yùn)行insmod或modprobe命令時(shí),應(yīng)使用逗號(hào)分隔輸入的數(shù)組元素裝載模塊時(shí)改變參數(shù):裝載模塊時(shí)改變參數(shù):可通過(guò)可通過(guò)insmod或或modprobeinsmod hello_ext.ko howmany=5 whom=Students modprobe也可以從它的配置文件(/etc/modprobe.conf)讀取參數(shù)的值1.3.1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊導(dǎo)出符號(hào)模塊導(dǎo)出符號(hào)EXPORT_SYMBOL(name);EXPORT_SYMBOL_GPL(name); _GPL 版本的宏定義的版本的宏定義的導(dǎo)出
17、符號(hào)只能對(duì)導(dǎo)出符號(hào)只能對(duì) GPL 許可的模塊可用許可的模塊可用符號(hào)必須在模塊文件的全局部分符號(hào)必須在模塊文件的全局部分導(dǎo)出導(dǎo)出, 不能在函數(shù)中導(dǎo)出不能在函數(shù)中導(dǎo)出1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊聲明與描述模塊聲明與描述 MODULE_AUTHOR(author); -聲明模塊的作者 MODULE_DESCRIPTION(description); -聲明模塊的描述MODULE_VERSION(version_string); -聲明模塊的版本 MODULE_DEVICE_TABLE(table_info); -聲明模塊的設(shè)備表MODULE_ALIAS(alte
18、rnate_name); -聲明模塊的別名1-3-1 設(shè)備驅(qū)動(dòng)的設(shè)備驅(qū)動(dòng)的Hello World模塊模塊模塊的使用計(jì)數(shù)模塊的使用計(jì)數(shù) Linux2.4內(nèi)核內(nèi)核 MOD_INC_USE_COUNT(加一計(jì)數(shù)) MOD_DEC_USE_COUNT(減一計(jì)數(shù))Linux2.6內(nèi)核中內(nèi)核中 int try_module_get(struct module *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)核里
19、更底層的代碼(如總線驅(qū)動(dòng)或是此類(lèi)設(shè)備共用的核心模塊)來(lái)實(shí)現(xiàn),從而簡(jiǎn)化了設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)1-3-2 內(nèi)核驅(qū)動(dòng)模塊與應(yīng)用程序?qū)Ρ葍?nèi)核驅(qū)動(dòng)模塊與應(yīng)用程序?qū)Ρ葢?yīng)用程序是一個(gè)進(jìn)程應(yīng)用程序是一個(gè)進(jìn)程編程從主函數(shù)main()開(kāi)始主函數(shù)main返回即是進(jìn)程結(jié)束驅(qū)動(dòng)程序是一系列內(nèi)核函數(shù)驅(qū)動(dòng)程序是一系列內(nèi)核函數(shù)驅(qū)動(dòng)程序向內(nèi)核添加了一些函數(shù),是內(nèi)核的一部分 Open() Release() Read() Write()這些函數(shù)由內(nèi)核在適當(dāng)?shù)臅r(shí)候來(lái)調(diào)用這些函數(shù)可以用來(lái)完成硬件訪問(wèn)等操作1-3-3 編譯和裝載驅(qū)動(dòng)模塊編譯和裝載驅(qū)動(dòng)模塊編譯模塊編譯模塊ifneq ($(KERNELRELEASE),) obj-m := h
20、ello.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif 如果我們想由兩個(gè)源文件如果我們想由兩個(gè)源文件(比如比如file1.c和和file2.c )構(gòu)造出一個(gè)名稱(chēng)為構(gòu)造出一個(gè)名稱(chēng)為module.ko的模塊的模塊, 則正確的則正確的makefile可如下編寫(xiě)可如下編寫(xiě): obj-m := module.o module-objs := file1.o file2.o 1-3-3 編譯和裝載驅(qū)動(dòng)模塊編譯和裝載驅(qū)動(dòng)模塊裝載模塊裝載模塊Insmod和modprobe可以用來(lái)裝載模塊卸載模塊卸載模塊從內(nèi)核中卸載模塊可以用rmmod工具.注意,如果內(nèi)核認(rèn)為該模塊任然在使用狀態(tài),或注意,如果內(nèi)核認(rèn)為該模塊任然在使用狀態(tài),或者內(nèi)核被禁止移除該模塊,則無(wú)法移除該模塊。者內(nèi)核被禁止移除該模塊,則無(wú)法移除該模塊。 Insmod和和modprobe主要區(qū)別主要區(qū)別modprobe會(huì)考慮要
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)計(jì)劃范文
- 高爐煉鐵工練習(xí)練習(xí)測(cè)試題附答案(一)
- 高考數(shù)學(xué)復(fù)習(xí)解答題提高第一輪專(zhuān)題復(fù)習(xí)專(zhuān)題04構(gòu)造函數(shù)法解決不等式問(wèn)題(典型題型歸類(lèi)訓(xùn)練)(學(xué)生版+解析)
- 語(yǔ)文統(tǒng)編版(2024)一年級(jí)上冊(cè)漢語(yǔ)拼音9yw 教案
- 漢語(yǔ)語(yǔ)法結(jié)果補(bǔ)語(yǔ)
- 高中英語(yǔ)語(yǔ)法總結(jié)SummaryofSeniorEnglishGrammar
- 2024-2025學(xué)年專(zhuān)題5.3 凸透鏡成像的規(guī)律-八年級(jí)物理人教版(上冊(cè))含答案
- 2024屆上海市華實(shí)高中高三二診模擬數(shù)學(xué)試題
- 4.6 相似多邊形 浙教版數(shù)學(xué)九年級(jí)上冊(cè)課件
- 文藝復(fù)興運(yùn)動(dòng)課件
- 高鈣血癥課件
- 基爾霍夫第一定律說(shuō)課稿省公開(kāi)課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)
- 小學(xué)教育實(shí)訓(xùn)室建設(shè)方案及流程
- 幼兒園手機(jī)攝影拍照培訓(xùn)
- 中國(guó)兒童樂(lè)園行業(yè)發(fā)展分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告(2024-2030)
- 專(zhuān)業(yè)技術(shù)人員年度考核情況登記表
- JJG 703-2003光電測(cè)距儀行業(yè)標(biāo)準(zhǔn)
- GB/T 30491.2-2024天然氣熱力學(xué)性質(zhì)計(jì)算第2部分:擴(kuò)展應(yīng)用范圍的單相(氣相、液相和稠密相)流體性質(zhì)
- 企業(yè)風(fēng)險(xiǎn)管理中的政治和地緣風(fēng)險(xiǎn)管理
- 萬(wàn)曼呼吸機(jī)操作
- 新生兒營(yíng)養(yǎng)素主要成分和特點(diǎn)
評(píng)論
0/150
提交評(píng)論