Qualcomm手機(jī)開機(jī)全過程大揭密_第1頁(yè)
Qualcomm手機(jī)開機(jī)全過程大揭密_第2頁(yè)
Qualcomm手機(jī)開機(jī)全過程大揭密_第3頁(yè)
Qualcomm手機(jī)開機(jī)全過程大揭密_第4頁(yè)
Qualcomm手機(jī)開機(jī)全過程大揭密_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要:

本文試圖通過代碼來深入剖析Qualcomm手機(jī)開機(jī)的整個(gè)過程,即從按下開機(jī)鍵一直到出現(xiàn)待機(jī)界面,Qualcomm的手機(jī)軟件在整個(gè)流程中究竟完成了哪些工作。本文的主要目標(biāo)是理清手機(jī)的初始化流程,并為今后Amoi定做初始化工作提供一個(gè)參考。

關(guān)鍵字:開機(jī)、Rex、TMC、ui_task、CoreApp

一、開機(jī)的簡(jiǎn)要流程分析

Qualcomm的平臺(tái)軟件支持兩種啟動(dòng)方式:一種是NorFlash啟動(dòng)方式,另外一種就

是NandFlash啟動(dòng)方式。NorFlash啟動(dòng)方式就相當(dāng)于硬件直接找到一個(gè)入口點(diǎn)開始執(zhí)行代碼,相比較而言會(huì)比較簡(jiǎn)單,且Amoi沒有采用此種方式,所以本文對(duì)于這種方式不做詳細(xì)分析。另外一種就是NandFlash啟動(dòng)方式,這種方式和PC的啟動(dòng)方式比較相像,也是Amoi采用的Boot方式,下面將詳細(xì)分析在此方式下面的開機(jī)過程。

按下開機(jī)鍵之后,將產(chǎn)生一個(gè)時(shí)鐘中斷,從而通知AMSS主芯片的BootLoad硬件去將放置于NandFlash上面的第一個(gè)Block(8K)里面的Boot代碼Copy到內(nèi)核內(nèi)存(RAM,這個(gè)內(nèi)存應(yīng)該是CPU自帶的內(nèi)存,同后面提到的SDRAM有一定區(qū)別,可以把它當(dāng)作CPU的Cache)的0xFFFF0000地址,并開始執(zhí)行Boot代碼。Boot的主要任務(wù)是完成整個(gè)系統(tǒng)的硬件初始化工作(類似于PC上面的BIOS所完成的硬件自檢工作,至于Boot的詳細(xì)工作機(jī)制,后文會(huì)有詳細(xì)描述)。Boot所完成的工作里面,最重要的一件事就是會(huì)將整個(gè)手機(jī)軟件代碼(AMSS軟件包)拷貝到SDRAM中,并最后將控制權(quán)交給AMSS軟件。說白了,就是Boot執(zhí)行完成之后,代碼的執(zhí)行點(diǎn)將由Boot跳轉(zhuǎn)到AMSS軟件的的入口點(diǎn)函數(shù)main().(此函數(shù)在mobile.c里實(shí)現(xiàn))。

代碼運(yùn)行到了Main()之后,在這個(gè)函數(shù)里面將完成操作系統(tǒng)(rex)的初始化工作,其實(shí)現(xiàn)方法是調(diào)用

rex_init()。Rex_init()完成的工作很簡(jiǎn)單:

1.完成操作系統(tǒng)必要的一些數(shù)據(jù)結(jié)構(gòu)(timer鏈表、任務(wù)鏈表等))的初始化之外;

2.接下來,它創(chuàng)建了三個(gè)任務(wù),分別是:rex_idle_task、rex_dpc_task和tmc_task。

Idle任務(wù)沒什么好解釋的,目前這個(gè)任務(wù)為空,什么也沒做,dpc_task目前不知道是做什么的,暫時(shí)可以不用管。前面的這兩個(gè)任務(wù)都屬于操作系統(tǒng)層面的,由操作系統(tǒng)來維護(hù),和手機(jī)軟件關(guān)系不大。哪一個(gè)和手機(jī)軟件關(guān)系大呢?答案是:tmc_task。大家可以把這個(gè)當(dāng)作操作系統(tǒng)的入口(主)任務(wù),也可以把它當(dāng)作整個(gè)手機(jī)軟件的入口任務(wù)。即AMSS軟件里的所有其它任務(wù)的創(chuàng)建和維護(hù)就是由這個(gè)tmc_task來完成的。

