第10講-嵌入式OS內(nèi)核-任務通信與同步_第1頁
第10講-嵌入式OS內(nèi)核-任務通信與同步_第2頁
第10講-嵌入式OS內(nèi)核-任務通信與同步_第3頁
第10講-嵌入式OS內(nèi)核-任務通信與同步_第4頁
第10講-嵌入式OS內(nèi)核-任務通信與同步_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10講

任務通信與同步主要內(nèi)容概述信號燈消息隊列事件管道概述多任務系統(tǒng)中任務之間的關系相互獨立僅競爭CPU資源競爭除CPU外的其他資源(互斥)同步協(xié)調(diào)彼此運行的步調(diào),保證協(xié)同運行的各個任務具有正確的執(zhí)行次序通信彼此間傳遞數(shù)據(jù)或信息,以協(xié)同完成某項工作進程同步的例子只有當售票員關門之后司機才能啟動車輛,只有司機停車之后售票員才能開車門。司機和售票員的行動需要一定的協(xié)調(diào)。同樣地,兩個進程之間有時也有這樣的依賴關系,因此我們也要有一定的同步機制保證它們的執(zhí)行次序任務能以以下方式與中斷處理程序或其他任務進行同步或通信:單向同步或通信:一個任務與另一個任務或一個ISR同步或通信。雙向同步或通信:兩個任務相互同步或通信。雙向同步不能在任務與ISR之間進行,因為ISR不能等待。概述ISRxTaskyPOSTPEND任務與ISR之間的同步(單向)TaskxTaskyPOSTPENDPOSTPEND任務與任務之間的同步(雙向)任務與任務之間的同步(單向)TaskxTaskyPOSTPEND在單處理器平臺上,嵌入式操作系統(tǒng)內(nèi)核提供的同步、互斥與通信機制主要包括:信號燈(semaphore),用于互斥與同步事件(組)(eventgroup),用于同步異步信號(asynchronoussignal),用于同步郵箱(mailbox)、消息隊列(messagequeue),用于消息通信管道(pipe),提供非結(jié)構(gòu)化數(shù)據(jù)交換和實現(xiàn)同步概述以下一些機制也可用于同步與通信(在單處理器或多處理器系統(tǒng)中):全局變量共享內(nèi)存套接字(Sockets)遠程過程調(diào)用(RemoteProcedureCall)概述Linux下任務通信手段信號消息隊列管道信號燈套接字共享存儲段第一節(jié)

