版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 4.1《喜看稻菽千重浪》課件+2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- 2024年體育院校校企合作協(xié)議書范文
- 4s店維修包干協(xié)議書范文
- XRF 基本原理及構(gòu)造
- 云計(jì)算在IT行業(yè)的應(yīng)用
- 保護(hù)環(huán)境共建美好家園
- 《核電廠二回路系統(tǒng)阻垢劑核級(jí)化學(xué)分散劑PAA》-編制說明(征求意見稿)
- 新入員工安全培訓(xùn)試題附答案【黃金題型】
- 公司項(xiàng)目部管理人員安全培訓(xùn)試題及答案
- 廠里職工安全培訓(xùn)試題含完整答案(歷年真題)
- 《人工智能導(dǎo)論》(第2版)高職全套教學(xué)課件
- 古詩(shī)詞誦讀《靜女》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- 2024統(tǒng)編新版小學(xué)四年級(jí)語(yǔ)文上冊(cè)第六單元 大單元整體教學(xué)設(shè)計(jì)
- 中國(guó)華電新疆發(fā)電有限公司社招在線筆試
- 2024-2030年中國(guó)雷電防護(hù)(防雷)產(chǎn)業(yè)營(yíng)銷格局與投資戰(zhàn)略規(guī)劃策略研究報(bào)告
- 2024-2030年中國(guó)結(jié)腸癌行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 2024年全國(guó)統(tǒng)計(jì)師之中級(jí)統(tǒng)計(jì)相關(guān)知識(shí)考試絕密預(yù)測(cè)題詳細(xì)參考解析
- 江西省第一屆職業(yè)技能大賽分賽場(chǎng)項(xiàng)目技術(shù)文件(世賽選拔)木工
- 小學(xué)科學(xué)實(shí)驗(yàn)室安全工作自查報(bào)告范文
- JTGT B06-02-2007 公路工程預(yù)算定額
- 道路機(jī)場(chǎng)與橋隧工程模擬試題含答案
評(píng)論
0/150
提交評(píng)論