到此為止,整個(gè)AMSS軟件還并沒有跑起來,只是跑到了tmc_task里面了。在tmc_task里面,會(huì)調(diào)用tmc_init()來完成整個(gè)AMSS軟件包的初始化工作,其中最重要的一項(xiàng)工作就是調(diào)用tmc_define_tasks()將AMSS軟件包所有需要的任務(wù)都創(chuàng)建起來了。比如說slee_task、dog_task、cm_task、wms_task、ui_task等。這些任務(wù),一般不需要直接和AL層軟件打交道,但請(qǐng)大家記住,手機(jī)上所有功能的實(shí)現(xiàn)最根本點(diǎn)就是由這些服務(wù)組件(ServiceTask)來完成的。將來大家跟蹤一個(gè)具體的功能模塊時(shí),比如說通話模塊,如果需要,可以再去深入研究它的具體實(shí)現(xiàn)。

好了,到現(xiàn)在為止,所有的AMSS核心軟件就全部跑起來了(手機(jī)的功能模塊,在軟件方面就體現(xiàn)為OS層面的一個(gè)任務(wù))。但現(xiàn)在大家還根本看不到Brew和AEE的影子。呵呵,各位不要急。到了這個(gè)層面之后,我想稍微多說幾句。最早的Qualcomm平臺(tái),比如說5xxx系列,是根本沒有Brew的,那個(gè)時(shí)候的AL(ApplicationLayer)層軟件開發(fā),是直接調(diào)用底層Servicetask所提供的API來完成相應(yīng)的工作的。從這種角度來看的話,顯然那時(shí)的開發(fā)是比較郁悶和難度較高的。不過,到了65xx之后,Qualcomm平臺(tái)引入了Brew,手機(jī)開發(fā)商就沒必要去從這么底層(ServiceAPI)的層面進(jìn)行手機(jī)開發(fā)了,他們完全可以基于Brew來實(shí)現(xiàn)一臺(tái)手機(jī)的所有功能(Qualcomm給我們的參考代碼,就是全Brew平臺(tái)的)。

Brew的運(yùn)行環(huán)境AEE是如何跑起來的呢?關(guān)鍵在于ui_task(),由于ui_task和我們手機(jī)開發(fā)的關(guān)系非常密切,其地位也相當(dāng)重要,所以,后文我將單獨(dú)對(duì)它進(jìn)行一個(gè)深入的研究與分析。到目前為止,大家只需要知道ui_task將AEE加載起來了,并且,它起到了一個(gè)中間層的作用,即所有AMSS底層服務(wù)組件的消息,都將經(jīng)由ui_task而轉(zhuǎn)到AEE,并最終轉(zhuǎn)到具體的App(Applet)的執(zhí)行代碼里面(HandleEvent())。

注意:

1.上述的開機(jī)過程,在每一次按開機(jī)鍵都需要走一遍,即關(guān)機(jī)之后,整個(gè)系統(tǒng)的所有功能都將消失,而不像有些手機(jī),看起來是關(guān)了機(jī),但實(shí)際上底層還是有一些軟件模塊在跑。為什么可以肯定地說上述開機(jī)過程每次都必須走一遍,原因很簡(jiǎn)單,因?yàn)槲覀兊钠脚_(tái)軟件是基于NandFlash啟動(dòng)的,所有的代碼都需要Copy到SDRAM才能運(yùn)行,而關(guān)機(jī)斷電之后,SDRAM里的東東會(huì)全部丟失,所以,毫無疑問,上述的過程必須每次開機(jī)都執(zhí)行;

2.關(guān)機(jī)的過程相對(duì)比較簡(jiǎn)單,系統(tǒng)檢測(cè)到關(guān)機(jī)中斷之后,將調(diào)用tmc_powerdown_handler()來完成關(guān)機(jī)動(dòng)作,它將把所有AMSS的任務(wù)都Stop掉,并最后調(diào)用rex_exit()退出Rex,從而完成整個(gè)關(guān)機(jī)動(dòng)作。