信號燈信號燈的種類及用途互斥信號燈二值信號燈計數(shù)信號燈信號燈機制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號燈操作信號燈(Semaphore或稱信號量)用于實現(xiàn)任務與任務之間、任務與中斷處理程序之間的同步與互斥。信號燈一般分為三種:信號燈的種類及用途用于解決互斥問題。它比較特殊,可能會引起優(yōu)先級反轉(zhuǎn)問題。用于解決同步問題用于解決資源計數(shù)問題互斥信號燈計數(shù)信號燈二值信號燈用互斥信號燈保護的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對共享資源的訪問?;コ庑盘枱舻闹当怀跏蓟?,表明目前沒有任務進入“臨界區(qū)”,但最多只有一個任務可以進入“臨界區(qū)”。第一個試圖進入“臨界區(qū)”的任務將成功獲得互斥信號燈,而隨后試圖進入用同一信號燈保護的臨界區(qū)的所有其他任務就必須等待。當任務離開“臨界區(qū)”時,它將釋放信號燈并允許正在等待該信號燈的任務進入“臨界區(qū)”。互斥信號燈Task1Task2共享資源互斥信號燈共享資源可能是一段存儲器空間、一個數(shù)據(jù)結(jié)構(gòu)或I/O設備,也可能是被兩個或多個并發(fā)任務共享的任何內(nèi)容。使用互斥信號燈可以實現(xiàn)對共享資源的串行訪問,保證只有成功地獲取互斥信號燈的任務才能夠釋放它?;コ庑盘枱羰且环N特殊的二值信號燈,一般它支持所有權(quán)、遞歸訪問、任務刪除安全和一些避免優(yōu)先級反轉(zhuǎn)、饑餓、死鎖等互斥所固有問題的協(xié)議?;コ庑盘枱魻顟B(tài)圖互斥信號燈狀態(tài)圖開啟鎖定初始化值為1申請并獲得值為0釋放值為1申請(遞歸)并獲得鎖定數(shù)加1釋放(遞歸)鎖定數(shù)減1互斥信號燈所有權(quán):當一個任務通過獲取互斥信號燈而將其鎖定時,得到該互斥信號燈的所有權(quán)。相反,當一個任務釋放信號燈時,失去對其的所有權(quán)。當一個任務擁有互斥信號燈時,其他的任務不能再鎖定或釋放它,即任務要釋放互斥信號燈,必須事前先獲取該信號燈。二值信號燈二值信號燈主要用于任務與任務之間、任務與中斷服務程序之間的同步用于同步的二值信號燈初始值為0,表示同步事件尚未產(chǎn)生;任務申請信號燈以等待該同步事件的發(fā)生;另一個任務或ISR到達同步點時,釋放信號燈(將其值設置為1)表示同步事件已發(fā)生,以喚醒等待的任務。Task1Task2二值信號燈初值為0二值信號燈二值信號燈狀態(tài)圖可獲得不可獲得申請并獲得(值為0)釋放(值為1)初始化值為0Task1(){……執(zhí)行一些操作;將信號燈sem1置1;

申請信號燈sem2;…………}Task2(){……

申請信號燈sem1;執(zhí)行一些操作;將信號燈sem2置1;…………}Task2申請信號燈sem1失敗,系統(tǒng)切換到Task1sem1被置1后,Task2得到sem1并搶占Task1Task2運行到某處時因某種原因被阻塞,系統(tǒng)切換到Task1用二值信號燈實現(xiàn)兩個任務之間的雙向同步Task2優(yōu)先級高于Task1sem1和sem2的初始值均為0計數(shù)信號燈計數(shù)信號燈用于控制系統(tǒng)中共享資源的多個實例的使用,允許多個任務同時訪問同一種資源的多個實例計數(shù)信號燈被初始化為n(非負整數(shù)),n為該種共享資源的數(shù)目。Task1Task2共享資源實例nTaskm共享資源實例1…………計數(shù)信號燈計數(shù)信號燈狀態(tài)圖可獲得不可獲得初始化值大于0申請并獲得值為0釋放值為1申請并獲得值減1釋放值加1計數(shù)信號燈1234…………n生產(chǎn)者任務消費者任務計數(shù)信號燈使用實例:生產(chǎn)者-消費者問題(有界緩沖問題)問題描述:一個倉庫可以存放n件物品。生產(chǎn)者每生產(chǎn)一件產(chǎn)品,將產(chǎn)品放入倉庫,倉庫滿了就停止生產(chǎn)。消費者每次從倉庫中去一件物品,然后進行消費,倉庫空時就停止消費。

生產(chǎn)者任務do{…產(chǎn)生一個數(shù)據(jù)項…申請empty申請mutex…將新生成的數(shù)據(jù)項添加到緩沖中…釋放mutex釋放full}while(1);消費者任務do{申請full申請mutex…從緩沖中移出一個數(shù)據(jù)項的內(nèi)容…釋放mutex釋放empty…消費新獲得的數(shù)據(jù)項內(nèi)容…}while(1);計數(shù)信號燈full:已被填充的數(shù)據(jù)項數(shù)目,取值范圍0-n,初始值為0計數(shù)信號燈empty:空閑數(shù)據(jù)項數(shù)目,取值范圍為0-n,初始值為n;互斥信號燈mutex:控制生產(chǎn)者任務和消費者任務對有界緩沖的訪問,初始值為1。哲學家就餐問題問題描述:

一個房間內(nèi)有5個哲學家,他們的生活就是思考和進食。房間里有一張圓桌,中間放著一盤通心粉(假定通心粉無限多)。桌子周圍放有五把椅子,分別屬于五位哲學家每兩位哲學家之間有一把叉子,哲學家進食時必須同時使用左右兩把叉子。僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。利用信號量的保護機制實現(xiàn)。通過信號量mutex對就餐之前的取左側(cè)和右側(cè)叉子的操作進行保護,使之成為一個原子操作,這樣可以防止死鎖的出現(xiàn)。信號燈機制的主要數(shù)據(jù)結(jié)構(gòu)SCB1SCB2…………信號燈控制塊count信號燈名字或IDTask1Task2……任務等待列表信號燈機制的主要數(shù)據(jù)結(jié)構(gòu)信號燈控制塊:管理所有創(chuàng)建的信號燈,內(nèi)核在系統(tǒng)運行時動態(tài)分配和回收信號燈控制塊互斥和二值信號燈控制塊結(jié)構(gòu):Binary_Semaphore_Control_Blockwait_queue 任務等待隊列attributes 信號燈屬性 lock_nesting_behavior試圖嵌套獲得時的規(guī)則wait_discipline 任務等待信號燈的方式 priority_ceiling 優(yōu)先級天花板值lock 是否被占有holder 擁有者

