




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)程序可移植性設(shè)計(jì)及性能優(yōu)化之三--函數(shù)設(shè)計(jì)嵌入式系統(tǒng)程序可移植性設(shè)計(jì)及性能優(yōu)化之三函數(shù)設(shè)計(jì)【摘要】本章介紹了函數(shù)設(shè)計(jì)的一些基本規(guī)則。合理對(duì)各種參數(shù)進(jìn)行封裝,不但有利于模塊的交互,更能夠減少參數(shù)提高函數(shù)調(diào)用性能。其次介紹了模塊劃分的原則,如何減少模塊間的耦合度。接著分析了宏函數(shù)中參數(shù)的基本規(guī)則、多宏語(yǔ)句的基本規(guī)則、宏和內(nèi)聯(lián)的區(qū)別以及如何防止宏參數(shù)宏語(yǔ)句擴(kuò)展后的異常效應(yīng)。最后介紹了如何利用const來進(jìn)行輸入?yún)?shù)的修飾及如何提高程序的可靠性?!娟P(guān)鍵詞】嵌入式,可移植性,函數(shù)設(shè)計(jì),模塊劃分,耦合度,內(nèi)聚性,內(nèi)聯(lián),宏參數(shù),const,輸入?yún)?shù),可靠性3函數(shù)設(shè)計(jì)...-15-避免過多函數(shù)參數(shù),提高調(diào)用性能…-15-合理設(shè)計(jì)模塊,減小耦合度...-16-用宏函數(shù)提高時(shí)間效率...-18-宏參數(shù)的基本規(guī)則…-18-宏語(yǔ)句的基本規(guī)則…-18-宏的副作用…-20-3.4Const修飾輸入指針參數(shù)…-21-1函數(shù)設(shè)計(jì)避免過多函數(shù)參數(shù),提高調(diào)用性能在函數(shù)設(shè)計(jì)時(shí)通常需要傳遞參數(shù),為了提供函數(shù)調(diào)用的性能,某些處理器如ARM會(huì)利用寄存器來傳遞參數(shù),這樣不需要訪問內(nèi)存,其訪問效率更高。但寄存器傳遞的參數(shù)數(shù)目有限,對(duì)于ARM體系是四個(gè),當(dāng)多于四個(gè)時(shí),剩余的參數(shù)需要用棧傳遞,參數(shù)的出棧入棧都需要時(shí)間,調(diào)用性能下降。當(dāng)參數(shù)之間緊密相連且通常需要在多個(gè)模塊中聯(lián)合使用時(shí),應(yīng)對(duì)參數(shù)進(jìn)行封裝,這樣便于參數(shù)的傳遞和變量的管理。如:SYS_STATUSDCCM_SetSfnTsn(u16u16SfnPeriod,u16u16TsnPeriod,u16u16Sfn,u16u16Tsn,u32u32TodPart1,u32u32TodPart2)函數(shù)六個(gè)參數(shù),對(duì)這些參數(shù)的解析在函數(shù)內(nèi)部又要定義六個(gè)變量與之對(duì)應(yīng),這給變量的定義個(gè)管理帶來了不便,如下:u16g_u16DCCMSfn;u16g_u16DCCMTsn;u16g_u16DCCMSfnPeriod;u16g_u16DCCMTsnPeriod;STRU_DD_TOD_INFOg_struDCCMTod;因此應(yīng)將相關(guān)聯(lián)的變量封裝為結(jié)構(gòu)體,優(yōu)勢(shì)在于:便于管理、定義、聲明,避免零散的變量;意義明確,結(jié)構(gòu)清晰;函數(shù)調(diào)用時(shí)避免傳遞過多參數(shù),提高函數(shù)調(diào)用性能,參數(shù)少不易出錯(cuò);不足在于對(duì)于結(jié)構(gòu)體的訪問效率不如單獨(dú)的變量,但此性能影響很?。粸榱舜a更好的可讀性、可移植可維護(hù)性性和可靠性,此處結(jié)構(gòu)體的形式更合適。MAT、CCM及MCP都需要用到此類信息,因此應(yīng)單獨(dú)提煉出結(jié)構(gòu)體便于各模塊的交互;模塊間進(jìn)行通信時(shí)要遵循一定的協(xié)議,即數(shù)據(jù)交互時(shí)要按照一定的數(shù)據(jù)格式進(jìn)行傳輸,為防止各模塊對(duì)格式的認(rèn)識(shí)不統(tǒng)一,最好的方式是提供統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)的定義來進(jìn)行數(shù)據(jù)收發(fā)BPP端封裝為STRU_BPP_TOD_SFN_TSN_PARAMtypedefstructtag_STRU_BPP_TOD_SFN_TSN_PARAM{STRU_DD_TOD_INFOstruTod;u16u16SfnPeriod;u16u16TsnPeriod;u16u16Sfn;u16u16Tsn;}STRU_BPP_TOD_SFN_TSN_PARAM;而MCP端對(duì)此結(jié)構(gòu)的定義為typedefstructtag_STRU_DD_MCPBPP_TODTSNSFN_INFO{u16u16u32u32TodPart1;u32u32TodPart2;u16u16SfnPrd;u16u16TsnPrd;u16u16SfnNum;u16u16TsnNum;}STRU_DD_MCPBPP_TODTSNSFN_INFO;可以發(fā)現(xiàn),原來BPP和MCP的MAT模塊對(duì)時(shí)隙、子幀、TOD信息的處理并沒有采取統(tǒng)一的方式,這樣在交互時(shí)容易出現(xiàn)問題。并且二者分別定義,有重復(fù)勞動(dòng)。合理設(shè)計(jì)模塊,減小耦合度軟件模塊設(shè)計(jì)時(shí)需要合理劃分模塊的層次結(jié)構(gòu),提高內(nèi)聚性,降低耦合度,引用全局變量會(huì)增強(qiáng)模塊之間的耦合度。如:DCCM模塊定義了g_u16DCCMTsn、g_u16DCCMSfn等全局變量,調(diào)用DBSP模塊實(shí)現(xiàn)的時(shí)隙回調(diào)函數(shù)DBSP_TslotCb();DBSP模塊中DBSP_TslotCb()聲明外部變量,通過全局變量引用g_u16DCCMTsn、g_u16DCCMSfn等變量,并且在DBSP_TslotCb()內(nèi)部只是讀取了g_u16DCCMTsn、g_u16DCCMSfn的值。因此更改函數(shù)形式,傳遞參數(shù),而非引用全局變量;不更改參數(shù)值,采用值傳遞voidDBSP_TslotCb(u16u16Sfn,u16u16Tsn)若DBSP_TslotCb不是由定義g_u16DCCMTsn、g_u16DCCMSfn等變量的DCCM模塊調(diào)用,貝【J必須聲明外部變量然后引用,這種耦合是無法避免的。另一個(gè)典型例子是資源的申請(qǐng)和釋放。在具備操作系統(tǒng)的嵌入式系統(tǒng)中,因?yàn)榍度胧较到y(tǒng)的內(nèi)存空間往往是十分有限的,定義過多的全局變量將導(dǎo)致系統(tǒng)內(nèi)存大量減少,因?yàn)槿肿兞吭诔绦虻恼麄€(gè)運(yùn)行期間都占據(jù)著同塊內(nèi)存;另外??臻g也是有限的,若在函數(shù)內(nèi)部定義大容量的數(shù)據(jù)結(jié)構(gòu)時(shí),很可能導(dǎo)致棧溢出。上述兩種情況都需要?jiǎng)討B(tài)內(nèi)存申請(qǐng)釋放來解決,但不經(jīng)意的內(nèi)存泄露會(huì)很快導(dǎo)致系統(tǒng)的崩潰。所以一定要保證你的malloc和free成對(duì)出現(xiàn),如果你寫出這樣的一段程序:u8*function(void){u8*p;p=(u8*)malloc(...);if(p==NULL)…;…/*一系列針對(duì)p的操作*/returnp;}在某處調(diào)用function(),用完function中動(dòng)態(tài)申請(qǐng)的內(nèi)存后將其free,如下:u8*q=function();free(q);上述代碼明顯是不合理的,因?yàn)檫`反了malloc和free成對(duì)出現(xiàn)的原則,即”誰申請(qǐng),就由誰釋放”原則。不滿足這個(gè)原則,會(huì)導(dǎo)致代碼的耦合度增大,因?yàn)橛脩粼谡{(diào)用function函數(shù)時(shí)需要知道其內(nèi)部細(xì)節(jié)!正確的做法是在調(diào)用處申請(qǐng)內(nèi)存,并傳入function函數(shù),如下:u8*p=malloc(...);if(p==NULL)…;function(p);.free(p);p=NULL;而函數(shù)function則接收參數(shù)p,如下:voidfunction(u8*p){…/*一系列針對(duì)p的操作*/另外一些公用處理模塊,為了滿足各種不同的調(diào)用需要,往往在內(nèi)部采用了大量的if-then-else結(jié)構(gòu),這樣很不好,判斷語(yǔ)句如果太復(fù)雜,會(huì)消耗大量的時(shí)間的,應(yīng)該盡量減少公用代碼塊的使用,避免控制耦合。用宏函數(shù)提高時(shí)間效率在嵌入(inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分之前,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來說,為了能達(dá)到要求的實(shí)時(shí)性能,嵌入代碼經(jīng)常是必須的方法。但是使用這種方法在優(yōu)化程序速度的同時(shí),程序長(zhǎng)度變大了,因此需要更多的ROM空間。使用這種優(yōu)化在宏函數(shù)頻繁調(diào)用并且只包含幾行代碼的時(shí)候,對(duì)提高運(yùn)行效率是最有效的。函數(shù)的調(diào)用必須要將程序執(zhí)行的順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中的某個(gè)地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去執(zhí)行前要保存現(xiàn)場(chǎng)并記憶執(zhí)行的地址,轉(zhuǎn)回后要恢復(fù)現(xiàn)場(chǎng),并按原來保存地址繼續(xù)執(zhí)行。同時(shí)函數(shù)調(diào)用是要使用系統(tǒng)的棧來保存數(shù)據(jù)的。因此,函數(shù)調(diào)用要有一定的時(shí)間和空間方面的開銷,于是將影響其效率。而宏函數(shù)不存在這個(gè)問題,其只是在預(yù)處理的地方將預(yù)先寫好的代碼嵌入到當(dāng)前程序,不會(huì)產(chǎn)生函數(shù)調(diào)用,所以僅僅是占用了空間,不需要額外時(shí)間方面的開銷。所以調(diào)用一個(gè)宏比調(diào)用一個(gè)函數(shù)更有時(shí)間效率,在頻繁調(diào)用同一個(gè)宏函數(shù)的時(shí)候,該現(xiàn)象尤其突出。1.3.1宏參數(shù)的基本規(guī)則在引用宏參數(shù)時(shí)必須括起來,如參數(shù)為A,則引用時(shí)(A);若是宏表達(dá)式,則整個(gè)表達(dá)式必須括起來,如((A)+3);采用上述規(guī)則定義一個(gè)"標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè),如下:#defineMIN(A,B)((A)<=(B)?(A):(B))參數(shù)和表達(dá)式都必須括起來是為了防止在宏參數(shù)替換后由于運(yùn)算符優(yōu)先級(jí)導(dǎo)致的問題,因?yàn)楹陞?shù)本身可以是表達(dá)式,而且當(dāng)宏在表達(dá)式中展開時(shí),你不知道表達(dá)式里還有沒級(jí)別更高的運(yùn)算1.3.2宏語(yǔ)句的基本規(guī)則對(duì)于多個(gè)語(yǔ)句一起構(gòu)成的宏函數(shù),必須保證在宏函數(shù)替換后其為一個(gè)完整的執(zhí)行序列,即任何時(shí)候都是全部順序執(zhí)行完畢。宏語(yǔ)句的最后一句沒有語(yǔ)句結(jié)束符'';”,而是在引用宏函數(shù)時(shí)添加。如:#defineMacroAif(conditon);\Sentencel#defineMacroBsentence2;\Sentence3If(condition1)MacroA;ElseMacroB;則宏函數(shù)替換擴(kuò)展后,如下:If(condition1)if(conditon)Sentence1;Elsesentence2;Sentence3;If(conditionl){if(conditon)Sentencel;elsesentence?;}Sentence3;可以看出擴(kuò)展后的結(jié)果和設(shè)計(jì)情況相差很遠(yuǎn),最簡(jiǎn)單的解決情況是:任何if-else下面的語(yǔ)句都用'、{}”括起來。這樣可以保證在宏函數(shù)擴(kuò)展后不會(huì)出現(xiàn)異常。If(conditionl){MacroA;}else{MacroB;}If(conditionl){if(conditon)Sentencel;}else{sentence?;Sentence3;}但顧客是上帝,我們不能要求使用我們的宏函數(shù)的用戶任何時(shí)候都用'、{}"來構(gòu)造if^else語(yǔ)句,我們要本著''嚴(yán)于律己,寬以待人,,的原則來設(shè)計(jì)我們的宏函數(shù),這樣就可以保證無論用戶是否操作規(guī)范,我們總能達(dá)到他們的要求??捎幸韵聝煞N方式:1)Do....while(0)結(jié)構(gòu)這是宏函數(shù)最常見的方式,如:#defineDD_INIT_ISR_TIME_STATS(pstruIsrTime)do\{\(pstruIsrTime)->u32IsrStartTestFlag=0;\(pstruIsrTime)->u32IsrMinGapTime=C_DD_WORD_VAL_MAX;\}while(0)本質(zhì)上''{}”來保證多條語(yǔ)句為一個(gè)執(zhí)行序列的,那么下列方式可以么?#defineDD_INIT_ISR_TIME_STATS(pstruIsrTime){\(pstruIsrTime)->u32IsrStartTestFlag=0;\(pstruIsrTime)->u32IsrMinGapTime=C_DD_WORD_VAL_MAX;\}看似可以,實(shí)則不然,因?yàn)楹旰瘮?shù)的規(guī)則是調(diào)用時(shí)將添加'';”,那么上述宏函數(shù)擴(kuò)展后即為{(pstruIsrTime)->u32IsrStartTestFlag=0;(pstruIsrTime)->u32IsrMinGapTime=C_DD_WORD_VAL_MAX;};最后一個(gè)';”就是多余的,不能編譯通過。但單獨(dú)一行的'、;”是可以的,其表示空語(yǔ)句。這也就是為什么上面添加了一條無用的while(0),起保證宏擴(kuò)展后是正確的,同時(shí)不會(huì)對(duì)代碼產(chǎn)生任何實(shí)質(zhì)性的影響。編譯階段編譯器會(huì)對(duì)上述代碼進(jìn)行優(yōu)化,while(0)語(yǔ)句實(shí)際上是不會(huì)執(zhí)行的,因此上述Do^.while(0)結(jié)構(gòu)是不會(huì)損失性能的。2)逗號(hào)表達(dá)式'、,”其可以保證多條語(yǔ)句可以作為一個(gè)整體執(zhí)行。雖然是正確的,但擴(kuò)展后不便于理解,因此使用較少。1.3.3宏函數(shù)的副作用利用上述宏函數(shù)的基本規(guī)則求最小值的代碼如下:Temp=MIN(*p++,b);宏函數(shù)只是將參數(shù)完全替換,即MIN(*p++,b),進(jìn)行宏展開后為((*p++)<=(b)?(*p++):(b))如果(*p++)<=(b)成立,則表達(dá)式的值為(*p++),但由于在(*p++)<=(b)判斷過程中改變了p的值,使得此時(shí)的?(*p++)非(*?++)<=(b)中的值了,違背了?號(hào)表達(dá)式的原意。盡管上述代碼符合上面我們所說的宏參數(shù)及語(yǔ)句使用規(guī)則,擴(kuò)展后仍然會(huì)出現(xiàn)問題,對(duì)于宏來說唯一的解決方案是避免宏參數(shù)為表達(dá)式,即改為:x=*p++;Temp=MIN(x,b);這樣帶入的參數(shù)x即為一個(gè)確定的值,符合設(shè)計(jì)要求。通常函數(shù)參數(shù)為表達(dá)式的唯一目的是為了支持鏈?zhǔn)奖磉_(dá),可以省去一個(gè)變量,除此之外并不會(huì)提高運(yùn)行性能。同時(shí)對(duì)于參數(shù)入棧的順序并沒有統(tǒng)一的規(guī)定,這樣某些編譯器的差異會(huì)導(dǎo)致表達(dá)式參數(shù)值與設(shè)計(jì)的差異。因此應(yīng)避免使用表達(dá)式參數(shù)。從上面的闡述,可以看到宏有一些難以避免的問題,怎么解決呢??jī)?nèi)聯(lián)函數(shù)是代碼被插入到調(diào)用者代碼處的函數(shù)。如同宏函數(shù),內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率,尤其是它能夠通過調(diào)用被編譯器優(yōu)化。內(nèi)聯(lián)函數(shù)和宏函數(shù)很類似,而本質(zhì)區(qū)別在于,宏是由預(yù)處理器對(duì)宏進(jìn)行替代,而內(nèi)聯(lián)函數(shù)是通過編譯器控制來實(shí)現(xiàn)的。而且內(nèi)聯(lián)函數(shù)是真正的函數(shù),只是在需要用到的時(shí)候,內(nèi)聯(lián)函數(shù)像宏一樣的展開,所以取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開銷,因此其執(zhí)行速度比一般函數(shù)要快。你可以象調(diào)用函數(shù)一樣來調(diào)用內(nèi)聯(lián)函數(shù),而不必?fù)?dān)心會(huì)產(chǎn)生于宏函數(shù)的一些問題。由上面的兩者的特性可知,我們可以用內(nèi)聯(lián)函數(shù)完全取代預(yù)處理宏函數(shù)。內(nèi)聯(lián)inline函數(shù)將進(jìn)行參數(shù)檢查,求出參數(shù)的值后再將此值帶入函數(shù)中,因此((A)<=(B)?(A):(B))中的A是一致的。聲明內(nèi)聯(lián)函數(shù)看上去和普通函數(shù)非常相似:externvoidf(u32i,u8u8c);當(dāng)你定義一個(gè)內(nèi)聯(lián)函數(shù)時(shí),在函數(shù)定義前加上inline關(guān)鍵字,并且將定義放入頭文件:inlinevoidf(u32i,u8u8c){//...}內(nèi)聯(lián)函數(shù)inline聲明必須是和函數(shù)體的定義放在一起,才有效。inlineu32function(u32i){returni*i;}這樣我們才算定義了一個(gè)內(nèi)聯(lián)函數(shù)。當(dāng)然,內(nèi)聯(lián)函數(shù)也有一定的局限性。就是函數(shù)中的執(zhí)行代碼不能太多了,如果,內(nèi)聯(lián)函數(shù)的函數(shù)體過大,一般的編譯器會(huì)放棄內(nèi)聯(lián)方式,而采用普通的方式調(diào)用函數(shù)。這樣,內(nèi)聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。另外對(duì)于不支持inline內(nèi)聯(lián)函數(shù)的編譯器來說,宏函數(shù)就是唯一的減少函數(shù)調(diào)用的途徑了。1.4Const修飾輸入指針參數(shù)在C語(yǔ)言中,大多數(shù)人的概念是"const意味著常量”,但實(shí)則不然,const僅意味著:”只能讀的普通變量”,可以稱其為”不能改變的變量”,盡管這個(gè)說法似乎很拗口,但卻最準(zhǔn)確的表達(dá)了C語(yǔ)言中const的本質(zhì)。const是用來修飾變量的,在定義時(shí)賦初值,在編譯階段需要的常量仍然只能以#define宏定義!Const只是一個(gè)修飾符,不管怎么樣a仍然是一個(gè)指向u32型數(shù)據(jù)的指針constu32*a;a是一個(gè)指向常整型數(shù)的指針,此最常見于函數(shù)參數(shù),指針可修改,但其指向的內(nèi)容不能修改。u32*consta;a是一個(gè)指向整型數(shù)的常指針,指針指向的整型數(shù)是可以修改的,但指針是不可修改的。u32const*aconst;a是一個(gè)指向常整型數(shù)的常指針,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的。上述定義方式的本質(zhì)在于:const在誰后面誰就不可修改,const在最前面則將其后移一位即可,二者等效也許你可能會(huì)問,即使不用關(guān)鍵字,也還是能很容易寫出功能正確的程序,那么我們?yōu)槭裁催€要如此看重關(guān)鍵字const呢?理由如下:關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息。例如,在函數(shù)的形參前添加const關(guān)鍵字意味著這個(gè)參數(shù)在函數(shù)體內(nèi)不會(huì)被修改,屬于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 冠宇創(chuàng)業(yè)團(tuán)隊(duì)介紹
- 電磁波的發(fā)現(xiàn)及應(yīng)用高二上學(xué)期物理人教版(2019)必修第三冊(cè)
- 2025瑞達(dá)科技經(jīng)銷合同(華東、華北)最終版
- 六年級(jí)品德與社會(huì)下冊(cè) 第二單元 人類的家園 1 只有一個(gè)地球教學(xué)設(shè)計(jì)2 新人教版
- 第2章 豐富多彩的生命世界第4節(jié) 生物的分類 教學(xué)設(shè)計(jì)-2024-2025學(xué)年浙教版七年級(jí)上冊(cè)科學(xué)
- 豐富多彩的民間美術(shù)(教學(xué)設(shè)計(jì))嶺南版美術(shù)四年級(jí)上冊(cè)
- 醫(yī)院防走失課件
- 第2課 排列圖標(biāo)找文件(教案)2023-2024學(xué)年三年級(jí)下冊(cè)信息技術(shù)閩教版
- 8人之初 教學(xué)設(shè)計(jì)-2024-2025學(xué)年統(tǒng)編版(2024)一年級(jí)語(yǔ)文下冊(cè)
- 2025年保健品連鎖加盟合同范本
- ERP沙盤模擬授課課件
- 三級(jí)動(dòng)火證 模板
- 教學(xué)用 高中英語(yǔ)學(xué)科新舊課標(biāo)對(duì)比
- 寧夏回族自治區(qū)吳忠市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 輸血反應(yīng)應(yīng)急預(yù)案演練記錄
- 康復(fù)專業(yè)課程標(biāo)準(zhǔn)
- 《人間詞話》ppt課件(PPT 50頁(yè))
- 生物質(zhì)循環(huán)流化床鍋爐最終版.ppt
- 固定收益部績(jī)效考核辦法
- 光纖端面清洗操作規(guī)范方案和判定標(biāo)準(zhǔn)
- 小型液壓機(jī)液壓系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論