3.顯然,關(guān)機(jī)動(dòng)作前,如果有必要,每一個(gè)任務(wù)必須將它希望保存的信息保存到Flash上面,以便下次開機(jī)時(shí)可以得到這些信息;

開機(jī)流程簡(jiǎn)圖

/p-3853281.html

[attach]1237[/attach]

說明:

1.Tmc是操作系統(tǒng)層面和AMSS軟件關(guān)系最密切的一個(gè)任務(wù),不過需要OEM商在此處修改的地方應(yīng)該不多;

2.ui_task是在操作系統(tǒng)層面,OEM商需要重點(diǎn)研究清楚的一個(gè)任務(wù),它是連接底層Task和上層AL的一個(gè)中間層,有可能需要加入OEM商的操作流程;

3.CoreApp是在Brew層面的一個(gè)AL層的入口Applet,它其著管理整個(gè)上層AL層軟件的作用,根據(jù)產(chǎn)品需求,這個(gè)App需要定做;

4.AEE是整個(gè)上層App的運(yùn)行環(huán)境,目前Qualcomm沒有公開它的源碼,但它的運(yùn)行機(jī)制,Amoi需要好好研究清楚,我將在另外一篇《Qualcomm平臺(tái)AEE運(yùn)行機(jī)制深入分析與研究》中探討它的運(yùn)行機(jī)理和調(diào)度機(jī)制,大家有興趣可以參考此文;二、Boot代碼深入分析

Boot代碼大部分是用匯編語(yǔ)言寫的,也有小部分,可能需要由OEM商修改,所以用C語(yǔ)言來寫。另外,Boot代碼屬于Driver范圍,所以大家可以在drivers/boot目錄里面找到相應(yīng)的代碼。Boot的代碼組織得非常模塊化,整個(gè)boot的入口點(diǎn)是在Boot_function_table.s里面,這個(gè)匯編代碼里面實(shí)際上是將Boot需要完成的任務(wù)封裝成了不同的函數(shù),由不同的函數(shù)來完成相應(yīng)的工作,接下來,我將深入分析這些函數(shù)所完成的工作,如下所述。

a)mmu_enable_instruction_cache;

這個(gè)只有在Nand啟動(dòng)模式時(shí)才需要,打開ARM的指令Cache.

b)boot_hw_ctrl_init

此函數(shù)主要是完成兩條總線(EBI1、EBI2)控制器的初始化,這個(gè)函數(shù)執(zhí)行完了之后,系統(tǒng)就可以知道兩條總線上連接了哪些設(shè)備,同時(shí)也可以找得到這些設(shè)備,不過,至于單個(gè)設(shè)備自身的初始化,則不在這里。

[注]

這個(gè)函數(shù)很重要,OEM商如果需要加新的設(shè)備到系統(tǒng)中(掛在兩條總線上),則需要定做此模塊,目前階段主要是內(nèi)存。另外,如前文所述,這個(gè)函數(shù)是由C語(yǔ)言來寫的,主要目的就是為了方便OEM商定做。內(nèi)存設(shè)備的修改,可以在這個(gè)模塊里找到相應(yīng)的數(shù)據(jù)結(jié)構(gòu),相對(duì)還是比較簡(jiǎn)單的。

c)boot_hw_tlmm_init

1.晶振時(shí)鐘的初始化;

2.中斷表的初始化;

3.GPIO的初始化;

4.Msm本身的驅(qū)動(dòng),除了EBI2;

d)boot_rom_test

這個(gè)函數(shù)非常簡(jiǎn)單,只是做一個(gè)很簡(jiǎn)單的Rom檢查.(比對(duì)兩個(gè)標(biāo)志位來檢查,并沒有一塊一塊地去檢查)。

e)boot_ram_test

Ram自檢,具體算法其實(shí)也很簡(jiǎn)單,就是讀、寫內(nèi)存以判斷是否成功。

f)boot_ram_init

1.拷貝手機(jī)代碼從NandFlash到SDRAM。

a.Image__BB_RAM__Base:CoreCode;

b.Image__APP_RAM__Base:AppCode;

[注]

上述動(dòng)作是分塊進(jìn)行的,原因是因?yàn)镼ualcomm支持分塊BootLoad.

