




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)移植概述 所謂操作系統(tǒng)的移植,是指一個(gè)操作系統(tǒng)能夠在某個(gè)微處理器平臺上運(yùn)行。 操作系統(tǒng)C/OS-II是一個(gè)基于優(yōu)先級的搶占式實(shí)時(shí)多任務(wù)內(nèi)核。C/OS-II的大部分代碼是用ANSI C語言編寫的,也包含一小部分匯編語言代碼,使之可以提供給不同架構(gòu)的微處理器使用。至今,從8位到64位,C/OS-II已經(jīng)在多種不同架構(gòu)的微處理器上移植成功。第1頁/共129頁C/OS-II移植綱要Phase 1Phase 21.1. C/OS-IIC/OS-II移植的條件移植的條件2.2.編譯器的選擇編譯器的選擇3.3.工作狀態(tài)的選擇工作狀態(tài)的選擇4.4.工作模式的選擇工作模式的選擇5.BootLoader5
2、.BootLoader6.6.系統(tǒng)初始化流程系統(tǒng)初始化流程7.7.最小啟動(dòng)代碼編寫最小啟動(dòng)代碼編寫8.8.C/OS-IIC/OS-II相關(guān)文件修改相關(guān)文件修改移植前的規(guī)劃移植前的規(guī)劃操作系統(tǒng)移植操作系統(tǒng)移植 測試驗(yàn)證測試驗(yàn)證 第2頁/共129頁P(yáng)hase 1 移植前的規(guī)劃C/OS-IIC/OS-II移植的條件移植的條件1234編譯器的選擇編譯器的選擇工作狀態(tài)的選擇工作狀態(tài)的選擇工作模式的選擇工作模式的選擇第3頁/共129頁 COS-II移植的條件 處理器的C編譯器能產(chǎn)生可重入代碼; 在程序中可以打開/關(guān)閉中斷; 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常為10-100Hz); 處理器能支持一定數(shù)
3、量的數(shù)據(jù)存儲硬件堆棧; 處理器有將堆棧指針以及其它CPU寄存器的內(nèi)容讀出、并存儲到堆?;騼?nèi)存中去的指令。 針對上述移植條件,基于ARM7TDMI Core的S3C44B0X處理器滿足其中的硬件要求。第4頁/共129頁P(yáng)hase 1 移植前的規(guī)劃C/OS-IIC/OS-II移植的條件移植的條件1234編譯器的選擇編譯器的選擇工作狀態(tài)的選擇工作狀態(tài)的選擇工作模式的選擇工作模式的選擇第5頁/共129頁移植對編譯器的要求及選擇 除了對硬件有要求外,還需要一個(gè)支持C語言和ARM匯編語言的綜合編譯開發(fā)環(huán)境(IDE)。 綜合編譯開發(fā)環(huán)境至少需要包括C編譯器、ARM匯編器和鏈接器。C編譯器用來對C語言程序進(jìn)行
4、編譯生成匯編代碼。由于移植時(shí)需要對CPU的寄存器進(jìn)行操作,所以需要匯編器能夠支持匯編語言程序。鏈接器根據(jù)定位信息將不同的模塊(編譯或匯編過的文件)鏈接成一個(gè)單一的、絕對定位的可執(zhí)行的映像文件。 針對ARM處理器核的C語言編譯器有很多,目前在國內(nèi)比較流行的有SDT、ADS、IAR、KEIL和GCC等; 其中SDT和ADS均為ARM公司自己開發(fā),ADS為SDT的升級版,以后ARM公司不再支持SDT。 本移植采用ADS1.2集成開發(fā)環(huán)境進(jìn)行程序的編譯和調(diào)試。第6頁/共129頁P(yáng)hase 1 移植前的規(guī)劃C/OS-IIC/OS-II移植的條件移植的條件1234編譯器的選擇編譯器的選擇工作狀態(tài)的選擇工作
5、狀態(tài)的選擇工作模式的選擇工作模式的選擇第7頁/共129頁工作狀態(tài)的選擇 自從ARM7TDMI Core以后,體系結(jié)構(gòu)中具有T變種的ARM處理器核可以工作在以下兩種狀態(tài),并支持兩個(gè)指令集: ARM狀態(tài) ARM狀態(tài)下執(zhí)行字對準(zhǔn)的32位ARM指令; Thumb狀態(tài) Thumb狀態(tài)下執(zhí)行半字對準(zhǔn)的16位Thumb指令; COS-II的任務(wù)可以在任何一種工作狀態(tài)下運(yùn)行,并可以進(jìn)行狀態(tài)切換。 為了移植代碼的編寫簡單,本移植只在ARM狀態(tài)下實(shí)現(xiàn)。第8頁/共129頁P(yáng)hase 1 移植前的規(guī)劃C/OS-IIC/OS-II移植的條件移植的條件1234編譯器的選擇編譯器的選擇工作狀態(tài)的選擇工作狀態(tài)的選擇工作模式的
6、選擇工作模式的選擇第9頁/共129頁ARM處理器工作模式(1)處理器模式處理器模式說明說明備注備注 用戶用戶 (usr)(usr)正常程序工作模式正常程序工作模式不能直接切換到其它模式不能直接切換到其它模式 系統(tǒng)系統(tǒng) (sys)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)用于支持操作系統(tǒng)的特權(quán)任務(wù)與用戶模式類似,但具有可以直接切換與用戶模式類似,但具有可以直接切換到其它模式等特權(quán)到其它模式等特權(quán) 快中斷快中斷(fiq)(fiq)支持高速數(shù)據(jù)傳輸及通道處理支持高速數(shù)據(jù)傳輸及通道處理FIQFIQ異常響應(yīng)時(shí)進(jìn)入此模式異常響應(yīng)時(shí)進(jìn)入此模式 中斷中斷 (irq)(irq)用于通用中斷處理用于通用中斷處理IRQI
7、RQ異常響應(yīng)時(shí)進(jìn)入此模式異常響應(yīng)時(shí)進(jìn)入此模式 管理管理 (svc)(svc)操作系統(tǒng)保護(hù)代碼操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式 中止中止 (abt)(abt)用于支持虛擬內(nèi)存和用于支持虛擬內(nèi)存和/ /或存儲或存儲器保護(hù)器保護(hù)在在ARM7TDMIARM7TDMI沒有大用處沒有大用處 未定義未定義(und)(und)支持硬件協(xié)處理器的軟件仿真支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式未定義指令異常響應(yīng)時(shí)進(jìn)入此模式未定義未定義 (und)(und)中止中止 (abt)(abt)管理管理 (svc)(svc)中斷中斷 (irq)(irq)
8、快中斷快中斷 (fiq)(fiq)系統(tǒng)系統(tǒng) (sys)(sys) 除用戶模式外,其它模式均為特權(quán)模式。ARM內(nèi)部寄存器和一些片內(nèi)外設(shè)在硬件設(shè)計(jì)上只允許(或者可選為只允許)特權(quán)模式下訪問。此外,特權(quán)模式可以自由的切換處理器模式,而用戶模式不能直接切換到別的模式。第10頁/共129頁ARM處理器工作模式(2)處理器模式處理器模式說明說明備注備注 用戶用戶 (usr)(usr)正常程序工作模式正常程序工作模式不能直接切換到其它模式不能直接切換到其它模式 系統(tǒng)系統(tǒng) (sys)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)用于支持操作系統(tǒng)的特權(quán)任務(wù)與用戶模式類似,但具有可以直接切換與用戶模式類似,但具有可以直接切
9、換到其它模式等特權(quán)到其它模式等特權(quán) 快中斷快中斷(fiq)(fiq)支持高速數(shù)據(jù)傳輸及通道處理支持高速數(shù)據(jù)傳輸及通道處理FIQFIQ異常響應(yīng)時(shí)進(jìn)入此模式異常響應(yīng)時(shí)進(jìn)入此模式 中斷中斷 (irq)(irq)用于通用中斷處理用于通用中斷處理IRQIRQ異常響應(yīng)時(shí)進(jìn)入此模式異常響應(yīng)時(shí)進(jìn)入此模式 管理管理 (svc)(svc)操作系統(tǒng)保護(hù)代碼操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式 中止中止 (abt)(abt)用于支持虛擬內(nèi)存和用于支持虛擬內(nèi)存和/ /或存儲或存儲器保護(hù)器保護(hù)在在ARM7TDMIARM7TDMI沒有大用處沒有大用處 未定義未定義(und)(
10、und)支持硬件協(xié)處理器的軟件仿真支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式未定義指令異常響應(yīng)時(shí)進(jìn)入此模式未定義未定義 (und)(und)中止中止 (abt)(abt)管理管理 (svc)(svc)中斷中斷 (irq)(irq)快中斷快中斷 (fiq)(fiq) 這五種模式稱為異常模式。它們除了可以通過程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。當(dāng)特定的異常出現(xiàn)時(shí),處理器進(jìn)入相應(yīng)的模式。每種異常模式都有一些獨(dú)立的寄存器,以避免異常退出時(shí)用戶模式的狀態(tài)不可靠。 本移植中本移植中 COS-IICOS-II的任務(wù)正常運(yùn)行在管理的任務(wù)正常運(yùn)行在管理(SVC)(SVC)模式模式。第11頁/共
11、129頁P(yáng)hase 2 操作系統(tǒng)移植BootLoaderBootLoader1234系統(tǒng)系統(tǒng)初始化流程初始化流程最小啟動(dòng)代碼編寫最小啟動(dòng)代碼編寫C/OS-IIC/OS-II相關(guān)文件修改相關(guān)文件修改第12頁/共129頁BootLoader的基本概念 要想讓COS-II在S3C44B0X處理器上正常運(yùn)行,我們需要對系統(tǒng)的硬件環(huán)境進(jìn)行初始化。 對于PC機(jī),其開機(jī)后操作系統(tǒng)啟動(dòng)前的硬件初始化操作是由BIOS(Basic Input/Output System)完成的,但對于嵌入式系統(tǒng)來說,出于通用性、價(jià)格方面的考慮,通常并沒有像BIOS那樣的固件程序,因此啟動(dòng)時(shí)用于完成初始化操作的引導(dǎo)加載程序必須自行
12、編寫完成,這段程序一般被稱為Bootloader程序。 BootLoader是系統(tǒng)加電(或復(fù)位)后運(yùn)行的第一段軟件代碼。通過這段代碼,我們可以初始化系統(tǒng)硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便最終調(diào)用操作系統(tǒng)內(nèi)核。 簡單地說,BootLoader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段初始化程序。第13頁/共129頁BootLoader的特點(diǎn) BootLoader除了依賴CPU的體系結(jié)構(gòu)外,還依賴于具體的嵌入式板級設(shè)備的配置,比如板卡的硬件地址分配,RAM芯片的類型,其它外設(shè)的類型等。對于兩塊不同的嵌入式開發(fā)板,即使它們是基于同一種CPU而構(gòu)建的,如果他們的硬
13、件資源和配置不一致,要想讓運(yùn)行在一塊板子上的BootLoader程序也能運(yùn)行在另一塊板子上,也還是需要作一些必要的修改。 因此,為嵌入式系統(tǒng)建立一個(gè)通用的BootLoader是很困難的。盡管如此,我們?nèi)匀豢梢詫ootLoader(尤其是基于同種Core的微處理器)歸納出一些通用的概念和設(shè)計(jì)思路,用來指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。第14頁/共129頁BootLoader的啟動(dòng)過程 為了增加BootLoader的通用性和可移植性,本文把啟動(dòng)過程分為phasel和phase2兩個(gè)階段。 phase1階段執(zhí)行的是用匯編語言來實(shí)現(xiàn)的依賴CPU體系結(jié)構(gòu)的代碼,這樣可以提高系統(tǒng)的啟動(dòng)速度;
14、 phase2階段完成的是OS內(nèi)核啟動(dòng)前的準(zhǔn)備工作,多采用處理能力強(qiáng)、可移植性好的C語言來實(shí)現(xiàn)。 phase1階段執(zhí)行的代碼,我們稱之為最小啟動(dòng)代碼。所謂最小啟動(dòng)代碼是指為了完成系統(tǒng)(OS或用戶應(yīng)用程序)啟動(dòng)所必須的最少硬件的初始化程序。第15頁/共129頁BootLoader的安裝媒介 系統(tǒng)加電或復(fù)位后,所有的CPU通常都從CPU制造商預(yù)先安排的地址上取指令。 基于ARM7TDMI Core的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時(shí)是從0 x00000000地址開始取第一條指令執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的BootLoader程序。 嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設(shè)備(比如:ROM、
15、EPROM或FLASH等)被安排這個(gè)起始地址上用來存放BootLoader程序。第16頁/共129頁BootLoader的下載方式p 通過編程器將可執(zhí)行目標(biāo)文件燒寫到BootROM中;p 通常通過串行口、網(wǎng)口或JTAG等接口下載。串口網(wǎng)口JTAG目標(biāo)機(jī)目標(biāo)機(jī)MPURAMBOOT ROM下載工具宿主機(jī)宿主機(jī)第17頁/共129頁P(yáng)hase 2 操作系統(tǒng)移植BootLoaderBootLoader1234系統(tǒng)系統(tǒng)初始化流程初始化流程最小啟動(dòng)代碼編寫最小啟動(dòng)代碼編寫C/OS-IIC/OS-II相關(guān)文件修改相關(guān)文件修改第18頁/共129頁嵌入式系統(tǒng)的初始化流程1234567硬件初始化RTOS初始化軟件初
16、始化設(shè)置中斷向量表最小硬件初始化RTOS初始化啟動(dòng)RTOS最小啟動(dòng)代碼phase1phase2用戶程序RTOS運(yùn)行環(huán)境初始化硬件抽象層初始化用戶程序初始化第19頁/共129頁嵌入式系統(tǒng)的初始化流程(1)123硬件初始化階段硬件初始化階段最小硬件初始化最小啟動(dòng)代碼p 中斷向量表放在上電后映射在從0 x00000000開始的8*4個(gè)字節(jié)的連續(xù)存儲空間中,其作用是指定了各種異常中斷處理程序的入口地址。phase1 設(shè)置中斷向量表設(shè)置中斷向量表RTOS運(yùn)行環(huán)境初始化第20頁/共129頁嵌入式系統(tǒng)的初始化流程(2)硬件初始化階段硬件初始化階段p 禁用看門狗定時(shí)器;p 屏蔽所有中斷;p 設(shè)定CPU的時(shí)鐘頻
17、率;p 初始化存儲器;p 分配各種模式下的??臻g。 最小硬件初始化123最小硬件初始化最小啟動(dòng)代碼設(shè)置中斷向量表RTOS運(yùn)行環(huán)境初始化phase1第21頁/共129頁嵌入式系統(tǒng)的初始化流程(3)硬件初始化階段硬件初始化階段p 為RTOS運(yùn)行準(zhǔn)備合適的RAM空間;p 呼叫RTOS主(Main)程序。 RTOS運(yùn)行環(huán)境初始化123最小硬件初始化最小啟動(dòng)代碼設(shè)置中斷向量表RTOS運(yùn)行環(huán)境初始化phase1第22頁/共129頁嵌入式系統(tǒng)的初始化流程(4)RTOSRTOS初始化階段初始化階段456硬件抽象層初始化RTOS初始化啟動(dòng)RTOS 硬件抽象層初始化p 系統(tǒng)cache、總線設(shè)置;p 中斷及中斷向量
18、處理子程序初始化;p I/O端口配置;p 初始化定時(shí)器,為時(shí)鐘中斷做好準(zhǔn)備;p 對RTOS所需的其它設(shè)備初始化。phase2第23頁/共129頁嵌入式系統(tǒng)的初始化流程(5)RTOSRTOS初始化階段初始化階段456硬件抽象層初始化RTOS初始化啟動(dòng)RTOS RTOS初始化p RTOS內(nèi)核啟動(dòng)參數(shù)初始化;p RTOS擴(kuò)展部件初始化。phase2第24頁/共129頁嵌入式系統(tǒng)的初始化流程(6)RTOSRTOS初始化階段初始化階段456硬件抽象層初始化RTOS初始化啟動(dòng)RTOS 啟動(dòng)RTOSp 運(yùn)行優(yōu)先級最高的就緒任務(wù);p 啟動(dòng)RTOS時(shí)鐘中斷。phase2第25頁/共129頁嵌入式系統(tǒng)的初始化流程
19、(7)用戶程序初始化階段用戶程序初始化階段 用戶程序初始化p 用戶程序正常運(yùn)行所進(jìn)行的初始化。7用戶程序用戶程序初始化第26頁/共129頁P(yáng)hase 2 操作系統(tǒng)移植BootLoaderBootLoader1234系統(tǒng)系統(tǒng)初始化流程初始化流程最小啟動(dòng)代碼編寫最小啟動(dòng)代碼編寫C/OS-IIC/OS-II相關(guān)文件修改相關(guān)文件修改第27頁/共129頁設(shè)置中斷向量表 因?yàn)橹袛嘞蛄勘碇忻糠N異常只分配4個(gè)字節(jié),所以不能放下整個(gè)異常中斷處理程序,只能放一條跳轉(zhuǎn)指令,用以跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序。向量地址異常中斷類型轉(zhuǎn)移指令0 x0000001CFIQLDR PC,=FIQHandler0 x000000
20、18IRQLDR PC,=IRQHandler0 x00000014ReservedNOP0 x00000010Data AbortLDR PC,=DabortHandler0 x0000000CPrefech AbortLDR PC,=PabortHandler0 x00000008SWILDR PC,=SWIHandler0 x00000004Undefined InstructionLDR PC,=UndefHandler0 x00000000ResetB ResetHandler第28頁/共129頁禁用看門狗定時(shí)器和屏蔽所有外部中斷 示意代碼分析WTCON EQU 0 x01d3000
21、0 ;看門狗定時(shí)器控制寄存器INTMSK EQU 0 x01e0000c ;中斷屏蔽寄存器 ResetHandlerResetHandler LDR r0,=WTCON LDR r1,=0 x00000000 ;Watch Dog Disable STR r1,r0 LDR r0,=INTMSK LDR r1,=0 x07ffffff ;All Interrupt Disable STR r1,r0 說明:默認(rèn)初始狀態(tài)允許看門狗定時(shí)器工作(p496),所以要關(guān)閉。 如果要屏蔽所有中斷,可用MRS指令設(shè)置CPSR的I/F位(p431,p440)。第29頁/共129頁S3C44B0X時(shí)鐘發(fā)生器組成
22、(1) S3C44B0X的時(shí)鐘發(fā)生器可產(chǎn)生CPU和外設(shè)所需要的時(shí)鐘信號。時(shí)鐘發(fā)生器可在S/W的控制下向外設(shè)提供時(shí)鐘信號,也可斷開時(shí)鐘與每個(gè)外設(shè)的連接來降低功耗。首先要求要確定主時(shí)鐘MCLK,然后以主時(shí)鐘作為一種基準(zhǔn),通過分頻控制定時(shí)器,串口等外設(shè)的時(shí)鐘頻率。 S3C44B0X時(shí)鐘發(fā)生器組成: 主時(shí)鐘源有兩個(gè):一個(gè)是XTAL0和EXTAL0連接的外部晶振,另一個(gè)是EXTCLK連接的外部時(shí)鐘; PLL的功能是以低頻振蕩器的輸出作為輸入,產(chǎn)生S3C44B0X需要的高頻信號; 還有一個(gè)時(shí)鐘控制邏輯部件來可產(chǎn)生穩(wěn)定的時(shí)鐘頻率。 S3C44B0X時(shí)鐘源的選擇由處理器的兩個(gè)引腳OM3:2控制。OM3:2=0
23、0時(shí)鐘源為晶振,OM3:2=01時(shí)鐘源為外部時(shí)鐘。 本移植采用晶振作為時(shí)鐘源。晶振為6MHz,即fin=6MHz。第30頁/共129頁S3C44B0X時(shí)鐘發(fā)生器組成(2) 時(shí)鐘發(fā)生器框圖說明:時(shí)鐘發(fā)生器(p446)第31頁/共129頁P(yáng)LL鎖相環(huán)原理框圖 PLL鎖相環(huán)框圖說明:PLL鎖相環(huán)原理(p446-p447)第32頁/共129頁設(shè)置PLL分頻器 輸出時(shí)鐘頻率fpllo和輸入的時(shí)鐘頻率fin的關(guān)系如下: fpllo=(m*fin)/(p*2s)其中, m=MDIV (分頻器M的分頻值)+8, p=PDIV (分頻器P的分頻值)+2, s=SDIV (分頻器S的分頻值) PLL值的選擇向?qū)В?/p>
24、 fpllo必須大于20Mhz,小于66MHz; fpllo*2s必須小于170MHz;第33頁/共129頁時(shí)鐘控制邏輯部件 當(dāng)PLL被配置為一個(gè)新的頻率值時(shí),時(shí)鐘控制邏輯部件在PLL輸出穩(wěn)定之前禁止fout,直到PLL鎖定系統(tǒng)時(shí)鐘后取消禁止。PLL鎖時(shí)實(shí)際上是PLL輸出穩(wěn)定所需要的時(shí)間,這個(gè)時(shí)間應(yīng)長于208us。鎖定時(shí)間值計(jì)算公式如下: tlock=(1/fin)*n 其中n=LTIMECNT值。第34頁/共129頁設(shè)定CPU及各功能模塊時(shí)鐘頻率 示意代碼分析PLLCON EQU 0 x01d80000 ;PLL控制寄存器 CLKCON EQU 0 x01d80004 ;時(shí)鐘控制寄存器 LO
25、CKTIME EQU 0 x01d8000c ;鎖時(shí)計(jì)數(shù)寄存器M_DIV EQU 0 x48 P_DIV EQU 0 x02S_DIV EQU 0 x01LDR r0,=LOCKTIMELDR r1,=0 x00000fff ;tlock=(1/fin)*LTIMECNTSTR r1,r0 LDR r0,=PLLCON ;fin=6MHz,fout=60MHLDR r1,=(M_DIV12)+(P_DIVOSTCBStkPtrSP = OSTCBHighRdy-OSTCBStkPtr按照按照OSTaskStkInit()OSTaskStkInit()中相反順序中相反順序從新任務(wù)棧中恢復(fù)處理器的
26、所有寄存器從新任務(wù)棧中恢復(fù)處理器的所有寄存器模擬中斷返回模擬中斷返回第82頁/共129頁OS_CPU_A.S-OSStartHighRdy()代碼分析 示意代碼分析OSStartHighRdyOSStartHighRdy ;MSR CPSR_c, #(ARM_INT_DIS| ARM_SVC_MODE) BL OSTaskSwHook LDR R0, =OSRunning MOV R1, #1 STRB R1, R0 LDR R0, =OSTCBHighRdy LDR R0, R0 LDR SP, R0 ;LDR R1, =OSTCBCur ;STR R0, R1 LDMFD SP!, R0
27、MSR SPSR_cxsf, R0 LDMFD SP!, R0 MSR CPSR_cxsf, R0 LDMFD SP!, R0-R12, LR, PC 關(guān)中斷,切換到SVC模式調(diào)用OSTaskSwHook()函數(shù)得到將要恢復(fù)運(yùn)行任務(wù)的棧指針OSRunning = TRUE從新任務(wù)棧中恢復(fù)處理器的所有寄存器,模擬中斷返回第83頁/共129頁Contents OSStartHighRdy()1 OSCtxSw()2 OSTickISR()3 OSIntCtxSw()4第84頁/共129頁OS_CPU_A.S-OSCtxSw() OSCtxSw()是C/OS-II從低優(yōu)先級任務(wù)切換到高優(yōu)先級任務(wù)時(shí)用
28、到的任務(wù)級切換函數(shù)。該函數(shù)實(shí)現(xiàn)的功能可以分為兩部分,第一部分代碼用來保存正在運(yùn)行(將被中斷)任務(wù)的當(dāng)前狀態(tài)(即處理器寄存器的全部內(nèi)容)到該任務(wù)的棧中;第二部分代碼是把將要運(yùn)行的更高優(yōu)先級任務(wù)的當(dāng)前狀態(tài)從棧中恢復(fù)到處理器寄存器中。第85頁/共129頁OS_CPU_A.S-OSCtxSw()執(zhí)行流程圖調(diào)用接口函數(shù)調(diào)用接口函數(shù) OSTaskSwHook()OSTaskSwHook()OSPrioCur = OSPrioHighRdy;OSPrioCur = OSPrioHighRdy; OSTCBCur = OSTCBHighRdy; OSTCBCur = OSTCBHighRdy;得到將要恢復(fù)運(yùn)行
29、任務(wù)的棧指針得到將要恢復(fù)運(yùn)行任務(wù)的棧指針: :SP = OSTCBHighRdy-OSTCBStkPtrSP = OSTCBHighRdy-OSTCBStkPtr按照按照OSTaskStkInit()OSTaskStkInit()中相反順序中相反順序從新任務(wù)棧中恢復(fù)處理器的所有寄存器從新任務(wù)棧中恢復(fù)處理器的所有寄存器模擬中斷返回模擬中斷返回保存處理器寄存器;保存處理器寄存器;在當(dāng)前任務(wù)的任務(wù)控制塊中保存棧指針:在當(dāng)前任務(wù)的任務(wù)控制塊中保存棧指針:OSTCBCur-OSTCBStkPtr=SPOSTCBCur-OSTCBStkPtr=SP第86頁/共129頁OS_CPU_A.S-OSCtxSw(
30、)實(shí)現(xiàn)分析(1)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcBeforeOSTCBStkPtr I F T MODECPSR:1100 x13OS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyn說明: 根據(jù)OSTaskStkInit()函數(shù)初始化的情況,當(dāng)前任務(wù)運(yùn)行在ARM狀態(tài)、SVC模式。當(dāng)任務(wù)級的調(diào)度函數(shù)OS_Sched()函數(shù)調(diào)用宏OS_TASK_SW()(即OSCtxSw())時(shí),
31、是在臨界段中進(jìn)行的,所以IRQ和FIQ中斷都禁用。當(dāng)OS_Sched ()調(diào)用OSCtxSw()時(shí),類似于下面操作: BL OSCtxSw 所以O(shè)SCtxSw()返回地址保存在R14_svc。第87頁/共129頁OS_CPU_A.S-OSCtxSw()實(shí)現(xiàn)分析(2)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw STMFD SP!, LR STMFD SP!
32、, LR STMFD SP!, R0-R12 MRS R0, CPSR STMFD SP!, R0 MRS R0, SPSR STMFD SP!, R0 Current Task StackSVC ModeBeforeAfterOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdy保存處理器寄存器 I F T MODECPSR:1100 x13第88頁/共129頁OS_CPU_A.S-OSCtxSw()實(shí)現(xiàn)分析(3)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR
33、)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDR R0, =OSTCBCur LDR R1, R0 STR SP, R1 Current Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyOSTCBCur-OSTCBStkPtr=SP I F T MODECPSR:1100 x13第89頁/共129頁OS_CPU_A.S-OSCtxSw
34、()實(shí)現(xiàn)分析(4)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw BL OSTaskSwHook LDR R0, =OSPrioCur LDR R1, =OSPrioHighRdy LDRB R1, R1 STRB R1, R0 Current Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStk
35、PtrOS_TCBOS_TCBOSTCBHighRdy將新任務(wù)的優(yōu)先級復(fù)制給當(dāng)前任務(wù)優(yōu)先級在 OS_CPU_C.C中定義 I F T MODECPSR:1100 x13第90頁/共129頁OS_CPU_A.S-OSCtxSw()實(shí)現(xiàn)分析(5)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDR R0, =OSTCBCur LDR R1, =OSTCBHig
36、hRdy LDR R1, R1 STR R1, R0 Current Task StackSVC ModeOSTCBStkPtrI F T MODECPSR:1100 x13OS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyOSTCBCur=OSTCBHighRdy第91頁/共129頁OS_CPU_A.S-OSCtxSw()實(shí)現(xiàn)分析(6)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R
37、14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDR SP, R1 New Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdySP=OSTCBHighRdy-OSTCBStkPtrI F T MODECPSR:1100 x13第92頁/共129頁OS_CPU_A.S-OSCtxSw()實(shí)現(xiàn)分析(7)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R
38、5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDMFD SP!, R0 MSR SPSR_cxsf, R0 LDMFD SP!, R0 MSR CPSR_cxsf, R0 LDMFD SP!, R0-R12, LR, PCSVC ModeBeforeAfterOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyNew Task Stack從新任務(wù)堆棧中恢復(fù)處理器所有寄存器的值模擬中斷返回運(yùn)行新任務(wù)I F T MO
39、DECPSR:1100 x13第93頁/共129頁Contents OSStartHighRdy()1 OSCtxSw()2 OSTickISR()3 OSIntCtxSw()4第94頁/共129頁OS_CPU_A.S-時(shí)鐘中斷 C/OS-要求用戶提供一個(gè)周期性的時(shí)鐘資源,來實(shí)現(xiàn)時(shí)間的延時(shí)和超時(shí)功能。時(shí)鐘節(jié)拍通常每秒發(fā)生10100次/秒。為了完成該任務(wù),可以使用硬件時(shí)鐘,也可以從交流電中獲得50/60Hz的時(shí)鐘頻率。本移植采用S3C44B0X的PWM定時(shí)器Timer1作為C/OS-系統(tǒng)時(shí)鐘。 用戶必須在開始多任務(wù)調(diào)度后(即調(diào)用OSStart()后)允許時(shí)鐘節(jié)拍中斷。但由于OSStart()函數(shù)
40、不會(huì)返回,用戶無法實(shí)現(xiàn)這一操作。然而,可以在OSStart()運(yùn)行后,C/OS-啟動(dòng)運(yùn)行的第一個(gè)任務(wù)中初始化節(jié)拍中斷。這個(gè)任務(wù)是調(diào)用OSStart()之前建立的任務(wù)中優(yōu)先級最高的任務(wù)。通常所犯的錯(cuò)誤是在調(diào)用OSInit()和OSStart()之間允許時(shí)鐘節(jié)拍中斷。在這種情況下,C/OS-的運(yùn)行狀態(tài)不確定,用戶的應(yīng)用程序也可能會(huì)崩潰。第95頁/共129頁OS_CPU_A.S-正確位置啟動(dòng)時(shí)鐘節(jié)拍中斷 示意代碼分析int Main(void) OSInit(); / 初始化 /*應(yīng)用程序初始化代碼*/ /*建立至少一個(gè)任務(wù)*/ 啟動(dòng)時(shí)鐘節(jié)拍中斷啟動(dòng)時(shí)鐘節(jié)拍中斷; ; OSStart(); /開始多
41、任務(wù)調(diào)度 return 0;/Main在不正確的位置啟動(dòng)時(shí)鐘節(jié)拍中斷在不正確的位置啟動(dòng)時(shí)鐘節(jié)拍中斷int Main(void) OSInit(); / 初始化 /*應(yīng)用程序初始化代碼*/ /*建立至少一個(gè)任務(wù)*/ OSStart(); /開始多任務(wù)調(diào)度 return 0;/Mainvoid 第一個(gè)任務(wù)(void *pdata) 啟動(dòng)時(shí)鐘節(jié)拍中斷啟動(dòng)時(shí)鐘節(jié)拍中斷; ; 正確的位置啟動(dòng)時(shí)鐘節(jié)拍中斷正確的位置啟動(dòng)時(shí)鐘節(jié)拍中斷第96頁/共129頁OS_CPU_A.S-OSTickISR() OSTickISR()是系統(tǒng)時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)。其主要任務(wù)是負(fù)責(zé)處理時(shí)鐘中斷,為內(nèi)核提供時(shí)鐘節(jié)拍。 該函數(shù)調(diào)用
42、OSIntEnter()時(shí)把全局變量OSIntNesting加1來記錄中斷嵌套的層數(shù); 調(diào)用OSTimeTick()主要做了兩件事:一是給計(jì)數(shù)器OSTime加1;二是遍歷任務(wù)控制塊鏈表,了解每個(gè)任務(wù)的延時(shí)狀態(tài),使其中已經(jīng)到了延時(shí)時(shí)限的非掛起任務(wù)進(jìn)入就緒狀態(tài)。 調(diào)用OSIntExit()函數(shù)目的是決定是否因?yàn)楫?dāng)前中斷服務(wù)程序的執(zhí)行,使得更高優(yōu)先級的任務(wù)就緒。如果有更高優(yōu)先級任務(wù)就緒OSIntExit()就不會(huì)返回到被中斷任務(wù),而是切換到更高優(yōu)先級的任務(wù);否則切換回被中斷任務(wù)繼續(xù)執(zhí)行。第97頁/共129頁OS_CPU_A.S-OSTickISR()執(zhí)行流程圖重新允許中斷(可選);重新允許中斷(可選
43、);給產(chǎn)生中斷的設(shè)備清中斷;給產(chǎn)生中斷的設(shè)備清中斷;調(diào)用調(diào)用OSTimeTick();OSTimeTick();調(diào)用調(diào)用OSIntExit();OSIntExit(); 恢復(fù)處理器寄存器恢復(fù)處理器寄存器; ; 執(zhí)行中斷返回執(zhí)行中斷返回保存處理器寄存器;保存處理器寄存器;調(diào)用調(diào)用OSIntEnter()OSIntEnter()或者直接將或者直接將 OSIntNestingOSIntNesting加加1;1;if(OSIntNesting=1)if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; OSTCBCur-OSTCBStkPtr=SP; 第98頁/共129
44、頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(1)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcBeforeOSTCBStkPtr I F T MODECPSR:0100 x13(SVC)OS_TCBOS_TCBOSTCBCurn說明:p根據(jù)前面所述的C/OS-的運(yùn)行環(huán)境和OSTaskStkInit()函數(shù)初始化的情況,當(dāng)前任務(wù)在被中斷之前還是運(yùn)行在ARM狀態(tài)、SVC模式、允許IRQ中斷和禁用FIQ中斷。p同時(shí),我們采用矢量中斷模式,中斷服
45、務(wù)程序OSTickISR()中不允許中斷嵌套。第99頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(2)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcBefore I F T MODESPSR_irq:0 x13(SVC)010R0R1R2R3R4R5R6R7R8R9R10R11R12R13_irq(SP)R14_irq(LR)R15(PC)IRQ ModeCPSRSPSR_irq I F T MODECPSR:0 x12(IRQ
46、)011IRQ Stackn說明: 當(dāng)發(fā)生時(shí)鐘中斷時(shí),系統(tǒng)自動(dòng)完成以下工作:p將PC(PC=中斷返回地址+4)的值保存在LR(R14_irq)中;p將CPSR_svc保存在SPSR_irq中;p由SVC工作模式切換到IRQ工作模式;p禁用IRQ(CPSR7=1);pR13_irq 指向IRQ模式下的棧頂。第100頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(3)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)SVC ModeCPSRSPSR_svcR0R1R2R3R4R5R6R7R8R9R10R11R12
47、R13_irq(SP)R14_irq(LR)R15(PC)IRQ StackCPSRSPSR_irqOSTickISROSTickISR STMFD SP!, R0-R2 R0R1R2BeforeAfterIRQ Mode一開始,任務(wù)運(yùn)行在SVC模式,由于時(shí)鐘中斷切換到了IRQ模式,為了保護(hù)被中斷任務(wù)的CPU寄存器,必須切換回SVC模式。如果直接由IRQ模式切換回SVC模式,會(huì)破壞原來的現(xiàn)場。因?yàn)镽13、R14和SPSR均為各自模式下的影子寄存器,在其它模式下不可見,所以采用在各種模式下均可見的不分組寄存器R0-R3來存放上述影子寄存器。為了免于破壞數(shù)據(jù),先把R0-R3保存在IRQ模式下的棧中
48、。 I F T MODESPSR_irq:0 x13(SVC)010I F T MODECPSR:0 x12(IRQ)011第101頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(4)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)SVC ModeCPSRSPSR_svcR0(SPSR_irq)R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_irq(SP)R14_irq(LR)R15(PC)IRQ StackCPSRSPSR_irqOSTickISROS
49、TickISR MRS R0, SPSR SUB LR, 4 MOV R1, LR MOV R2, SP R0R1R2IRQ ModePC- 4保存SPSR_irq到R0;保存返回地址到R1;保存R13_irq到R2; I F T MODESPSR_irq:0 x13(SVC)010I F T MODECPSR:0 x12(IRQ)011第102頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(5)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)SVC ModeCPSRSPSR_svcR0(SPSR_irq)
50、R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_irq(SP)R14_irq(LR)R15(PC)IRQ StackCPSRSPSR_irqOSTickISROSTickISR ADD SP, SP, #(3 * 4) R0R1R2IRQ ModeAfterBefore I F T MODESPSR_irq:0 x13(SVC)0 x13(SVC)0 01 10 0I F T MODECPSR:0 x12(IRQ)0 x12(IRQ)0 01 11 1調(diào)整IRQ模式下SP指針第103頁/共129頁OS_CPU_A.S-OSTickISR()
51、實(shí)現(xiàn)分析(6)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)SVC ModeCPSRSPSR_svcR0(SPSR_irq)R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_irq(SP)R14_irq(LR)R15(PC)IRQ StackCPSRSPSR_irqI F T MODECPSR:0 x13(SVC)0 x13(SVC)0 01 11 1OSTickISROSTickISR MSR CPSR_cxsf,#(ARM_INT_DIS|ARM_SVC_MODE) R
52、0R1R2IRQ Mode切換到SVC模式禁用IRQ中斷第104頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(7)R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISROSTickISR STMFD SP!, R1 STMF
53、D SP!, LR STMFD SP!, R3-R12 IRQ StackR0R1R2保存被中斷任務(wù)的返回地址;保存R3-R12和R14_svc第105頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(8)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F
54、 T MODECPSR:1100 x13(SVC)OSTickISROSTickISR LDMIA R2!, R3-R5 STMFD SP!, R3-R5 STMFD SP!, R0 MRS R1, SPSR STMFD SP!, R1 IRQ StackR0R1R2保存R0-R2,CPSR和SPSR_svc第106頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(9)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq-4)R2(R13_irq)R3R4R5R6R7
55、R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISROSTickISR BL OSIntEnter OSIntNesting+第107頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(10)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq)R2(R13_irq)R3R4R5R6R7R8
56、R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISROSTickISR LDR R3, =OSTCBCur LDR R4, R3 STR SP, R4 OSTCBStkPtrOS_TCBOS_TCBOSTCBCurif(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP;第108頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(11)SPSR_svcCPSRR0R1R2R3
57、R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISR BL OSTimeTick BL ClearTickIntpnd OSTimeTick()函數(shù)通過任務(wù)控制塊中的OSTCBDly來維護(hù)C/OS-內(nèi)部的延時(shí)或超時(shí)。ClearTickIntpnd()函
58、數(shù)實(shí)現(xiàn)對系統(tǒng)時(shí)鐘中斷設(shè)備清除中斷,為下一次中斷做好準(zhǔn)備。第109頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(12)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)R1(R14_irq)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISROSTickISR B
59、L OSIntExit OSIntExit()函數(shù)決定是否因?yàn)檫@個(gè)中斷服務(wù)程序的執(zhí)行,使得更高優(yōu)先級的任務(wù)就緒。如果更高級別的任務(wù)就緒, OSIntExit()就不會(huì)返回到被中斷的任務(wù),而是調(diào)用OSIntCtxSw()切換到更高優(yōu)先級的任務(wù)。如果沒有跟高優(yōu)先級的任務(wù)進(jìn)入就緒態(tài),OSIntExit()就會(huì)返回到中斷服務(wù)程序。此時(shí)只需要簡單地恢復(fù)剛才保存的CPU寄存器就可以了。第110頁/共129頁OS_CPU_A.S-OSTickISR()實(shí)現(xiàn)分析(13)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0(SPSR_irq)
60、R1(R14_irq)R2(R13_irq)R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_svcI F T MODECPSR:1100 x13(SVC)OSTickISROSTickISR LDR R3, =OSTCBCur LDR R4, R3 LDR SP, R4 LDMFD SP!, R0 MSR SPSR_cxsf, R0 LDMFD SP!, R0 MSR CPSR_cxsf, R0 LDMFD SP!, R0-R12, LR, PCOSTCBStkPtrO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥咨詢采購合同范本
- 倉儲貨架合同范本
- 勞動(dòng)合同范本醫(yī)療
- 會(huì)計(jì)臨聘用合同范本
- 展廳工程合同范本
- 出貨協(xié)議合同范本
- 義賣贊助合同范本
- 北京和杭州租房合同范本
- 勞務(wù)用工勞務(wù)合同范本
- 出售高端養(yǎng)老房合同范例
- 電子商務(wù)數(shù)據(jù)分析基礎(chǔ)(第二版) 課件 模塊1、2 電子商務(wù)數(shù)據(jù)分析概述、基礎(chǔ)數(shù)據(jù)采集
- YB-T+4190-2018工程用機(jī)編鋼絲網(wǎng)及組合體
- 高大模板安全施工施工安全保證措施
- 比亞迪公司應(yīng)收賬款管理的問題及對策分析
- 【高考真題】2024年新課標(biāo)全國Ⅱ卷高考語文真題試卷(含答案)
- 委托辦理報(bào)廢汽車協(xié)議書
- 旅游服務(wù)質(zhì)量評價(jià)體系
- 義烏市建筑工程質(zhì)量通病防治措施100條(2022版本)
- 蘇教版(SJ)《四年級下冊數(shù)學(xué)》補(bǔ)充習(xí)題
- 體育足球籃球排球體操教案
- 統(tǒng)編版高中政治必修3必背主觀題
評論
0/150
提交評論