nest_count 嵌套層數(shù)計數(shù)信號燈控制結(jié)構(gòu)Counting_Semaphore_Control_Block

wait_queue 任務等待隊列attributes 計數(shù)信號燈屬性

maximum_count 最大計數(shù)值wait_discipline 任務等待信號燈的方式count 當前計數(shù)值信號燈機制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號燈操作創(chuàng)建信號燈獲?。ㄉ暾垼┬盘枱翎尫判盘枱魟h除信號燈清除信號燈的任務等待列表獲取有關信號燈的各種信息第二節(jié)

消息隊列通信方式概述消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)典型的消息隊列操作消息隊列的其他典型使用任務間的通信方式直接通信。在通信過程中雙方必須明確地知道(命名)彼此:Send(P,message)–發(fā)送一個消息到任務PReceive(Q,message)–從任務Q接收一個消息

間接通信。通信雙方不需要指出消息的來源或去向,而通過中間機制來通信。如:send(A,message)–發(fā)送一個消息給郵箱Areceive(A,message)–從郵箱A接收一個消息通信方式概述消息隊列:屬于間接通信方式消息:內(nèi)存空間中一段長度可變的緩沖區(qū),其長度和內(nèi)容均可以由用戶定義,其內(nèi)容可以是實際的數(shù)據(jù)、數(shù)據(jù)塊的指針或空。對消息內(nèi)容的解釋由應用完成。從操作系統(tǒng)觀點看,消息沒有定義的格式,所有的消息都是字節(jié)流,沒有特定的含義。從應用觀點看,根據(jù)應用定義的消息格式,消息被解釋成特定的含義。應用可以只把消息當成一個標志,這時消息機制用于實現(xiàn)同步概述消息隊列就是一個消息的鏈表。每個消息隊列都有一個隊列頭,用結(jié)構(gòu)structmsg_queue來描述。隊列頭中包含了該消息隊列的大量信息,包括消息隊列鍵值、用戶ID、組ID、消息隊列中消息數(shù)目等等,甚至記錄了最近對消息隊列讀寫進程的ID。讀者可以訪問這些信息,也可以設置其中的某些信息。消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)隊列控制塊隊列長度QCB1隊列名或IDTask3Task4……接收任務等待列表Task1Task2……發(fā)送任務等待列表最大消息長度QCB2……消息隊列及其相關的參數(shù)和支持數(shù)據(jù)結(jié)構(gòu)消息隊列狀態(tài)圖非空滿隊列創(chuàng)建消息數(shù)為0消息隊列狀態(tài)圖消息發(fā)送消息數(shù)加1空消息發(fā)送消息數(shù)為1消息接收消息數(shù)為0消息接收消息數(shù)減1消息接收消息數(shù)減1消息發(fā)送消息數(shù)等于隊列長度消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)消息隊列控制塊管理所有創(chuàng)建的消息隊列,系統(tǒng)運行時動態(tài)分配和回收消息隊列控制塊消息隊列緩沖區(qū)存放發(fā)送到該隊列的消息,接收者從緩沖區(qū)中取出消息。消息的發(fā)送或接收有兩種方法(影響消息緩沖區(qū)結(jié)構(gòu)):將數(shù)據(jù)從發(fā)送任務的空間完全拷貝到接收任務的空間中(效率較低,執(zhí)行時間與消息大小有關)只傳遞指向數(shù)據(jù)存儲空間的指針(提高系統(tǒng)性能)number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息隊列控制塊消息隊列緩沖區(qū)消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)消息隊列的環(huán)形緩沖消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指針Linux中的消息隊列Linux維護了一系列消息隊列的msgque向量表。其中的每一個單元都指向一個msqid_ds的數(shù)據(jù)結(jié)構(gòu),完整描述這個消息隊列。當創(chuàng)建消息隊列的時候,從系統(tǒng)內(nèi)存中分配一個新的msqid_ds的數(shù)據(jù)結(jié)構(gòu)并插入到向量表中。每一個msqid_ds數(shù)據(jù)結(jié)構(gòu)都包括一個ipc_perm的數(shù)據(jù)結(jié)構(gòu)和進入這個隊列的消息的指針。另外,Linux保留隊列的改動時間,例如上次隊列寫的時間等。Msqid_ds隊列也包括兩個等待隊列:一個用于向消息隊列寫,另一個用于讀。每一次一個進程試圖向?qū)戧犃袑懴ⅲ挠行в脩艉徒M的標識符就要和隊列的ipc_perm數(shù)據(jù)結(jié)構(gòu)的模式比較。如果進程可以想這個隊列寫,則消息會從進程的地址空間寫到msg數(shù)據(jù)結(jié)構(gòu),放到消息隊列的最后。每一個消息都帶有標記。因為Linux限制寫的消息的數(shù)量和長度,可能會沒有空間容納消息。這時,進程會被放到消息隊列的寫等待隊列,然后調(diào)用調(diào)度程序選擇一個新的進程運行。當一個或多個消息從這個消息隊列中讀出去的時候會被喚醒。從隊列中讀是一個相似的過程。進程的訪問權(quán)限一樣被檢查。一個讀進程可以選擇是不管消息的類型從隊列中讀取第一條消息還是選擇特殊類型的消息。如果沒有符合條件的消息,讀進程會被加到消息隊列的讀等待進程,然后運行調(diào)度程序。當一個新的消息寫到隊列的時候,這個進程會被喚醒,繼續(xù)運行。典型的消息隊列操作創(chuàng)建消息隊列發(fā)送普通消息發(fā)送緊急消息發(fā)送廣播消息接收消息刪除消息隊列獲取有關消息隊列的各種信息創(chuàng)建消息隊列創(chuàng)建消息隊列時,調(diào)用者可以指定如下參數(shù):消息的最大長度每個消息隊列中最多的消息數(shù)消息隊列的屬性任務等待消息時的排隊方式:FIFO或PRIORITY系統(tǒng)為新創(chuàng)建的消息隊列分配唯一的ID發(fā)送消息根據(jù)緊急程度的不同,消息通??煞譃槠胀ㄏ⑴c緊急消息。如果有任務正在等待消息(即消息隊列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務從等待隊列移到就緒隊列中,消息被拷貝到任務提供的緩沖區(qū)中(或者由接收任務得到指向消息的指針)。如果沒有任務等待,發(fā)送普通消息將消息放在隊列尾,而發(fā)送緊急消息將消息放在隊列頭。發(fā)送消息Msg3接收任務等待列表Msg2Msg1消息隊列發(fā)送普通消息-先進先出(FIFO)次序Msg3接收任務等待列表Msg2Msg1消息隊列發(fā)送緊急消息-后進先出(LIFO)次序發(fā)送消息如果發(fā)送消息時隊列已被填滿,則不同的操作系統(tǒng)可能采取不同的處理辦法:掛起試圖向已滿的消息隊列中發(fā)送消息的任務(不適用于中斷服務程序)簡單地丟棄該條消息并向調(diào)用者返回錯誤信息廣播消息。在此之前所有試圖從隊列中接收消息的任務此時都將獲得相同的消息。該功能拷貝消息到各任務的消息緩沖中(或者讓所有的等待任務得到指向消息的指針),并喚醒所有的等待任務。接收消息如果指定的消息隊列中有消息,則將其中的第一條消息拷貝到調(diào)用者的緩沖區(qū)(或者將第一條消息指針傳遞給調(diào)用者),并從消息隊列中刪除它。如果此時消息隊列中沒有消息,則可能出現(xiàn)以下幾種情況:永遠等待消息的到達:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中等待消息且指定等待時限:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中不等待,強制立即返回接收消息限時等待可有效預防死鎖中斷服務程序接收消息時必須選擇不等待,因為中斷服務程序是不能被阻塞的。如果消息隊列被應用刪除,則所有等待該消息隊列的任務都被返回一個錯誤信息,并回復到就緒狀態(tài)。接收消息Task4High消息隊列接收任務等待列表任務等待列表-基于優(yōu)先級的次序Task2mediumTask3mediumTask1LowTask4High消息隊列接收任務等待列表任務等待列表-先進先出(FIFO)次序Task2mediumTask3mediumTask1Low刪除消息隊列從系統(tǒng)中刪除指定的消息隊列,釋放消息隊列控制塊及消息隊列緩沖區(qū)。任何知道此消息隊列ID號的代碼都可以刪除它。消息隊列被刪除后,所有等待從這個消息隊列接收消息的任務都回到就緒態(tài),并得到一個錯誤信息表明消息隊列已被刪除。消息隊列的其他典型使用緊耦合的單向數(shù)據(jù)通信:發(fā)送任務發(fā)送消息后要求一個響應信號,表明接收任務已經(jīng)成功接收到消息。Task1Task2

消息隊列的其他典型使用緊耦合的雙向數(shù)據(jù)通信:如果數(shù)據(jù)需要在任務之間雙向流動,則可以采用緊耦合的雙向數(shù)據(jù)通信模式(也稱為全雙工通信)。Task1Task2第三節(jié)

事件概述事件機制的主要數(shù)據(jù)結(jié)構(gòu)典型的事件操作事件機制的典型應用在嵌入式實時內(nèi)核中,事件是指一種表明預先定義的系統(tǒng)事件已經(jīng)發(fā)生的機制。事件機制用于任務與任務之間、任務與ISR之間的同步。其主要的特點是可實現(xiàn)一對多的同步。

一個事件就是一個標志,不具備其它信息。一個或多個事件構(gòu)成一個事件集。事件集可以用一個指定長度的變量(比如一個8bit,16bit或32bit的無符號整型變量,不同的操作系統(tǒng)其具體實現(xiàn)不一樣)來表示,而每個事件由在事件集變量中的某一位來代表。概述事件及事件集有以下特點:事件間相互獨立事件僅用于同步,不提供數(shù)據(jù)傳輸功能事件無隊列,即多次發(fā)送同一事件,在未經(jīng)過任何處理的情況下,其效果等同于只發(fā)送一次。提供事件機制的意義在于:當某任務要與多個任務或中斷服務同步時,就需要使用事件機制。若任務需要與一組事件中的任意一個發(fā)生同步,可稱為獨立型同步(邏輯“或”關系)。任務也可以等待若干事件都發(fā)生時才同步,稱為關聯(lián)型同步(邏輯“與”關系)。概述“或”同步和“與”同步概述任務任務任務任務ISRISRORAND“與”型同步“或”型同步事件集事件集POSTPOSTPENDPEND用多個事件的組合發(fā)信號給多個任務概述任務任務任務ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND術語:發(fā)送事件集。指在一次發(fā)送過程中發(fā)往接收者(比如任務)的一個或多個事件的組合。待處理事件集。指已被發(fā)送到一個接收者但還沒有被接收(即正在等待處理)的所有事件的集合。事件條件。指事件接收者在一次接收過程中期待接收的一個或多個事件的集合。“或”同步:待處理事件集只要包括事件條件中的任一事件即可滿足要求;“與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。

概述事件機制的主要數(shù)據(jù)結(jié)構(gòu)事件集控制塊:管理所有創(chuàng)建的事件集或者事件集附屬于任務,不需創(chuàng)建,其相關參數(shù)成為任務控制塊的一部分典型的事件操作創(chuàng)建事件集刪除事件集發(fā)送事件(集)接收事件(集)獲取有關事件集的各種信息設置事件②設置事件②Task1ISR來自某設備的中斷Task2消息隊列Q事件標志集信號燈S01000100發(fā)送消息①釋放信號燈①接收消息④獲取信號量④③事件機制的典型應用解決復雜的應用設計問題①發(fā)送方(Task1或ISR)發(fā)送信息(消息或信號燈);②發(fā)送方(Task1或ISR)設置相應的事件標志(指示消息或信號燈的發(fā)送);③接收方(Task2)檢測事件標志集,判斷是否滿足其接收條件(“與”條件接收或“或”條件接收);④接收方(Task2)根據(jù)事件標志集的指示定向接收信息(消息或信號燈),達到和不同發(fā)送方(Task1或ISR)同步或通信的目的。

第四節(jié)

管道概述管道機制的主要數(shù)據(jù)結(jié)構(gòu)典型的管道操作管道機制的典型應用管道機制概述管道(pipe)是提供非結(jié)構(gòu)化數(shù)據(jù)交換和實現(xiàn)任務間同步的內(nèi)核對象。在傳統(tǒng)的實現(xiàn)中,管道是單向數(shù)據(jù)交換設施。Task1Task2管道管道中的數(shù)據(jù)寫描述符讀描述符向管道寫數(shù)據(jù)從管道讀數(shù)據(jù)數(shù)據(jù)在管道內(nèi)像一個非結(jié)構(gòu)字節(jié)流,按FIFO的次序從管道中讀出。當管道空時,阻塞讀者,當管道滿時,阻塞寫者。管道機制概述管道允許有多個讀者和寫者。Task1Task5管道Task2Task3Task4Task6ISR1ISR2ISR3公共管道操作管道機制概述管道與消息隊列的區(qū)別管道不存儲多個消息,它存儲的數(shù)據(jù)是非結(jié)構(gòu)化的字節(jié)流;管道中的數(shù)據(jù)嚴格地遵循先進先出的順序;管道支持選擇(select)操作,而消息隊列不支持。管道機制概述管道的狀態(tài)非空滿創(chuàng)建管道無寫入數(shù)據(jù)讀數(shù)據(jù),有剩余數(shù)據(jù)空寫數(shù)據(jù)讀數(shù)據(jù),無數(shù)據(jù)留下寫數(shù)據(jù),有剩余空間讀數(shù)據(jù)寫數(shù)據(jù),無剩余空

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論