2.將Image__ZI_REGION__ZI區(qū)域初始化為0;

3.初始化OEM要求的動(dòng)態(tài)Heap;

4.至于代碼段里的數(shù)據(jù)初始化,直接在Image里就完成了(編譯器完成);

g)boot_stack_initialize

ARM棧初始化,主要是為分塊代碼加載而預(yù)留的.

h)boot_cache_mmu_init

ARMMmu初始化

注意:到此為止,整個(gè)Boot的工作就告完結(jié)了,那么,它又是如何跳到AMSS的main入口點(diǎn)呢?原因很簡(jiǎn)單,ARM編譯器在鏈接的時(shí)候會(huì)自動(dòng)做出一個(gè)__rt_entry(),由此函數(shù)來完成ARM庫(kù)函數(shù)的初始化,并最后將代碼執(zhí)行點(diǎn)跳轉(zhuǎn)到main()。而__rt_entry()會(huì)在boot_reset_handler.s里調(diào)用,具體細(xì)節(jié),大家可以不用太過關(guān)心,只需要明白,Boot跑完之后,手機(jī)軟件就跑到了main里就Ok了。三.Ui_task的深入分析

從大的方向來講,ui_task只完成兩件事,一件是必要的初始化工作(這個(gè)也是我們所關(guān)心的,即ui_task到底完成了哪些工作);另外一件事就是各種信號(hào)量的事件處理,這也是我們比較關(guān)心的,即ui_task到底將哪些事件轉(zhuǎn)發(fā)給了上層App。搞清楚了上述兩點(diǎn),我們也就能大致把ui_task的承上啟下的工作機(jī)理研究清楚。

1.ui_Init;

初始化過程中,ui_task主要完成了如下幾件事。

a)創(chuàng)建一個(gè)用于KickWatchdog的定時(shí)器,這樣WatchDog能夠及時(shí)得到Kick,假如今后發(fā)現(xiàn)手機(jī)在ui_task里面自動(dòng)重啟,很有可能就是這個(gè)定時(shí)器的Timeout設(shè)置得過短而造成的;

b)注冊(cè)通話相關(guān)的回調(diào),主要是和緊急呼叫相關(guān);

c)電話本初始化,之所以要進(jìn)行這個(gè)工作,主要是加快開機(jī)之后AL層軟件操作電話本的速度,但這樣將有可能導(dǎo)致開機(jī)速度過慢,如果開機(jī)速度過慢,可以考慮進(jìn)入待機(jī)界面之后,在后臺(tái)開一個(gè)task去完成這項(xiàng)工作;

d)初始化Sound設(shè)備;

e)向底層服務(wù)任務(wù)wms_task注冊(cè)wms回調(diào),這個(gè)回調(diào)是在IWms組件里實(shí)現(xiàn)的。從這種角度來看,u幫我們把wms_task和IWMS組件聯(lián)系起來了,但并沒有去將AL層軟件和IWMS聯(lián)系起來,這個(gè)工作將是由AL層軟件自己去完成。當(dāng)然,注冊(cè)回調(diào)的這個(gè)工作也是可以在AL層完成,之所以在這里完成,而不是在AL層完成,其主要目的是這個(gè)工作可以做到與AL層無關(guān),即AL層不需要關(guān)心這個(gè)事情,但這個(gè)事情是短消息功能得于實(shí)現(xiàn)的必須步驟;

f)注冊(cè)鍵盤消息回調(diào);

通過這個(gè)回調(diào),所有的按鍵消息都將經(jīng)由底層的hs_task傳到此回調(diào)函數(shù)里。然后回調(diào)函數(shù)將把所有的按鍵信息放到一個(gè)全局變量ui_key_buffer里面,接著發(fā)送一個(gè)UI_KEY_SIG信號(hào)給ui_task通知它去處理按鍵信息,至于ui_task如何處理按鍵消息的,后面的ui_handleSignals里會(huì)有詳細(xì)描述。

g)初始化Lcd,這個(gè)工作不是LCD硬件設(shè)備的真正初始化,只是一些UI需要用到的LCD數(shù)據(jù)結(jié)構(gòu)的初始化,和我們關(guān)系不大;

[注]

