




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Keil C51 中的函數(shù)指針和再入函數(shù),函數(shù)指針與overlay=調(diào)用樹的保存 C51不把函數(shù)參數(shù)壓棧(除非使用再入函數(shù))。函數(shù)參數(shù)和全局變量被存入寄存器或固定的存儲空間。這樣阻止函數(shù)的再入。例如,一個(gè)函數(shù)調(diào)用它自己,它將覆蓋它自己的參數(shù)或存儲空間。函數(shù)的再入問題通過關(guān)鍵字“reentrant”來解決。函數(shù)指針的非再入函數(shù)的副作用,在執(zhí)行中出現(xiàn)問題。MAIN函數(shù)調(diào)用FUNC和FUNC_CALLER(根據(jù)調(diào)用樹)。用函數(shù)的指針來傳遞參數(shù),調(diào)用樹往往會出錯(cuò)。=轉(zhuǎn) 這篇文章是由Keil C51
2、 的英文文檔翻譯過來的,很多語句都是根據(jù)自己的理解翻譯的,肯定還有許多地方需要推敲。希望讀者能吸取到有用的部分,不要被誤解了,自己多理解。 Overlay修改用于數(shù)據(jù)覆蓋的調(diào)用樹。如果在用戶程序里使用了函數(shù)指針,或者使用了像實(shí)時(shí)操作系統(tǒng)中調(diào)度器那樣的跳轉(zhuǎn)(k 指的是指針方式的調(diào)用嗎?),那么,修改程序調(diào)用樹將是很有必要的。混合編程:函數(shù)名
3、0; 符號名 解釋viod func(void FUNC 無參數(shù)傳遞,或不含寄存器參數(shù)的函數(shù)名不作改變
4、60; 轉(zhuǎn)入目標(biāo)文件中,名字只是簡單地轉(zhuǎn)為大寫形式viod func(char
5、60; _FUNC 帶寄存器參數(shù)的函數(shù)名加入“_”字符前綴,它表明
6、60; 這類函數(shù)包含寄存器內(nèi)的參數(shù)傳遞viod func(viod reentrant _?FUNC “_?”表示可重入,它表明該行數(shù)包含棧內(nèi)的參數(shù)傳遞。=將下面這篇的難點(diǎn)內(nèi)容提到前面使用函數(shù)指針的附加說明 如果你在C51中使用函數(shù)指針編程,有幾個(gè)附加的說明你必須注意。參數(shù)列表的限制 通過函數(shù)指針傳遞參數(shù)給函數(shù)必須把所有的參數(shù)存入寄存器。在大部分
7、情況下,3個(gè)參數(shù)能夠自動通過寄存器傳遞。在C51的用戶手冊中能找到傳遞參數(shù)進(jìn)入寄存器的運(yùn)算法則。但是并不保證,任何的3個(gè)數(shù)據(jù)類型可以傳遞。 因?yàn)镃51在寄存器中傳遞3個(gè)參數(shù),用于傳遞參數(shù)的存儲空間是不被分配的,除非函數(shù)指向一個(gè)要求更多參數(shù)的函數(shù)。如果在那樣的情況下,可以把參數(shù)混入一個(gè)結(jié)構(gòu)體中,然后通過一個(gè)結(jié)構(gòu)體指針傳遞參數(shù)。如果這樣不可接受,你可以使用再入函數(shù)(看下面)。 調(diào)用樹的保存 C51不把函數(shù)參數(shù)壓棧(除非使用再入函數(shù))。函數(shù)參數(shù)和全局變量被存入寄存器或固定的存儲空間。這樣阻止函數(shù)的再入。例如,一個(gè)函數(shù)調(diào)用它自己,它將覆蓋它自己的參數(shù)或存
8、儲空間。函數(shù)的再入問題通過關(guān)鍵字“reentrant”來解決。函數(shù)指針的非再入函數(shù)的副作用,在執(zhí)行中出現(xiàn)問題。 為了保護(hù)盡量多的數(shù)據(jù)空間,連接器執(zhí)行調(diào)用樹的性能分析,決定一些存儲空間被安全的覆蓋。例如,如果你的應(yīng)用中包含main 函數(shù),函數(shù)a,函數(shù)b,函數(shù)c,并且main函數(shù)調(diào)用a,b,c,但是a,b,c之間沒有互相調(diào)用。在你應(yīng)用中的調(diào)用樹見出現(xiàn)如下:MAIN + A + B + C這樣A,B,C的存儲空間可以被安全的覆蓋。 當(dāng)調(diào)用樹不能正確的建立,函數(shù)
9、指針將帶來問題。因?yàn)檫B接器不能決定函數(shù)之間的引用。在這個(gè)問題上,沒有自動的解決方法。 下面兩個(gè)源文件將解答這個(gè)問題,使問題容易明白。第一個(gè)源文件,包括一個(gè)函數(shù),它通過一個(gè)函數(shù)指針(fptr)調(diào)用另一個(gè)函數(shù)。 FPCALLER.C / 第一個(gè)源文件FPCALLER.C (文件名 void func_caller(long (code *fptr (unsigned int / (函數(shù)名
10、60; unsigned char i; for(i=0;i<10;i+ (*ftpr(i; 第二個(gè)源文件FPMAIN.C,包含C主函數(shù)和被func_caller調(diào)用的函數(shù)func。
11、 注意main函數(shù)調(diào)用func_caller,把func的地址作為參數(shù)傳遞給func_caller。 FPMAIN.C / 第二個(gè)源文件FPMAIN.C (文件名extern void func_caller (long (code * (unsigned int;int func (unsigned int count / (函數(shù)名 long j;
12、; long k; k = 0; for (j = 0; j < count; j+ k += j; return (k;/ -void main (voidfunc_caller (func;while (1 ; 上面的兩個(gè)的源文件編譯和鏈接都沒有錯(cuò)誤。通過連接器,調(diào)用樹的映射文件如下: SEGMENT
13、 DATA_GROUP +-> CALLED SEG
14、MENT START LENGTH-?C_C51STARTUP
15、0; - - +-> ?PR?MAIN?FPMAIN ?PR?MAIN?FPMAIN
16、; - - +-> ?PR?_FUNC?FPMAIN +-> ?PR?_FUNC_CALLER?FPCALLER ?PR?_FUNC?FPMAIN
17、; 0008H 000AH?PR?_FUNC_CALLER?FPCALLER 0008H 0003H 在這個(gè)簡單的例子中,許多信息可以從調(diào)用樹里挖掘出來。?C_C51STARTUP段調(diào)用main函數(shù)的?PR?MAIN?FPMAIN,段名各部分解析:PR是代碼存儲區(qū),MAIN是函數(shù)名,F(xiàn)PMAIN是定義函數(shù)所在的源文件名。
18、 MAIN函數(shù)調(diào)用FUNC和FUNC_CALLER(根據(jù)調(diào)用樹)。注意這是錯(cuò)誤的。MAIN函數(shù)沒有調(diào)用FUNC函數(shù),但是它傳遞FUNC函數(shù)的地址給FUNC_CALLER函數(shù)。同時(shí)注意,根據(jù)調(diào)用樹FUNC_CALLER沒有調(diào)用FUNC。這是因?yàn)镕UNC_CALLER是通過函數(shù)指針間接調(diào)用FUNC。 FPMAIN文件中的FUNC函數(shù)使用從0008H開始,長000AH字節(jié)的數(shù)據(jù)。FPCALLER文件中的FUNC_CALLER函數(shù)也使用從0008H開始,長0003H字節(jié)的數(shù)據(jù)。這是重要的。 FUNC_CALLER函數(shù)使用的存儲區(qū)從0008H開始,F(xiàn)UNC函數(shù)使用的存儲
19、區(qū)也是從0008H開始。因?yàn)镕UNC_CALLER函數(shù)調(diào)用FUNC函數(shù),又因?yàn)閮蓚€(gè)函數(shù)使用相同的存儲區(qū),這樣就產(chǎn)生了問題。當(dāng)FUNC函數(shù)被FUNC_CALLER函數(shù)調(diào)用時(shí),存儲區(qū)將被FUNC_CALLER破壞。這個(gè)問題是怎樣產(chǎn)生的?是由Keil 51編譯器產(chǎn)生還是由連接器產(chǎn)生? 這個(gè)問題的原因是函數(shù)指針。當(dāng)你使用函數(shù)指針時(shí),你將總是遇到這樣的問題。幸運(yùn)的是,他們是容易被修改的。“OVERLAY”指令讓你指定在調(diào)用樹中,函數(shù)與其他函數(shù)是怎樣連接的。 為了修正上面顯示的調(diào)用樹,F(xiàn)UNC函數(shù)必須從MAIN函數(shù)中刪除,同時(shí)FUNC函數(shù)必須插入到FUNC_
20、CALLER函數(shù)中。下面用“OVERLAY”指令修改后如下: OVERLAY (?PR?MAIN?FPMAIN ?PR?_FUNC?FPMAIN, ?PR?_FUNC_CALLER?FPCALLER ! ?PR?_FUNC?FPMAIN為了刪除或插入相關(guān)的進(jìn)入調(diào)用樹,指定第一調(diào)用和第二調(diào)用。“”符號用于刪除相關(guān)的函數(shù),“!”用于插入一個(gè)外部函數(shù)。例如?PR?MAIN?FPMAIN ?PR?_FUNC?FPMAIN,意義是從MAIN函數(shù)中刪除FUNC函數(shù)的調(diào)用。 經(jīng)過調(diào)整連接命令,包括用“OVERLAY”指令修正調(diào)用樹,調(diào)整后的映射文件如下: SE
21、GMENT DATA_GROUP +-> CALLED SEGMENT
22、60;START LENGTH-?C_C51STARTUP - - +-> ?PR?MAIN?FPMAIN?PR?MAIN?FPMAIN &
23、#160; - - +-> ?PR?_FUNC_CALLER?FPCALLER?PR?_FUNC_CALLER?FPCALLER 0008H 0003H / 模塊的地址 +-> ?PR?_FUNC?FPMAIN?PR?_FUNC?FPMAIN
24、; 000BH 000AH 修正后的調(diào)用樹中,F(xiàn)UNC_CALLER函數(shù)和FUNC函數(shù)使用獨(dú)立存儲空間。 函數(shù)指針列表 下面是一個(gè)典型的函數(shù)指針列表的定義:long (code *fp_tab (void = func1, func2, func3 ; 如果你的MAIN函數(shù)中通過fp_tab調(diào)用歌函數(shù),連接映射文件出現(xiàn)如下: SEGMENT
25、 DATA_GROUP +-> CALLED SEGMENT START LENGTH-?C_C51STARTUP
26、 - - +-> ?PR?MAIN?FPT_MAIN +-> ?C_INITSEG?PR?MAIN?FPT_MAIN 0008H 0001H?C_INITSEG
27、0; - - +-> ?PR?FUNC1?FP_TAB +-> ?PR?FUNC2?FP_TAB +-> ?PR?FUNC3?FP_TAB?PR?FUNC1?FP_TAB
28、160; 0008H 0008H?PR?FUNC2?FP_TAB 0008H 0008H?PR?FUNC3?FP_TAB 0008H
29、 0008H 三個(gè)函數(shù)通過列表被調(diào)用,F(xiàn)UNC1,F(xiàn)UNC2 和FUNC3被C_INITSEG調(diào)用。但是這是錯(cuò)誤的,C_INITSEG按照常規(guī)的方式在程序中初始化。這些函數(shù)被引入初始化代碼中,因?yàn)楹瘮?shù)指針列表被初始化成這些函數(shù)的地址值。 注意這些變量(FUNC1,F(xiàn)UNC2 和FUNC13)和MAIN函數(shù)的起始地址都是0008H。這樣不能正常工作,因?yàn)镸AIN函數(shù)調(diào)用FUNC1,F(xiàn)UNC2 和FUNC3(通過函數(shù)指針類表)。 C51編譯器和BL51連接器聯(lián)合工作,當(dāng)使用函數(shù)指針列表時(shí),使得函數(shù)變量空間覆蓋很容易。
30、但是,你必須合理的聲明指針列表。如果你這樣做了,就可以避免使用“OVERLAY”指令。下面的函數(shù)指針列表的定義,C51和BL51可以自動處理: code long (code *fp_tab (void = func1, func2, func3 ;注意唯一不同的是存儲列表在CODE空間。現(xiàn)在,連接映射文件如下: SEGMENT
31、60; DATA_GROUP +-> CALLED SEGMENT START LENGTH-?C_C51STARTUP - - +-&g
32、t; ?PR?MAIN?FPT_MAIN?PR?MAIN?FPT_MAIN 0008H 0001H +-> ?CO?FP_TAB?CO?FP_TAB
33、- - +-> ?PR?FUNC1?FP_TAB +-> ?PR?FUNC2?FP_TAB +-> ?PR?FUNC3?FP_TAB?PR?FUNC1?FP_TAB 0009H 0008H?PR?FUNC2?FP_TAB &
34、#160; 0009H 0008H?PR?FUNC3?FP_TAB 0009H 0008H 現(xiàn)在,初始化代碼中沒有引入FUNC1,F(xiàn)UNC2 和FUNC3。但是,MAIN函數(shù)中引入一個(gè)常數(shù)段FP_TAB。這是一個(gè)函數(shù)指針列表。因?yàn)楹瘮?shù)指針列表引入了FUNC1,F(xiàn)UNC2 和F
35、UNC3,所以調(diào)用樹是正確的。 只要把函數(shù)指針列表放在一個(gè)獨(dú)立的源文件中,在調(diào)用樹中,C51和BL51就能正確的連接。 函數(shù)指針的建議和技巧 有些函數(shù)指針的應(yīng)用技巧。使用指定空間的指針 把函數(shù)指針從一個(gè)普通的指針變成一個(gè)指定空間的指針。用一個(gè)字節(jié)保存指針。因?yàn)楹瘮?shù)屬于CODE存儲區(qū)(在8051里),一個(gè)字節(jié)可以用來保存聲明的函數(shù)指針作為CODE指針。例如: void (code *function_ptr (void = another_function;如果你選擇在你的函數(shù)指針聲明中包含code關(guān)鍵字,就可以在任何地方使用它
36、。如果你聲明一個(gè)函數(shù),它接收一個(gè)3字節(jié)的普通指針,通過指定空間傳遞,2字節(jié)函數(shù)指針,壞事將要產(chǎn)生。 再入函數(shù)和指針 Keil C51 為函數(shù)的再入提供關(guān)鍵字“reentrant”。再入函數(shù)的參數(shù)通過模擬棧來傳遞。模擬棧對于small存儲模式位于IDATA,對于compact存儲模式位于PDATA,對于large存儲模式位于XDATA。如果你使用再入函數(shù),在STARTUP.A51中你必須初始化再入棧的指針。參考下面的啟動代碼: ;-; Reentrant Stack Initilization; The following EQU sta
37、tements define the stack pointer for reentrant; functions and initialized it:; Stack Space for reentrant functions in the SMALL model.IBPSTACK EQU 0 ; set to 1 if small reentrant is used
38、.IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.; Stack Space for reentrant functions in the LARGE model.XBPSTACK EQU 0 ;
39、 set to 1 if large reentrant is used.XBPSTACKTOP EQU 0FFFFH+1 ; set top of stack to highest location+1.; Stack Space for reentrant functions in the COMPACT model.PBPSTACK EQU 0
40、0; ; set to 1 if compact reentrant is used.PBPSTACKTOP EQU 0FFFFH+1 ; set top of stack to highest location+1.;- 你必須設(shè)置你使用的存儲模式的堆棧和設(shè)置棧頂。當(dāng)有入棧時(shí),再入函數(shù)的棧指針減少(向下移動)。為了保護(hù)內(nèi)部的數(shù)據(jù)區(qū),有一個(gè)技巧就是把所有的再入函數(shù)放在一個(gè)獨(dú)立的存儲模式,像large或compact。 用reen
41、trant聲明再入函數(shù)。void reentrant_func (long arg1, long arg2, long arg3 reentrant 用large和reentrant聲明一個(gè)large模式的再入函數(shù)。void reentrant_func (long arg1, long arg2, long arg3 large reentrant 聲明一個(gè)再入函數(shù)的函數(shù)指針,必須使用reentrant關(guān)鍵字。 void (*rfunc_ptr (long, long, long reentrant = reentrant_func;再入函數(shù)的函數(shù)
42、指針和非再入函數(shù)的函數(shù)指針沒有許多不同。當(dāng)使用再入函數(shù)指針時(shí),會生成更多的代碼,因?yàn)閰?shù)被壓入模擬棧。然而,沒有特殊的連接要求和不需要打亂“OVERLAY”指令。 如果通過間接調(diào)用傳遞超過3個(gè)參數(shù)給函數(shù),需要再入函數(shù)指針。總結(jié) 函數(shù)指針是非常有用的,并不是很困難的,如果你注意連接調(diào)用樹,保證用“OVERLAY”指令修正一些沖突。=概述函數(shù)指針是C語言中幾個(gè)難點(diǎn)之一。由于8051的C編譯器的獨(dú)特要求,函數(shù)指針和再入函數(shù)有更多的挑戰(zhàn)需要克服。主要由于函數(shù)變量的傳遞。典型的(絕大部分8051芯片)函數(shù)變量通過堆棧的入棧和出棧命令來傳遞。因?yàn)?051只有有限的堆棧空間(128字
43、節(jié)或更少的64字節(jié)),函數(shù)變量必須通過不同的方式進(jìn)行傳遞。8051的PL/M-51編譯器,介紹在固定的存儲空間span存儲變量的方式。當(dāng)使用連接器時(shí),程序建立一個(gè)調(diào)用樹,計(jì)算出函數(shù)變量的互斥空間,然后覆蓋它們。這就是連接器的“OVERLAY”指令。因?yàn)镻L/M-51不支持函數(shù)指針,所以不能實(shí)現(xiàn)間接函數(shù)調(diào)用。然而,C語言中存在這樣的問題。連接器知道哪塊空間用于存儲間接函數(shù)的變量。怎樣間接加入函數(shù)進(jìn)入調(diào)用樹?本文解釋在C51編程中,怎樣有效使用函數(shù)指針。特別地,討論如下幾個(gè)話題:分配常量地址給一個(gè)指針;定義函數(shù)指針;C51中函數(shù)指針問題;使用OVERLAY指令確定調(diào)用樹;再入函數(shù)的指針;
44、;固定地址的指針 你很容易的給函數(shù)指針分配一個(gè)數(shù)字地址。有許多原因需要這樣做。例如,你需要復(fù)位目標(biāo)。你可以設(shè)置函數(shù)指針為0000H去實(shí)現(xiàn)。 你可以使用標(biāo)準(zhǔn)C語言的類型映射特點(diǎn),映射0X0000指針指向地址0的函數(shù)。例如,當(dāng)你編譯如下C代碼. (void (code *(void)0x0000) (); 編譯器產(chǎn)生如下如下代碼:
45、60; ;FUNCTION main (BEGIN ;SOURCE L
46、INE #30000 120000 LCALL 00H
47、160; SOURCE LINE #40003 22 RET FUNCTION main (END 這正是我們期望的:LCALL 0把一個(gè)數(shù)字常量映射成一個(gè)函數(shù)指針是一件很復(fù)雜的事情。下面關(guān)于上面的函數(shù)調(diào)用的各部分的描述,將幫助
48、你怎樣更好的使用它們。 在上面的函數(shù)調(diào)用中,(void ( * (void)是數(shù)據(jù)類型:一個(gè)不帶參數(shù)且返回void的函數(shù)指針。 0x0000是一個(gè)映射地址。經(jīng)過類型映射,函數(shù)指針指向地址0x0000。注意我們把一個(gè)圓括號放在數(shù)據(jù)類型和0x0000后面。如果我們僅僅想映射0x0000成為函數(shù)指針,這是不必要的。然而,因?yàn)槲覀儗⒁眠@個(gè)函數(shù),這些圓括號是必要的。 映射一個(gè)數(shù)值常量成為指針和通過指針調(diào)用函數(shù)是不同的。為了實(shí)現(xiàn)這個(gè),我們必須指定一個(gè)變量表。這就是為什么在此行的后面有一個(gè)()。 注意上面表達(dá)式中的所有圓括號都是必須的
49、。分組和優(yōu)先級是很重要的。 上面不帶參數(shù)的函數(shù)指針和帶參數(shù)的函數(shù)指針的唯一不同是數(shù)據(jù)類型和變量列表。例如,下面的函數(shù)調(diào)用. (long (code * (int int int 0x8000)(1,2,3;聲明一個(gè)函數(shù),地址在0x8000,接收3個(gè)int型參數(shù),返回long型結(jié)果。 不帶參數(shù)的函數(shù)指針 指向函數(shù)的函數(shù)指針是可變的。函數(shù)的地址是一個(gè)可變的數(shù)值。例如,下面的函數(shù)指針的聲明. void (*function_ptr (void;是一個(gè)調(diào)用 function_ptr的指針。使用下面
50、的代碼調(diào)用function_ptr函數(shù)。 (*function_ptr (;因?yàn)楹瘮?shù)沒有參數(shù)傳送,所以參數(shù)列表是空的。當(dāng)定義變量的時(shí)候,函數(shù)指針可以被分配地址:void (*function_ptr (void = another_fuction; 或者在程序執(zhí)行過程中被分配,function_ptr = another_fuction; 注意,必須分配一個(gè)地址給函數(shù)指針。如果沒有分配,函數(shù)指針將有一個(gè)0值(如果你運(yùn)氣好),或者有一些你完全不知道的數(shù)值,依賴于你的數(shù)據(jù)存儲區(qū)的使用情況。當(dāng)你間接的調(diào)用一個(gè)函數(shù)通過函數(shù)指針,如果函數(shù)指針沒
51、有初始化,你的程序?qū)⑹腔靵y的。 為了聲明一個(gè)帶返回值的函數(shù)指針,在聲明過程中你必須指定返回值的數(shù)據(jù)類型。例如,下面的聲明改變了上面的函數(shù)指針的聲明,返回一個(gè)float 數(shù)據(jù)。float (*function_ptr (void = another_fuction; 帶參數(shù)的函數(shù)指針 帶參數(shù)的函數(shù)指針與不帶參數(shù)的函數(shù)指針是相似的。例如: void (*function_ptr (int, long,char; 一個(gè)函數(shù)指針,帶一個(gè)int參數(shù),帶一個(gè)long參數(shù),帶一個(gè)char參數(shù)。使用下面的代碼調(diào)用函數(shù)。
52、0; (*function_ptr (12, 34L,A;注意,函數(shù)指針僅僅可以指向小于等于3個(gè)參數(shù)的函數(shù)。這是因?yàn)椋g接調(diào)用函數(shù)時(shí),參數(shù)必須保存在寄存器中。關(guān)于超過3個(gè)參數(shù)的函數(shù)指針的信息,在再入函數(shù)中介紹。 =標(biāo) 題: keil利用函數(shù)指針調(diào)用超過3個(gè)參數(shù)的函數(shù)問題 發(fā)信站: 水木社區(qū) (Thu Jun 23 22:37:58 2011, 站內(nèi) 我想利用函數(shù)指針實(shí)現(xiàn)對超過3個(gè)參數(shù)的函數(shù)進(jìn)行調(diào)用,但編譯總是出現(xiàn)錯(cuò)誤,代碼如下: void func(int a,i
53、nt b,int c,int d printf("in func:%d,%d,%d,%dn",a,b,c,d; void main(void void (* pf(int arg1, int arg2, int arg3,int arg4; pf = (void *func; pf(10,11,12,14; 但編譯總是出現(xiàn)如下錯(cuò)誤: error C212: indirect call: parameters do not fit within registers 查資料發(fā)
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 增強(qiáng)現(xiàn)實(shí)在智慧城市規(guī)劃與管理中的應(yīng)用研究
- 防曬唇膏滋潤型企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 餐飲預(yù)訂平臺行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 購物中心雞尾酒吧企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- BIPV系統(tǒng)設(shè)計(jì)軟件企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 2025年中國高層重鋼結(jié)構(gòu)型材市場調(diào)查研究報(bào)告
- 2025年中國碘鎢燈市場調(diào)查研究報(bào)告
- 2025年中國火蒜市場調(diào)查研究報(bào)告
- 2024年度浙江省二級注冊建筑師之建筑結(jié)構(gòu)與設(shè)備自我檢測試卷A卷附答案
- 2025年中國疊包機(jī)市場調(diào)查研究報(bào)告
- 胰島素注射 課件
- 2024年迪慶道路旅客運(yùn)輸知識考試題庫
- 上海市市轄區(qū)(2024年-2025年小學(xué)四年級語文)統(tǒng)編版期末考試((上下)學(xué)期)試卷及答案
- 小超市食品安全管理制度
- β內(nèi)酰胺類抗菌藥物皮膚試驗(yàn)指導(dǎo)原則2024課件
- 全過程工程咨詢管理服務(wù)方案投標(biāo)方案(技術(shù)方案)
- 皮膚科進(jìn)修后匯報(bào)
- 貴州省銅仁市2023-2024學(xué)年七年級下學(xué)期期末生物試題(解析版)
- 表觀遺傳學(xué)智慧樹知到期末考試答案章節(jié)答案2024年東北師范大學(xué)
- 蘭州大學(xué)強(qiáng)基計(jì)劃試題
- 供應(yīng)商定期評價(jià)表(精簡版)
評論
0/150
提交評論