




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章
物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)本章主要內(nèi)容8.1TinyOS簡(jiǎn)介
8.2安裝TinyOS8.3nesC簡(jiǎn)介8.4TinyOS內(nèi)部機(jī)制簡(jiǎn)介
思考與習(xí)題本章主要內(nèi)容
無線傳感器網(wǎng)絡(luò)(WirelessSensorNetwork,WSN)是由部署在監(jiān)測(cè)區(qū)域內(nèi)大量的廉價(jià)微型傳感器節(jié)點(diǎn)組成,通過無線通信方式形成的一個(gè)多跳的自組織網(wǎng)絡(luò)系統(tǒng),其目的是協(xié)作感知、采集和處理網(wǎng)絡(luò)覆蓋區(qū)域中感知對(duì)象的信息,并發(fā)送給觀察者。傳感器網(wǎng)絡(luò)具有應(yīng)用多樣性、硬件功能有限、資源受限、節(jié)點(diǎn)微型化、分布式任務(wù)協(xié)作的特點(diǎn)。單個(gè)傳感器節(jié)點(diǎn)有兩個(gè)很突出的特點(diǎn):一是并發(fā)性密集,即可能存在多個(gè)需要同時(shí)執(zhí)行的邏輯控制;二是傳感器節(jié)點(diǎn)模塊化程度很高,要求系統(tǒng)能夠讓應(yīng)用程序方便地對(duì)硬件進(jìn)行控制。因此,必須針對(duì)這些特點(diǎn)來設(shè)計(jì)WSN操作系統(tǒng)。本章主要內(nèi)容
當(dāng)前已有多個(gè)有代表性的開源的無線傳感器網(wǎng)絡(luò)操作系統(tǒng),典型的如下所述。TinyOS2.1:美國加州大學(xué)伯克利分校開發(fā);MantisOS0.9.5(MultimodalNetworksofIn-situSensors):美國克羅拉多大學(xué)開發(fā);SOS1.7:美國加州大學(xué)洛杉磯分校開發(fā)。表8-1從設(shè)計(jì)操作系統(tǒng)必須考慮的幾個(gè)方面列舉了TinyOS、MOS和SOS這三個(gè)系統(tǒng)的區(qū)別。本章主要內(nèi)容系統(tǒng)特征TinyOSMOSSOS事件驅(qū)動(dòng)√√線程驅(qū)動(dòng)√處理器能量管理√√√外設(shè)能量管理√√優(yōu)先級(jí)調(diào)度√√實(shí)時(shí)服務(wù)√動(dòng)態(tài)重編程服務(wù)√√外設(shè)管理√√模擬服務(wù)√√√內(nèi)存管理靜態(tài)靜態(tài)動(dòng)態(tài)系統(tǒng)執(zhí)行模型組件線程模塊本章主要內(nèi)容本章簡(jiǎn)單地介紹物聯(lián)網(wǎng)中常用的嵌入式操作系統(tǒng)TinyOS。TinyOS是一款開源的嵌入式操作系統(tǒng),它基于一種組件(Component-Based)的架構(gòu)方式,使得能夠快速實(shí)現(xiàn)各種應(yīng)用。它的首先出現(xiàn)是作為UCBerkeley和IntelResearch合作實(shí)驗(yàn)室的杰作,用來嵌入智能微塵當(dāng)中,之后慢慢演變成一個(gè)國際合作項(xiàng)目,即現(xiàn)在的TinyOS聯(lián)盟。因?yàn)榕c同樣是他們?cè)O(shè)計(jì)的硬件平臺(tái)珠聯(lián)璧合而聲名鵲起,目前已經(jīng)成為無線傳感器網(wǎng)絡(luò)領(lǐng)域事實(shí)上的標(biāo)準(zhǔn)平臺(tái)。讀者需要深入學(xué)習(xí)TinyOS時(shí),可以參考《無線傳感器網(wǎng)絡(luò)操作系統(tǒng)TinyOS》。8.1TinyOS簡(jiǎn)介
8.1.1TinyOS概述
8.1.2TinyOS的特點(diǎn)
8.1.3TinyOS開發(fā)平臺(tái)
8.1.4TinyOS開發(fā)案例
8.1.5TinyOS的基本概念
回本章目錄8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述TinyOS操作系統(tǒng)采用了組件的結(jié)構(gòu)。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如圖8-1所示。組件由下到上可分為3類:硬件抽象組件、綜合硬件組件和高層軟件組件。回本節(jié)目錄8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))硬件抽象組件將物理硬件映射到TinyOS的組件模型;綜合硬件組件模擬高級(jí)的硬件行為,如感知組件、通信組件等;高層次的軟件組件實(shí)現(xiàn)控制、路由以及數(shù)據(jù)傳輸?shù)葢?yīng)用層的功能。8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))每個(gè)TinyOS程序應(yīng)當(dāng)具有至少一個(gè)應(yīng)用組件,即用戶組件。該應(yīng)用組件通過接口調(diào)用下層組件提供的服務(wù),實(shí)現(xiàn)針對(duì)特定應(yīng)用的具體邏輯功能,如數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)收發(fā)等。一個(gè)完整的應(yīng)用系統(tǒng)由一個(gè)內(nèi)核調(diào)度器(簡(jiǎn)稱為調(diào)度器)和許多功能獨(dú)立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運(yùn)行的應(yīng)用程序看成一個(gè)大的“執(zhí)行程序”?,F(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺(tái)和應(yīng)用領(lǐng)域里都可用到的組件,例如定時(shí)器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開來。在此基礎(chǔ)上,用戶只需開發(fā)針對(duì)特殊硬件和特殊應(yīng)用需求的少量組件,大大提高了應(yīng)用的開發(fā)效率。8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))TinyOS設(shè)計(jì)之初的目的是制作一個(gè)專屬嵌入式無線傳感器網(wǎng)絡(luò)的操作系統(tǒng)。但事實(shí)上,由于良好的可擴(kuò)展性和足夠小的代碼尺寸,TinyOS在物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域中也占有非常重要的地位。由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)提出以下原則:能在有限的資源上運(yùn)行:要求執(zhí)行模式允許在單一的協(xié)議棧上運(yùn)行;允許高度的并發(fā)性:要求執(zhí)行模式能對(duì)事件做出快速的直接響應(yīng);適應(yīng)硬件升級(jí):要求組件和執(zhí)行模式能夠應(yīng)對(duì)軟/硬件的替換;支持多樣化的應(yīng)用程序:要求能夠根據(jù)實(shí)際需要,裁減操作系統(tǒng)的服務(wù);魯棒性強(qiáng):要求通過組件間有限的交互渠道,就能應(yīng)對(duì)各種復(fù)雜情況;支持一系列平臺(tái):要求操作系統(tǒng)的服務(wù)具有可移植性。8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))TinyOS操作系統(tǒng)采用的輕量級(jí)線程技術(shù)、二級(jí)調(diào)度方式、事件驅(qū)動(dòng)模式、主動(dòng)消息通信技術(shù)及組件化編程等有效地提高了傳感器節(jié)點(diǎn)CPU的使用率,有助于省電操作并簡(jiǎn)化了應(yīng)用的開發(fā)。TinyOS系統(tǒng)、庫和基于TinyOS的應(yīng)用基本上都是用nesC語言開發(fā)的,在TinyOS中采用nesC語言進(jìn)行應(yīng)用程序開發(fā),應(yīng)用程序開發(fā)人員可以通過nesC語言表達(dá)組件以及組件之間的事件/命令接口。組件分為配置文件和模塊,程序的流程是通過配置文件中接口的連接實(shí)現(xiàn)而構(gòu)建的,而具體實(shí)現(xiàn)的邏輯功能是通過模塊完成的。每個(gè)模塊由一組命令和事件組成,這些命令和事件成為該模塊的接口。一般來說,上層組件對(duì)下層組件發(fā)命令,下層組件發(fā)信號(hào)通知事件的發(fā)生,最底層的組件直接和硬件交互,從而自上到下形成一種樹狀結(jié)構(gòu)。8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))TinyOS的并行處理能力通過任務(wù)(Task)和中斷處理事件(InterruptHanderEvent)來體現(xiàn)。任務(wù)會(huì)加入一個(gè)FIFO隊(duì)列中,在執(zhí)行過程中,任務(wù)間沒有競(jìng)爭(zhēng);但中斷處理程序可以打斷任務(wù)執(zhí)行。TinyOS采用二級(jí)調(diào)度機(jī)制來滿足無線傳感網(wǎng)絡(luò)運(yùn)行特點(diǎn),整個(gè)程序調(diào)度過程如圖8-2所示。組件中完成任務(wù)提交,由操作系統(tǒng)完成調(diào)度。一個(gè)節(jié)點(diǎn)上應(yīng)用程序的框圖如圖8-3所示,操作系統(tǒng)只是在后臺(tái)提供隊(duì)列服務(wù)。8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))與COS-II相比,TinyOS基于事件驅(qū)動(dòng)的機(jī)制就決定了其實(shí)時(shí)性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而COS-II是基于線程模式的,編程簡(jiǎn)單,實(shí)時(shí)性高,但相對(duì)帶來的開銷也大。表8-2比較了TinyOS與uCOS-II主要性能。操作系統(tǒng)TinyOSmCOS-II運(yùn)行模式事件線程搶占式內(nèi)核否是時(shí)間可確定性否是8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))操作系統(tǒng)TinyOSmCOS-II支持動(dòng)態(tài)編程否否(最?。﹥?nèi)核RAM:47B;ROM:473BRAM:300B;ROM:2KB低功耗是否8.1TinyOS簡(jiǎn)介8.1.1TinyOS概述(續(xù))TinyOS作為一個(gè)專業(yè)性非常強(qiáng)的操作系統(tǒng),主要存在如下幾個(gè)特點(diǎn)。(1)擁有專屬的編程語言。TinyOS應(yīng)用程序都是用nesC編寫的,其中nesC是標(biāo)準(zhǔn)C的擴(kuò)展,在語法上和標(biāo)準(zhǔn)C沒有區(qū)別,它的應(yīng)用背景是傳感器網(wǎng)絡(luò)這樣的嵌入式系統(tǒng),這類系統(tǒng)的特點(diǎn)是內(nèi)存有限,且存在任務(wù)和中斷兩類操作,它的編譯器一般都是放在TinyOS的源碼工具路徑下。(2)開放源代碼。所有源碼都免費(fèi)公開,可以訪問官方網(wǎng)站http://www.TinyOS.net去下載相應(yīng)的源代碼,由全世界的TinyOS的愛好者共同維護(hù),目前最新的版本是2.1.1。(3)組件化編程。TinyOS提供一系列可重用的組件,一個(gè)應(yīng)用程序可以通過連接配置文件將各種組件連接起來,以完成它所需要的功能。回本節(jié)目錄8.1TinyOS簡(jiǎn)介8.1.2TinyOS的特點(diǎn)(4)通過任務(wù)和事件來管理并發(fā)進(jìn)程。TinyOS的應(yīng)用程序都是基于事件驅(qū)動(dòng)模式的,采用事件觸發(fā)去喚醒傳感器工作。事件相當(dāng)于不同組件之間傳遞狀態(tài)信息的信號(hào)。當(dāng)事件對(duì)應(yīng)的硬件中斷發(fā)生時(shí),系統(tǒng)能夠快速地調(diào)用相關(guān)的事件處理程序。任務(wù):一般用在對(duì)于時(shí)間要求不是很高的應(yīng)用中,且任務(wù)之間是平等的,即在執(zhí)行時(shí)按順序先后來的,而不能互相占先執(zhí)行,一般為了減少任務(wù)的運(yùn)行時(shí)間,要求每一個(gè)任務(wù)都很短小,能夠使系統(tǒng)的負(fù)擔(dān)較輕,并且支持網(wǎng)絡(luò)協(xié)議的替換。事件:一般用在對(duì)于時(shí)間的要求很嚴(yán)格的應(yīng)用中,而且它可以占先優(yōu)于任務(wù)和其他事件執(zhí)行,它可以被一個(gè)操作的完成或是來自外部環(huán)境的事件觸發(fā),在TinyOS中一般由硬件中斷處理來驅(qū)動(dòng)事件。8.1TinyOS簡(jiǎn)介8.1.2TinyOS的特點(diǎn)(續(xù))(5)支持網(wǎng)絡(luò)協(xié)議組件的替換。除了默認(rèn)的協(xié)議之外,還提供其他協(xié)議供用戶替換,并且支持客戶自定義協(xié)議,這對(duì)于通信協(xié)議分析,非常適用于通信協(xié)議的研究工作。(6)代碼短小精悍。TinyOS的程序采用的是模塊化設(shè)計(jì),所以它的程序核心往往都很小,一般來說核心代碼和數(shù)據(jù)在400B左右;能夠突破傳感器存儲(chǔ)資源少的限制,讓TinyOS很有效地運(yùn)行在無線傳感器網(wǎng)絡(luò)上并去執(zhí)行相應(yīng)的管理工作等。8.1TinyOS簡(jiǎn)介8.1.3TinyOS開發(fā)平臺(tái)國內(nèi)目前可以買到的TinyOS開發(fā)平臺(tái)主要有兩種,一種是Crossbow公司W(wǎng)SN開發(fā)套件,一種億道電子的XSBase-WSN開發(fā)套件;Crossbow本身就是TinyOS聯(lián)盟的成員之一,其所有產(chǎn)品都在TinyOS源碼的Platform目錄下可以找到,可以算得上是TinyOS技術(shù)商用化的代表。Crossbow公司在國內(nèi)有一家代理,開發(fā)平臺(tái)的做工非常不錯(cuò),產(chǎn)品覆蓋面也比較廣,主要的缺點(diǎn)就是產(chǎn)品太貴,而且中文的資料較少。億道電子的WSN套件使用的是較先進(jìn)CC2430芯片,同時(shí)支持TinyOS和Z-stack兩種開發(fā)方式,并且包含大量的中文教材和使用手冊(cè),硬件移植的也非常穩(wěn)定,所有的TinyOS測(cè)試用例都能正常運(yùn)行,而且還帶了大量的中文教材、使用手冊(cè)和實(shí)驗(yàn)用例,其中值得一提的是,該產(chǎn)品搭建了一整套的解決方案框架,實(shí)現(xiàn)了異構(gòu)網(wǎng)絡(luò)之間的互連互通,可以在任何一地通過GPRS手機(jī)上網(wǎng),訪問節(jié)點(diǎn)上的物理數(shù)據(jù),開發(fā)者可以在這個(gè)框架下迅速地進(jìn)行二次開發(fā)?;乇竟?jié)目錄8.1TinyOS簡(jiǎn)介8.1.4TinyOS開發(fā)案例目前有多個(gè)采用TinyOS的研究項(xiàng)目,如UCLA(加州大學(xué)洛杉磯分校)的ShahinFarshchi在進(jìn)行一項(xiàng)以TinyOS為基礎(chǔ)的無線神經(jīng)界面研究。這樣的系統(tǒng)在100Hz/頻道的采樣頻率下可傳感、放大、傳輸神經(jīng)信號(hào),系統(tǒng)小巧、成本低、重量輕、功率小。系統(tǒng)要求一個(gè)接收器接收、解調(diào)、顯示傳輸?shù)纳窠?jīng)信號(hào)。在采樣精度為8bit時(shí),系統(tǒng)的速度可達(dá)5600bit/s,該速度可保證8個(gè)EEG頻道或1個(gè)速度為每秒5.6K采樣頻道的可靠傳輸。研究者目前的奮斗目標(biāo)是提高該基于TinyOS的傳感網(wǎng)絡(luò)的數(shù)據(jù)傳輸速度,設(shè)計(jì)與被測(cè)對(duì)象連接的前端神經(jīng)放大電路。回本節(jié)目錄8.1TinyOS簡(jiǎn)介8.1.4TinyOS開發(fā)案例(續(xù))路易斯安娜州立大學(xué)和位于BatonRouge的南方大學(xué)的Nian-FengTzeng博士正在研究應(yīng)用于石油/氣體開發(fā)和管理的UcoMS(UbiquitousComputingandMonitoringSystem,泛計(jì)算和監(jiān)控系統(tǒng))。該系統(tǒng)適用于傳感網(wǎng)絡(luò)、無線通信和網(wǎng)格計(jì)算,主要功能包括幫助鉆孔、操作數(shù)據(jù)記錄和處理、在線平臺(tái)信息發(fā)布和顯示、設(shè)備監(jiān)控/入侵檢測(cè)、地震處理、復(fù)雜表面設(shè)備和管道的管理,也可使用UCoMS監(jiān)控、維護(hù)淘汰的平臺(tái)。另外,F(xiàn)reescale正在其Zigbee開發(fā)板上測(cè)試TinyOS和TinyDB,波士頓大學(xué)的WeiLi將其用于傳感網(wǎng)絡(luò)的控制和優(yōu)化。8.1TinyOS簡(jiǎn)介8.1.5TinyOS的基本概念TinyOS系統(tǒng)、庫及應(yīng)用程序都是用nesC語言編寫的,這是一種新的用于編寫結(jié)構(gòu)化的基于組件的應(yīng)用程序的語言。nesC語言主要用于諸如傳感器網(wǎng)絡(luò)等嵌入式系統(tǒng),具有類似于C語言的語法,但支持TinyOS的并發(fā)模型,同時(shí)具有結(jié)構(gòu)化機(jī)制、命名機(jī)制,能夠與其他軟組件連接在一起從而形成一個(gè)魯棒的網(wǎng)絡(luò)嵌入式系統(tǒng)。其主要目標(biāo)是幫助應(yīng)用程序設(shè)計(jì)者建立可易于組合成完整、并發(fā)式系統(tǒng)的組件,并能夠在編譯時(shí)執(zhí)行廣泛的檢查。TinyOS定義了許多在nesC中所表達(dá)的重要概念:首先,nesC應(yīng)用程序要建立在定義良好、具有雙向接口的組件之上;其次,nesC定義了并發(fā)模型,該模型是基于任務(wù)(Task)及硬件事件句柄(HardwareEventHandler)的,在編譯時(shí)會(huì)檢測(cè)數(shù)據(jù)爭(zhēng)用(DataRace)?;乇竟?jié)目錄8.1TinyOS簡(jiǎn)介8.1.5TinyOS的基本概念(續(xù))1)組件任何一個(gè)nesC應(yīng)用程序都是由一個(gè)或多個(gè)組件鏈接起來的,從而形成一個(gè)完整的可執(zhí)行程序。組件提供(Provide)并使用(Use)接口,這些接口是組件的唯一訪問點(diǎn)并且它們是雙向的。接口聲明了一組函數(shù),稱為命令(Command),接口的提供者必須實(shí)現(xiàn)它們;另外還聲明了一組函數(shù),稱為事件(Event),接口的使用者必須實(shí)現(xiàn)它們。對(duì)于一個(gè)組件而言,如果它要使用某個(gè)接口中的命令,它必須實(shí)現(xiàn)這個(gè)接口的事件。一個(gè)組件可以使用或提供多個(gè)接口以及同一個(gè)接口的多個(gè)實(shí)例。在nesC中有兩種類型的組件,分別稱為模塊(Module)和配件(Configuration)。模塊提供應(yīng)用程序代碼,實(shí)現(xiàn)一個(gè)或多個(gè)接口;配件則是用來將其他組件裝配起來的組件,將各個(gè)組件所使用的接口與其他組件提供的接口連接在一起,這種行為稱為導(dǎo)通(Wiring)。每個(gè)nesC應(yīng)用程序都由一個(gè)頂級(jí)配置所描述,其內(nèi)容就是將該應(yīng)用程序所用到的所有組件導(dǎo)通起來,形成一個(gè)有機(jī)整體。8.1TinyOS簡(jiǎn)介8.1.5TinyOS的基本概念(續(xù))2)并發(fā)模型TinyOS一次僅執(zhí)行一個(gè)程序。組成程序的組件來自于兩個(gè)方面,一部分是系統(tǒng)提供的組件,另一部分是為特定應(yīng)用用戶自定義的組件。程序運(yùn)行時(shí),有兩個(gè)執(zhí)行線程:一個(gè)稱為任務(wù),另一個(gè)稱為硬件事件句柄。任務(wù)是被延期執(zhí)行的函數(shù),它們一旦被調(diào)度,就會(huì)運(yùn)行直至結(jié)束,并且在運(yùn)行過程中不準(zhǔn)相互搶占。硬件事件句柄是用來響應(yīng)和處理硬件中斷的,雖然也要運(yùn)行完畢,但它們可能會(huì)搶占任務(wù)或其他硬件事件句柄的執(zhí)行。命令和事件要作為硬件事件句柄的一部分而執(zhí)行必須使用關(guān)鍵字async來聲明。由于任務(wù)和硬件事件句柄可能被其他異步代碼所搶占,所以nesC程序易于受到特定競(jìng)爭(zhēng)條件的影響,導(dǎo)致產(chǎn)生不一致或不正確的數(shù)據(jù)。避免競(jìng)爭(zhēng)的辦法通常是在任務(wù)內(nèi)排他地訪問共享數(shù)據(jù),或訪問所有數(shù)據(jù)都使用原子語句。nesC編譯器會(huì)在編譯時(shí)向程序員報(bào)告潛在的數(shù)據(jù)爭(zhēng)用,這里面可能包含事實(shí)上并不可能發(fā)生的沖突。如果程序員可以確保對(duì)某個(gè)數(shù)據(jù)的訪問不會(huì)導(dǎo)致麻煩,可以將該變量使用關(guān)鍵字norace來聲明,但使用這個(gè)關(guān)鍵字一定要格外小心。8.2安裝TinyOS
本節(jié)介紹安裝TinyOS的步驟,共需要6個(gè)步驟,下面的內(nèi)容以及下載的地址都可在網(wǎng)站http://docs.TinyOS.net/tinywiki/index.php/Installing_TinyOS_2.1.1#Manual_installation_on_your_host_OS_with_RPMs上找到,這里只簡(jiǎn)單介紹安裝步驟。
回本章目錄8.2安裝TinyOS1)安裝javajdk1.5,并配置環(huán)境變量用戶需要到/下載JDK1.5。按照官方網(wǎng)站上是安裝1.6,但是安裝后發(fā)現(xiàn)tos-check-env時(shí)會(huì)出錯(cuò),安裝1.5則不會(huì),推薦安裝1.5??梢詫DK安裝在任意路徑下,如安裝在D:\ProgramFiles\Java,安裝完成之后,配置如下變量。(1)新建系統(tǒng)變量JAVA_HOME:指向JDK的安裝路徑,在該路徑下可以找到bin、lib等目錄JAVA_HOME=D:\ProgramFiles\Java\jdk1.6.0_10。8.2安裝TinyOS(2)新建系統(tǒng)變量CLASSPATH:設(shè)置類的路徑。CLASSPATH=.;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar最前面加上”.”和”;”,意為首先在當(dāng)前目錄中查找,如圖8-5所示。8.2安裝TinyOS(3)在系統(tǒng)變量中找到Path:將“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”添加到最前面即可。至此JDK安裝過程結(jié)束,可以自行編寫一個(gè)測(cè)試程序。在D盤根目錄下新建文件夾javatest,然后創(chuàng)建文本文件,將下面的代碼拷入并保存成Test.java文件,注意文件名要與類名相一致。publicclassTest{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}然后使用cmd命令進(jìn)入命令行,并進(jìn)入該目錄下,嘗試使用如下命令編譯并執(zhí)行該java程序,如果然后屏幕上會(huì)打印出”HelloWorld!”,則表示JDK安裝成功。javacTest.JavajavaTest8.2安裝TinyOS2)安裝Windows下的Linux模擬器cygwin這一步僅在Windows上安裝需要,如果是在Linux上安裝,則可以直接跳過此步。(1)到rmatik.uni-freiburg.de/people/aslam/cygwin-files.zip下載cygwin,下載的文件為cygwin-files.zip,解壓到某個(gè)目錄,如c:/cygwin-files。(2)進(jìn)入解壓后的目錄,運(yùn)行setup安裝cygwin,在選擇的版本時(shí)選擇為cygwin-1.2a,根據(jù)有關(guān)資料顯示,該包含本與TinyOS兼容性較好,在選擇安裝類型時(shí),選擇“InatallfromLocalDirectory”,如圖8-6所示。(3)選擇安裝目錄時(shí),在DefaultTextFileType中要選擇Unix/binary,如圖8-7所示。8.2安裝TinyOS8.2安裝TinyOS8.2安裝TinyOS(4)在選擇需要安裝的工具時(shí),全部選中,用鼠標(biāo)單擊“default”變成“install”。(5)單擊安裝來開始安裝,整個(gè)過程需要較長時(shí)間。3)安裝單片機(jī)工具可以選擇AVR或MSP430等,根據(jù)自己的需要安裝。如果選擇AVR,則需要下面幾個(gè)包:avr-binutils、avr-gcc、avr-libc、avarice、insight(avr-gdb)、avrdude,這幾個(gè)包的下載地址在本節(jié)開始提到的網(wǎng)站中可以找到,需要注意的是,在cygwin和Linux下下載的包是不一樣的。4)安裝nesC和TinyOS_tool這一步需要安裝nesC、Deputy、TinyOS-tools3個(gè)包,這幾個(gè)包的下載地址在本節(jié)開始提到的網(wǎng)站中可以找到,這里同樣需要需要在cygwin和Linux下下載的包是不一樣的,使用Linux的rpm命令來安裝這些包。8.2安裝TinyOS5)安裝TinyOS源碼文件在cygwin和Linux下安裝的源碼包是不一樣的,cygwin下需要安裝的是TinyOS-2.1.1-3.cygwin.noarch.rpm,下載地址為http://TinyOS./TinyOS-rpms/TinyOS-2.1.1-3.cygwin.noarch.rpm,Linux下需要安裝的是TinyOS-2.1.1-3.ubuntu.noarch.rpm,下載地址是http://TinyOS./TinyOS-rpms/TinyOS-2.1.1-3.ubuntu.noarch.rpm,下載地址可能會(huì)變動(dòng),最新的下載地址可在本節(jié)開始提到的網(wǎng)站中可以找到,使用Linux的rpm命令來安裝這些包。安裝完TinyOS的源碼包后需要配置如表8-3所示的幾個(gè)環(huán)境變量。8.2安裝TinyOS環(huán)境變量cygwin下的配置Linux下的配置TOSROOT/opt/TinyOS-2.x同cygwin下的配置TOSDIR$TOSROOT/tos同cygwin下的配置CLASSPATHC:\cygwin\opt\TinyOS-2.x\support\sdk\java\TinyOS.jar$TOSROOT/support/sdk/java/TinyOS.jar:.MAKERULES$TOSROOT/support/make/Makerules同cygwin下的配置PATH/opt/msp430/bin:/opt/jflashmm:$PATH同cygwin下的配置8.2安裝TinyOS6)安裝Graphviz到/Download..php下載Graphviz并安裝,請(qǐng)注意這里下載的版本一定要是graphviz1.10的版本,否則會(huì)提示版本信息不對(duì)。編譯TinyOS程序使用make命令,TinyOS系統(tǒng)有一個(gè)強(qiáng)大、的擴(kuò)展性很強(qiáng)的make系統(tǒng),它位于TinyOS-2.x/support/make目錄中。make命令編譯TinyOS應(yīng)用程序的方法是make[platform],如makemicaz。若沒有硬件節(jié)點(diǎn),可以用TinyOS的TOSSIM仿真平臺(tái)進(jìn)行編譯運(yùn)行,TOSSIM仿真編譯則為make[platform]sim,如makemicazsim。安裝完成后可以使用tos-check--env命令來檢測(cè)是否安裝成功,如果成功,則提示“tos-check--envcompletedwithouterror”。成功后即可以編譯一個(gè)示例程序,如Blink程序,方法是進(jìn)入/opt/TinyOS-2.x/apps/Blink目錄,運(yùn)行makemicazsim命令,編譯成功會(huì)提示Successfullybuilt。8.3nesC簡(jiǎn)介
8.3.1nesC概述
8.3.2nesC基本概念
8.3.3一個(gè)簡(jiǎn)單的nesC編程示例
8.3.4TOSSIM仿真
回本章目錄8.3nesC簡(jiǎn)介8.3.1nesC概述
nesC語言是一種在C基礎(chǔ)上擴(kuò)展的編程語言,主要用于傳感器網(wǎng)絡(luò)的編程開發(fā),這類系統(tǒng)的特點(diǎn)是內(nèi)存有限,存在任務(wù)和中斷兩類操作。nesC語言是由加州大學(xué)伯克利分校研發(fā)人員開發(fā)的。TinyOS最初是用匯編和C語言編寫的,后來改用支持組件化編程的nesC語言。該語言把組件化/模塊化思想和基于事件驅(qū)動(dòng)的執(zhí)行模型結(jié)合起來?;乇竟?jié)目錄8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))
nesC使用C語言作為其基礎(chǔ)語言,支持所有的C語言詞法和語法,其獨(dú)有的特色如下:增加了組件(Component)和接口(Interface)的關(guān)鍵字定義;定義了接口及如何使用接口表達(dá)組件之間關(guān)系的方法;目前只支持組件的靜態(tài)連接,不能實(shí)現(xiàn)動(dòng)態(tài)連接和配置。8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))
圖8-8所示是nesC語言的一般程序框架,該系統(tǒng)中的一個(gè)組件一般會(huì)提供一些接口(假定組件名為ComA),接口可以被認(rèn)為這個(gè)軟件組件實(shí)現(xiàn)的一組函數(shù)的聲明,是單獨(dú)定義的一組命令和事件,其他組件通過引用相同接口聲明來使用這個(gè)組件(ComA)的函數(shù),從而實(shí)現(xiàn)組件間功能的相互調(diào)用,即組件的接口是實(shí)現(xiàn)組件間互連的通道。但若組件中實(shí)現(xiàn)的函數(shù)并未被它在接口中說明,就不能被其他組件所使用。nesC語言的定義中存在兩種不同功能的組件:其中組件接口中的函數(shù)功能專門在模塊的組件文件中實(shí)現(xiàn),而不同組件之間的關(guān)系則是專門通過稱為配件的組件文件來描述的。8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))
為了跨平臺(tái)使用,變量的類型和標(biāo)準(zhǔn)C語言的int、long和char不一樣。TinyOS代碼使用的是更清楚直接的類型,直接聲明字節(jié)大小。事實(shí)上,這些能映射到基本的C類型,在不同的平臺(tái)上是不同的映射,大多數(shù)平臺(tái)支持浮點(diǎn)數(shù)運(yùn)算,double可能不行。對(duì)于整型,nesC的定義如下:8位帶符號(hào)數(shù):int8_t;8位無符號(hào)數(shù):uint8_t;16位帶符號(hào)數(shù):int16_t;16位無符號(hào)數(shù):uint16_t;32位帶符號(hào)數(shù):int32_t;32位無符號(hào)數(shù):uint32_t。8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))
雖然可以給應(yīng)用程序中的模塊和配件取任意的名稱,但為了簡(jiǎn)便,建議在編寫代碼時(shí)使用如表8-4所示的統(tǒng)一的命名格式。文件名文件類型文件名文件類型Foo.nc接口文件FooC.nc公共組件(配件或模塊)Foo.h頭文件FooP.nc私有組件(配件或模塊)8.3nesC簡(jiǎn)介8.3.1nesC概述(續(xù))
nesC語言開發(fā)應(yīng)用程序的一般步驟如圖8-9所示。8.3nesC簡(jiǎn)介8.3.2nesC基本概念1)組件一個(gè)nesC語言編寫的程序由一個(gè)或多個(gè)組件(Component)構(gòu)成或連接而成。一個(gè)組件由兩部分組成:一部分是規(guī)范說明,包含要用接口的名字;另一部分是它們的實(shí)現(xiàn)。一個(gè)組件可以提供接口(Provides),也可以使用接口(Uses),提供的接口描述了該組件提供給上一層調(diào)用者的功能,而使用的接口則表示了該組件本身工作時(shí)需要的功能。組件分兩種:Module組件(模塊)用于實(shí)現(xiàn)某種邏輯功能;Configuration組件(配件)用于將各個(gè)組件連接起來成為一個(gè)整體。組件特征的特征是組件內(nèi)變量、函數(shù)可以自由訪問,但組件之間不能訪問和調(diào)用?;乇竟?jié)目錄8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口接口是一組相關(guān)函數(shù)的集合,它是雙向的并且是組件間的唯一訪問點(diǎn)。由于大多數(shù)的節(jié)點(diǎn)平臺(tái)沒有基于硬件的內(nèi)存保護(hù)措施,也沒有將用戶地址空間和系統(tǒng)地址空間分離開,只有一個(gè)所有組件都能共享的地址空間。最好的辦法就是保持內(nèi)存盡可能少地共享。組件聲明的任何狀態(tài)變量都是私有的,沒有任何其他組件可以對(duì)它進(jìn)行命名或者直接訪問它。兩個(gè)組件直接交互的唯一方式是通過接口。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口接口聲明了兩種函數(shù):命令(Command),接口的提供者必須實(shí)現(xiàn)它們;事件(Event),接口的使用者必須實(shí)現(xiàn)它們。也就是說,提供了接口的組件必須實(shí)現(xiàn)該接口的命令函數(shù);而使用了某接口的組件必須實(shí)現(xiàn)該接口的事件函數(shù)。函數(shù)調(diào)用時(shí),命令用call,事件用signal,在一個(gè)組件中,provides的接口中的command函數(shù)必須被實(shí)現(xiàn)(在implementation中定義),uses的接口中的event函數(shù)必須被實(shí)現(xiàn)。async指出這個(gè)command或者event可以在有中斷時(shí)使用。如果一個(gè)組件調(diào)用了(call)的一個(gè)接口命令,必須實(shí)現(xiàn)該接口的事件。一個(gè)組件可以使用(use)或提供(provide)多個(gè)接口或者同一接口的多個(gè)實(shí)例。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口接口的特點(diǎn)是:provides未必一定有組件使用,但uses一定要有人提供,否則編譯會(huì)提示出錯(cuò)。在動(dòng)態(tài)組件配置語言中uses也可以動(dòng)態(tài)配置。接口可以連接多個(gè)同樣的接口,叫做多扇入/扇出。一個(gè)Module可以同時(shí)提供一組相同的接口,又稱為參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時(shí)給多個(gè)組件分享。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口可以按照下面的方法定義接口:接口放在一個(gè)單獨(dú)的文件*.nc中。接口的名稱應(yīng)與文件名對(duì)應(yīng),例如interface1的接口必須對(duì)應(yīng)于文件名interface1.nc。接口定義描述了一系列函數(shù)原型(command和event)。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口一個(gè)簡(jiǎn)單地接口如下:interfaceSendMsg{commandresult_tsend(uint16_taddress,uint8_tlength,TOS_MsgPtrmsg);eventresult_tsendDone(TOS_MsgPtrmsg,result_tsuccess);}該內(nèi)容要放在SendMsg.nc中,SendMsg接口類型提供者必須實(shí)現(xiàn)send,而使用者必須實(shí)現(xiàn)sendDone事件。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))2)接口nesC使用箭頭“->”來綁定一個(gè)接口到另一個(gè)接口,但一定要是同一類接口。例如“A->B”意為A連接到B,A是接口的使用者(user),而B是接口的提供者(provider)。完整的表達(dá)式應(yīng)該為“A.a->B.b”,這意味著,組件A的接口a連接到組件B的接口b。當(dāng)一個(gè)組件使用或者提供同一個(gè)接口的多個(gè)不同實(shí)例時(shí),設(shè)置別名就非常有必要了。當(dāng)一個(gè)組件只含有一個(gè)接口的時(shí)候,就可以省略接口的名字了。連接的箭頭是也可以對(duì)稱反過來,如“BlinkC.Timer0->Timer0”同“Timer0<-BlinkC.Timer0”等價(jià),但為了方便閱讀,大多數(shù)連接的箭頭還是從左到右的。一個(gè)組件使用了一個(gè)接口,它可以調(diào)用這個(gè)接口的命令,但必須實(shí)現(xiàn)其事件。調(diào)用接口命令需要關(guān)鍵字“call”,調(diào)用接口事件需要關(guān)鍵字“signal”。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))3)模塊模塊(Module)提供一個(gè)或多個(gè)接口的實(shí)現(xiàn)。模塊是接口的實(shí)現(xiàn)者和使用者,模塊名也必須與文件名同名,模塊包含兩部分內(nèi)容:模塊使用和提供的接口描述;模塊內(nèi)部的實(shí)現(xiàn)代碼。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))下面是一個(gè)模塊的示例,該模塊要放置到M1.nc中。moduleM1{/*聲明部分*/providesinterfaceA1;usesinterfaceB1;}implementation{/*實(shí)現(xiàn)部分,C代碼*/commandvoidA1.cmd1(){callB1.cmd2();}eventvoidA1.event1(){…}}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))4)配件配件(Configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。組件名也必須與文件名同名,同模塊一樣,配件也包含兩部分內(nèi)容:組件使用和提供的接口描述;組件內(nèi)部的實(shí)現(xiàn)代碼(配置列表)。配件把其他的組件裝配起來,連接組件使用的接口到其提供者。每個(gè)nesC應(yīng)用程序都必須有且只有一個(gè)頂層配件(Top-LevelConfiguration)連接內(nèi)部組件。之所以區(qū)別設(shè)計(jì)模塊與配件,是為了讓系統(tǒng)設(shè)計(jì)者在構(gòu)建應(yīng)用程序的時(shí)候可以脫離現(xiàn)有的實(shí)現(xiàn)。例如,設(shè)計(jì)者可以提供配件,只是簡(jiǎn)單地把一個(gè)或多個(gè)模塊連接起來,而不涉及其中具體的工作。同樣地,另一個(gè)開發(fā)者負(fù)責(zé)提供一組模塊庫,這些模塊可以普遍使用到眾多應(yīng)用中。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))下面是一個(gè)組件的示例,該示例要保存到C1.nc文件中。configurationC1{providesinterfaceA1;}implementation{componentsM1;componentsM2;A1=M1.A1;M1.B1->M2.B1;}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))5)命令命令是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者實(shí)現(xiàn),而接口的使用者則會(huì)調(diào)用這種函數(shù),形象地稱為命令,即為接口提供的可供調(diào)用的命令。語法結(jié)構(gòu)類似于C語言,只是在最前面增加command關(guān)鍵字。(1)命令定義。下面給出一個(gè)命令的定義。interfaceA1{commandintcmd1(intarg);…}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))5)命令(2)命令實(shí)現(xiàn)。下面給出一個(gè)命令的實(shí)現(xiàn)。moduleM1{providesinterfaceA1;…}implementation{commandintA1.cmd1(intarg){……}}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))5)命令(3)命令使用。下面給出一個(gè)命令的使用,調(diào)用命令時(shí)一定要用call命令,否則編譯會(huì)出錯(cuò)。moduleM2{usesinterfaceA1;}implementation{…intret=callA1.cmd1(0x11);…}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))6)事件事件也是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者調(diào)用,而接口的使用者則會(huì)實(shí)現(xiàn)這種函數(shù),形象地稱為event,即為接口使用者所實(shí)現(xiàn)的事件處理函數(shù)。語法結(jié)構(gòu)類似于C語言,只是在最前面增加event關(guān)鍵字。(1)事件定義。下面給出一個(gè)事件的定義,它可以擁有參數(shù)和返回值。interfaceA1{…eventvoidevent1(intarg1,intarg2);}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))6)事件(2)事件實(shí)現(xiàn)。下面給出的是事件的實(shí)現(xiàn),接口的提供者在發(fā)出事件時(shí),必須使用關(guān)鍵字post,否則編譯會(huì)出錯(cuò)。moduleM1{providesinterfaceA1;}implementation{…postA1.event1(0x1,0x2);/*發(fā)出對(duì)應(yīng)的事件,實(shí)際上類同于調(diào)用事件處理函數(shù)*/…}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))6)事件(3)事件使用。下面給出使用事件的方法,接口使用者必須實(shí)現(xiàn)事件的具體內(nèi)容,如同事件處理函數(shù)一樣。moduleM2{usesinterfaceA1;}implementation{eventvoidA1.event1(intarg1,intarg2){…}}8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))7)任務(wù)任務(wù)是TinyOS系統(tǒng)提供的一種特殊的機(jī)制,類同于線程。在大多數(shù)情況下,因?yàn)橥酱a是非搶占的,這種編程方式行之有效。但是,這種做法并不適合大規(guī)模計(jì)算。當(dāng)一個(gè)組件需要做什么且此時(shí)還有寬裕的時(shí)間,最好給TinyOS延遲計(jì)算的能力,即處理完之前已在等待的事情后再執(zhí)行。任務(wù)是一個(gè)函數(shù),組件告訴TinyOS稍后再運(yùn)行而不是立即運(yùn)行。任務(wù)一般為一個(gè)函數(shù),無參數(shù),無返回值。任務(wù)可以在一般的TinyOS程序中發(fā)出,而任務(wù)的執(zhí)行是由TinyOS系統(tǒng)內(nèi)核來實(shí)現(xiàn)的。并且任務(wù)的執(zhí)行是不影響調(diào)用者的,將會(huì)在發(fā)出任務(wù)后的某一個(gè)時(shí)刻被調(diào)度運(yùn)行。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))7)任務(wù)任務(wù)具有如下特點(diǎn):無參數(shù)、無返回值;系統(tǒng)會(huì)按特定的順序調(diào)度這些任務(wù);任務(wù)執(zhí)行期間不能搶占,但是可以被中斷所搶占;在任務(wù)未執(zhí)行時(shí),發(fā)出多少個(gè)任務(wù),都將只運(yùn)行一次這個(gè)任務(wù)。系統(tǒng)執(zhí)行完一個(gè)任務(wù)后才會(huì)去執(zhí)行其他任務(wù),所以任務(wù)一般要求短小,不至于影響其他任務(wù)。8.3nesC簡(jiǎn)介8.3.2nesC基本概念(續(xù))7)任務(wù)任務(wù)的定義一般也是放在module中的,下面給出一個(gè)任務(wù)示例。moduleM1{}Implementation{…taskvoidtask1(){…}
voidf1(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 自然保護(hù)區(qū)動(dòng)遷協(xié)議書
- 上海市2023-2024學(xué)年六年級(jí)下學(xué)期期末語文試題匯編-綜合運(yùn)用(答案版)
- 羊委托養(yǎng)殖協(xié)議書
- 高端餐廳食材冷藏展示企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 生物材料生產(chǎn)行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 智能資產(chǎn)配置顧問系統(tǒng)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 電子晶須增強(qiáng)材料企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 互聯(lián)網(wǎng)金融AI應(yīng)用企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 高空作業(yè)維修機(jī)器人行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 高效能戶外泛光照明企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 端午節(jié)文化知識(shí)競(jìng)賽試題及答案
- 員工個(gè)人勞務(wù)合同電子版
- 五年級(jí)口算1000題(打印版)
- 五官科護(hù)理第七章-口腔頜面部的應(yīng)用解剖生理課件
- 第四章 第二節(jié)招聘
- FZT 73013-2017 針織泳裝行業(yè)標(biāo)準(zhǔn)
- 科技志愿服務(wù)培訓(xùn)課件
- 血液科疾病常見癥狀護(hù)理培訓(xùn)課件
- 2024-2025年全國初中化學(xué)競(jìng)賽試卷及答案
- 2024年首都機(jī)場(chǎng)集團(tuán)資產(chǎn)管理有限公司招聘筆試參考題庫含答案解析
- 生產(chǎn)異常管理課件
評(píng)論
0/150
提交評(píng)論