硬件的初始化,全部都在hs_task里面完成,從這種角度來看的話,系統(tǒng)能跑到ui_task里面,表明所有的硬件設(shè)備的驅(qū)動(dòng)都已經(jīng)成功加載。

h)置開機(jī)標(biāo)志ui_powerup為True;

i)注冊(cè)IPC信號(hào)量UI_IPC_SIG,這個(gè)可以暫時(shí)不管;

j)bridle_InitSWITable的初始化,這個(gè)目標(biāo),暫時(shí)不知道,也可以先略過;

k)初始化資源文件,其主要工作就是在Rom里面建立資源文件的符號(hào)鏈表,這樣就可以讓系統(tǒng)找到這些資源文件了(資源文件是被編譯在代碼段的,假如不這樣做的話,系統(tǒng)將找不到這些資源文件);

l)Brew運(yùn)行環(huán)境AEE的初始化:AEE_Init,這個(gè)函數(shù)看不到代碼,大家只需要知道,到了這一步,整個(gè)Brew也就Run起來了,在AEE初始化完成之后,它將自動(dòng)啟動(dòng)一個(gè)Applet,即CoreStartApp,而CoreStartApp將把CoreApp啟動(dòng)起來;

m)到此為止,ui_task的初始化工作完成;

[注意]

1)從上述的ui_task的初始化工作可以看出,ui_task并沒有完成手機(jī)AL層軟件的基本功能的初始化,比如說Sim卡檢測(cè)、網(wǎng)絡(luò)初始化等,這些工作,應(yīng)該是在CoreApp里完成的。

2)真正和手機(jī)功能相關(guān)的初始化工作,是在CoreApp里完成的,這個(gè)Applet的工作機(jī)理,后面也會(huì)有詳細(xì)描述;

2.ui_HandleSignals;

ui_task主要完成如下事件的處理。

a)看門狗喂食;

b)TASK_STOP_SIG信號(hào),任務(wù)Stop,目前這個(gè)任務(wù)為空,沒做任何事;

c)TASK_OFFLINE_SIG的處理,這幾個(gè)任務(wù)都屬于操作系統(tǒng)層面的事件,目前我們可以暫時(shí)不管;

d)處理關(guān)機(jī)信號(hào):CoreAppHandleStopSig(),這個(gè)只是處理ui_task在關(guān)機(jī)前需要完成的任務(wù),比如說發(fā)送一個(gè)消息給CoreApp讓它關(guān)掉自己,然后將ui_task關(guān)閉;

系統(tǒng)的真正關(guān)機(jī)信號(hào)是由tmc來處理,當(dāng)它發(fā)現(xiàn)需要關(guān)機(jī)時(shí),調(diào)用tmc_powerdown_handler來完成相應(yīng)的工作,在這里就是給所有的任務(wù)發(fā)送TASK_STOP_SIG的信號(hào)。

深層次的關(guān)機(jī)處理,不需要我們了解,也沒必要去知道,我們只需要知道在ui_task里面把該關(guān)的關(guān)掉就Ok了。

關(guān)機(jī)是一個(gè)層層深入的過程,每一個(gè)App或者任務(wù)只需要負(fù)責(zé)將它們自己創(chuàng)建的資源釋放掉就Ok了。而關(guān)機(jī)的導(dǎo)引線,顯然是在CoreApp里截獲到關(guān)機(jī)鍵之后發(fā)送出來的,事實(shí)上也是如此。

e)網(wǎng)絡(luò)掉線時(shí),發(fā)送掉線信號(hào)給CoreApp;

其實(shí)這個(gè)信號(hào)完全可以在CoreApp里面,自己去注冊(cè),然后及時(shí)更新自己的網(wǎng)絡(luò)狀態(tài),就不知有沒有這種接口函數(shù)。

f)處理按鍵消息,其主要完成如下的工作:

i.打開背光;

ii.特理按鍵到虛鍵值的轉(zhuǎn)換;

iii.按鍵聲音的處理;

iv.將按鍵消息傳送到AEE執(zhí)行環(huán)境,由它去負(fù)責(zé)按鍵的派發(fā);

[注]

1.背光的打開是由ui默認(rèn)完成的,那這樣的話,假如我不想按鍵時(shí)有背光,是否可行?看來就得修改此處的代碼;

2.AEE的按鍵派發(fā)機(jī)制如何?它能否保證處于顯示最上層的App永遠(yuǎn)是可以得到Key的App,即假如一個(gè)Applet將自身Hide,它是否依然可以得到Key,而其它的Applet是否就不可以得到了?很怕也像EMP一樣出現(xiàn)焦點(diǎn)丟失的情況;

g)處理AEE_APP_SIG信號(hào)量,完成AEE的調(diào)度工作,這個(gè)任務(wù)是ui完成的最重要的一項(xiàng)工作,因?yàn)樯蠈拥腁pp需要定時(shí)進(jìn)行調(diào)度,目前看來,這個(gè)調(diào)度工作是由AEE_APP_SIG觸發(fā)的,而AEE_APP_SIG這個(gè)信號(hào)量,則由操作系統(tǒng)層面的一個(gè)定時(shí)器定時(shí)發(fā)送的?,F(xiàn)在大家只要了解,AEE_Dispatch會(huì)定時(shí)調(diào)用就Ok了,至于更詳細(xì)的AEE調(diào)度機(jī)制,可以參考我的另外一篇《AEE運(yùn)行機(jī)制深入分析與研究》;

h)處理AEE_SIO_SIG信號(hào)量,這個(gè)看不到代碼,暫時(shí)略過不管;

3.結(jié)論

通過上述對(duì)于ui_task的分析,可以看出,ui_task真正和手機(jī)功能有關(guān)系的(即可能需要定制或者修改的地方),主要就是初始化資源文件和處理按鍵消息這兩部分。至于其它部分,目前都不需要Amoi關(guān)心。手機(jī)真正功能的實(shí)現(xiàn),比如說開機(jī)Logo的顯示、Sim卡的檢查、Pin碼校驗(yàn)等,都是在CoreApp里面完成的。四.CoreApp的深入分析

目前參考代碼里面的CoreApp所完成的工作比較多且雜,主要說來有如下幾件事。

a)系統(tǒng)組件初始化;

b)開機(jī)Logo的顯示;

c)Sim卡檢測(cè)和Pin碼校驗(yàn);

d)系統(tǒng)狀態(tài)信息更新;

i.電池狀態(tài);

ii.網(wǎng)絡(luò)信號(hào);

iii.網(wǎng)絡(luò)模式;

e)IAnnunciator的維護(hù)與更新;

f)通話處理,打電話的輸入框;

g)主菜單處理;

h)手機(jī)各種設(shè)置功能的處理;

i)關(guān)機(jī)鍵的處理;

目前CoreApp里面的代碼,完成了太多的事,其實(shí)完全可以剝離成不同的模塊來完成,大致可以分成如下幾個(gè)部分。

1、總控模塊;(CoreApp)

總控模塊,主要完成手機(jī)按下開機(jī)鍵之后的各種初始化工作,同時(shí)此模塊也是整個(gè)手機(jī)的控制中心,由它來完成手機(jī)的一些全局性工作,主要有如下幾項(xiàng)。

1.系統(tǒng)初始化、Sim卡檢測(cè)和Pin碼校驗(yàn);

2.開機(jī)Logo或者開機(jī)動(dòng)畫的顯示;

3.底層服務(wù)程序的啟動(dòng);(WmsApp、DialApp等);

4.系統(tǒng)配置信息的統(tǒng)一管理;

由于寫配置信息到NV上面是一件非常慢的工作,每次上層App改變配置之后都去操作NV,很影響速度。所以,可以在內(nèi)存中開一個(gè)配置信息的Buffer,上層App操作的實(shí)際上是這個(gè)Buffer,然后由Core在空閑的時(shí)候再統(tǒng)一寫到NV上去。

5.關(guān)機(jī)處理;

[注]

由于CoreApp是在IdleApplet的界面之下,所以,為了能夠?qū)崿F(xiàn)“一鍵回菜單”的功用,有可能需要修改ui_task里面的Key處理函數(shù),將所有的Key消息轉(zhuǎn)發(fā)給Core,這樣Core就可以得到所有的Key事件了。(現(xiàn)在的ui_task只把Key事件發(fā)送給了AEE,而AEE只會(huì)將Key事件發(fā)送給當(dāng)前活動(dòng)Applet)。

2、I

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論