cankaoTMS320C54x軟件開發課件_第1頁
cankaoTMS320C54x軟件開發課件_第2頁
cankaoTMS320C54x軟件開發課件_第3頁
cankaoTMS320C54x軟件開發課件_第4頁
cankaoTMS320C54x軟件開發課件_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第第5章章 TMS320C54x軟件開發軟件開發n5.1 軟件開發過程及開發工具軟件開發過程及開發工具n5.2 公共目標文件格式公共目標文件格式n5.3 常用匯編偽指令常用匯編偽指令n5.4 鏈接器命令文件的編寫與使用鏈接器命令文件的編寫與使用n5.5 匯編語言程序編寫方法匯編語言程序編寫方法n5.6 TMS320C54x C語言編程語言編程n5.7 用用C語言和匯編語言混合編程語言和匯編語言混合編程5.1 軟件開發過程及開發工具軟件開發過程及開發工具1建立源程序建立源程序2C編譯器(編譯器(C Compiler)3匯編器(匯編器(Assembler)4連接器(連接器(Linker)5調試工具

2、調試工具6十六進制轉換公用程序(十六進制轉換公用程序(Hex Conversion Utility) 返回首頁圖5-1 TMS320C54x DSP軟件開發流程表5-1 TMS320C54xV3.50版代碼生成工具程序返回本節5.2 公共目標文件格式公共目標文件格式n5.2.1 COFF文件的基本單元文件的基本單元段段n5.2.2 匯編器對段的處理匯編器對段的處理n5.2.3 鏈接器對段的處理鏈接器對段的處理n5.2.4 重新定位重新定位n5.2.5 程序裝入程序裝入n5.2.6 COFF文件中的符號文件中的符號 返回首頁5.2.1 COFF文件的基本單元文件的基本單元段段n段(段(secti

3、ons)是是COFF文件中最重要的概念。文件中最重要的概念。一個段就是最終在存儲器映象中占據連續空間的一個段就是最終在存儲器映象中占據連續空間的一個數據或代碼塊。目標文件中的每一個段都是一個數據或代碼塊。目標文件中的每一個段都是相互獨立的。一般地,相互獨立的。一般地,COFF目標文件包含目標文件包含3個缺個缺省的段:省的段:text段、段、data段、段、bss段。段。n段可以分為兩大類,即已初始化段和未初始化段。段可以分為兩大類,即已初始化段和未初始化段。如圖如圖5-2所示為目標文件中的段與目標系統中存儲所示為目標文件中的段與目標系統中存儲器的關系。器的關系。圖5-2 目標文件中的段與目標存

4、儲器的關系返回本節5.2.2 匯編器對段的處理匯編器對段的處理1未初始化段未初始化段n未初始化段主要用來在存儲器中保留空間,通常將它們定未初始化段主要用來在存儲器中保留空間,通常將它們定位到位到RAM中。這些段在目標文件中沒有實際內容,只是中。這些段在目標文件中沒有實際內容,只是保留空間而已。程序可以在運行時利用這些空間建立和存保留空間而已。程序可以在運行時利用這些空間建立和存儲變量。未初始化段是通過使用儲變量。未初始化段是通過使用.bss和和.usect匯編偽指令匯編偽指令建立的,兩條偽指令的句法分別為:建立的,兩條偽指令的句法分別為:.bss符號,字數符號,字數 符號符號.usect“段名

5、段名”,字數,字數2已初始化段已初始化段n已初始化段包含可執行代碼或已初始化數據。這已初始化段包含可執行代碼或已初始化數據。這些段的內容存儲在目標文件中,加載程序時再放些段的內容存儲在目標文件中,加載程序時再放到到TMS320C54X存儲器中。三個用于建立初始化存儲器中。三個用于建立初始化段的偽指令句法分別為:段的偽指令句法分別為: .text段起點段起點 .data段起點段起點 .sect“段名段名”,段起點,段起點3命名段命名段n命名段就是程序員自己定義的段,它與缺省命名段就是程序員自己定義的段,它與缺省的的.text、.data和和.bss段一樣使用,但與缺省段分段一樣使用,但與缺省段分

6、開匯編。開匯編。 data段不同的存儲器中,將未初始化的段不同的存儲器中,將未初始化的變量匯編到與變量匯編到與bss段不同的存儲器中。產生命段不同的存儲器中。產生命名段的偽指令為:名段的偽指令為: 符號符號.usect“段名段名”,字數,字數 .sect “段名段名”,段起點,段起點4子段子段n子段(子段(Subsections)是大段中的小段。鏈接器是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存可以像處理段一樣處理子段。采用子段可以使存儲器圖更加緊密。子段的命名句法為:儲器圖更加緊密。子段的命名句法為: 基段名:子段名基段名:子段名n子段也有兩種,用子段也有兩種,用.sec

7、t命令建立的是已初始化段,命令建立的是已初始化段,用用.usect命令建立的是未初始化段。命令建立的是未初始化段。5段程序計數器(段程序計數器(SPC)n匯編器為每個段安排一個獨立的程序計數器,即匯編器為每個段安排一個獨立的程序計數器,即段程序計數器(段程序計數器(SPC)。)。SPC表示一個程序代碼表示一個程序代碼段或數據段內的當前地址。開始時,匯編器將每段或數據段內的當前地址。開始時,匯編器將每個個SPC置置0,當匯編器將程序代碼或數據加到一,當匯編器將程序代碼或數據加到一個段內時,相應的個段內時,相應的SPC增加。如果匯編器再次遇增加。如果匯編器再次遇到相同段名的段,繼續匯編至相應的段,

8、且相應到相同段名的段,繼續匯編至相應的段,且相應的的SPC在先前的基礎上繼續增加。在先前的基礎上繼續增加。圖5-3 例5-1產生的目標代碼返回本節5.2.3 鏈接器對段的處理鏈接器對段的處理n鏈接器對段的處理有兩個功能。首先,它將匯編鏈接器對段的處理有兩個功能。首先,它將匯編器產生的器產生的COFF目標文件(目標文件(.obj文件)中的各種段文件)中的各種段作為輸入段,當有多個文件進行鏈接時,它將輸作為輸入段,當有多個文件進行鏈接時,它將輸入段組合起來,在可執行的入段組合起來,在可執行的COFF輸出模塊中建輸出模塊中建立各個輸出段。其次,鏈接器為輸出段選擇存儲立各個輸出段。其次,鏈接器為輸出段

9、選擇存儲器地址。器地址。n鏈接器有兩個命令完成上述功能,即:鏈接器有兩個命令完成上述功能,即:nMEMORY 命令命令定義目標系統的存儲器配置定義目標系統的存儲器配置圖,包括對存儲器各部分的命名,以及規定它們圖,包括對存儲器各部分的命名,以及規定它們的起始地址和長度。的起始地址和長度。nSECTIONS命令命令告訴鏈接器如何將輸入段組告訴鏈接器如何將輸入段組合成輸出段,以及在存儲器何處存放輸出段。子合成輸出段,以及在存儲器何處存放輸出段。子段可以用來更精確地編排段,可用鏈接器段可以用來更精確地編排段,可用鏈接器SECTIONS命令指定子段。命令指定子段。 圖5-4 鏈接器默認的存儲器分配返回本

10、節5.2.4 重新定位重新定位1鏈接時鏈接時重新定位重新定位n將各個段定位到存儲器中,每個段都從合適的地將各個段定位到存儲器中,每個段都從合適的地址開始。址開始。n將符號值調整到相對于新的段地址的數值。將符號值調整到相對于新的段地址的數值。n調整對重新定位后符號的引用。調整對重新定位后符號的引用。2運行時重新定位運行時重新定位n將代碼裝入存儲器的一個地方,而運行在另一個將代碼裝入存儲器的一個地方,而運行在另一個地方。利用地方。利用SECTIONS命令選項讓鏈接器定位兩命令選項讓鏈接器定位兩次。一些關鍵的執行代碼必須裝入在系統的次。一些關鍵的執行代碼必須裝入在系統的ROM中,但希望在較快的中,但

11、希望在較快的RAM中運行。中運行。n鏈接器提供了一個簡單的處理該問題的方法。利鏈接器提供了一個簡單的處理該問題的方法。利用用SECTIONS命令選項讓鏈接器定位兩次。第一命令選項讓鏈接器定位兩次。第一次使用裝入關鍵字設置裝入地址,再用運行關鍵次使用裝入關鍵字設置裝入地址,再用運行關鍵字設置運行地址。字設置運行地址。返回本節5.2.5 程序裝入程序裝入(1)硬件仿真器和)硬件仿真器和CCS集成開發環境,具有內部集成開發環境,具有內部的裝入器,調用裝入器的的裝入器,調用裝入器的LOAD命令即可裝入可命令即可裝入可執行程序。執行程序。(2)將代碼固化在片外存儲器中,采用)將代碼固化在片外存儲器中,采

12、用Hex轉換工轉換工具(具(Hex conversion utility),),例如例如Hex500將將可執行的可執行的COFF目標模塊(目標模塊(.out文件)轉換成幾文件)轉換成幾種其他目標格式文件,然后將轉換后的文件用編種其他目標格式文件,然后將轉換后的文件用編程器將代碼寫入程器將代碼寫入EPROM/Flash。 返回本節5.2.6 COFF文件中的符號文件中的符號nCOFF文件中有一個符號表,用于存儲程序中的文件中有一個符號表,用于存儲程序中的符號信息。符號信息。鏈鏈接器對符號重定位時使用該表,調接器對符號重定位時使用該表,調試工具也使用該表來提供符號調試。試工具也使用該表來提供符號調

13、試。n外部符號指在一個模塊中定義,在另一個模塊中外部符號指在一個模塊中定義,在另一個模塊中使用的符號。可使用使用的符號。可使用.def、.ref或或.global匯編偽匯編偽指令將符號定義為外部符號。指令將符號定義為外部符號。.def在當前模塊中在當前模塊中定義,可以在別的模塊中使用的符號;定義,可以在別的模塊中使用的符號;.ref在當在當前 模 塊 中 引 用 , 但 在 別 的 模 塊 中 定 義 的 符前 模 塊 中 引 用 , 但 在 別 的 模 塊 中 定 義 的 符號;號;.global可用于以上任何一種情況。可用于以上任何一種情況。返回本節5.3 常用匯編偽指令常用匯編偽指令返回

14、首頁表5-2 常用的匯編偽指令1段定義偽指令段定義偽指令n為便于鏈接器將程序、數據分段定位于指定的(物理存在為便于鏈接器將程序、數據分段定位于指定的(物理存在的)存儲器空間,并將不同的的)存儲器空間,并將不同的obj文件鏈接起來。段的使文件鏈接起來。段的使用非常靈活,但常用以下約定:用非常靈活,但常用以下約定:n.text 此段存放程序代碼。此段存放程序代碼。n.data 此段存放初始化了的數據。此段存放初始化了的數據。n.bss 此段存入未初始化的變量。此段存入未初始化的變量。n.sect 名稱名稱 定義一個有名段,放初始化了的數據或程定義一個有名段,放初始化了的數據或程序代碼。序代碼。2條

15、件匯編偽指令條件匯編偽指令n.if、.elseif、.else、.endif偽指令告訴匯編器按照表達式偽指令告訴匯編器按照表達式的計算結果對代碼塊進行條件匯編。的計算結果對代碼塊進行條件匯編。n.if expression 標志條件塊的開始,僅當條件為真標志條件塊的開始,僅當條件為真(expression的值非的值非0即為真)時匯編代碼。即為真)時匯編代碼。n.elseif expression 標志若標志若.if條件為假,而條件為假,而.elseif條件條件為真時要匯編代碼塊。為真時要匯編代碼塊。n.else 標志若標志若.if條件為假時要匯編代碼塊。條件為假時要匯編代碼塊。n.endif

16、標志條件塊的結束,并終止該條件代碼塊。標志條件塊的結束,并終止該條件代碼塊。3引用其他文件和初始化常數偽指令引用其他文件和初始化常數偽指令n.include 文件名文件名 將指定文件復制到當前位置,其內將指定文件復制到當前位置,其內容可以是程序、數據、符號定義等。容可以是程序、數據、符號定義等。n.copy 文件名文件名 與與.include類似。類似。n.def 符號名符號名 在當前文件中定義一個符號,可以被其他在當前文件中定義一個符號,可以被其他文件使用。文件使用。n.ref 符號名符號名 在其他文件中定義,可以在本文件中使用在其他文件中定義,可以在本文件中使用的符號。的符號。n.glob

17、al 符號名符號名 其作用相當于其作用相當于.def、.ref效果之和。效果之和。n.mmregs 定義存儲器映射寄存器的符號名,這樣就可定義存儲器映射寄存器的符號名,這樣就可以用以用AR0、PMST等助記符替換實際的存儲器地址。等助記符替換實際的存儲器地址。n.float 數數1,數,數2 指定的各浮點數連續放置到存儲器中指定的各浮點數連續放置到存儲器中(從當前段指針開始)。(從當前段指針開始)。n.word 數數1,數,數2 指定的各數(十六進制)連續放置到指定的各數(十六進制)連續放置到存儲器中。存儲器中。n.space n 以位為單位,空出以位為單位,空出n位存儲空間。位存儲空間。n.

18、end 程序塊結束。程序塊結束。4宏定義和宏調用宏定義和宏調用nTMS320C54x匯編支持宏語言。如果程序中需要多次執匯編支持宏語言。如果程序中需要多次執行某段程序,可以把這段程序定義(宏定義)為一個宏,行某段程序,可以把這段程序定義(宏定義)為一個宏,然后在需要重復執行這段程序的地方調用這條宏。然后在需要重復執行這段程序的地方調用這條宏。n宏定義如下:宏定義如下:Macname .macroparameter 1,parameter n .mexit .endm 返回本節5.4 鏈接器命令文件的編寫與使用鏈接器命令文件的編寫與使用n5.4.1 MEMORY偽指令及其使用偽指令及其使用n5.

19、4.2 SECTIONS偽指令及其使用偽指令及其使用 返回首頁5.4.1 MEMORY偽指令及其使用偽指令及其使用nMEMORY偽指令就是用來指定目標存儲器的模型。偽指令就是用來指定目標存儲器的模型。MEMORY偽指令的一般語法為:偽指令的一般語法為:n SECTIONS name : property ,property ,property . name : property ,property ,property . name : property ,property ,property . 返回本節5.4.2 SECTIONS偽指令及其使用偽指令及其使用nSECTIONS偽指令功能如下:

20、偽指令功能如下:n 說明如何將輸入段組合成輸出段。說明如何將輸入段組合成輸出段。n在可執行程序中定義輸出段。在可執行程序中定義輸出段。n指定輸出段在存儲器中存放的位置。指定輸出段在存儲器中存放的位置。n允許對輸出段重新命名。允許對輸出段重新命名。圖5-5 例5-6中段的定位返回本節5.5 匯編語言程序編寫方法匯編語言程序編寫方法n5.5.1 匯編語言源程序格式匯編語言源程序格式n5.5.2 匯編語言中的常數和字符串匯編語言中的常數和字符串n5.5.3 匯編源程序中的符號匯編源程序中的符號n5.5.4 匯編源程序中的表達式匯編源程序中的表達式 返回首頁5.5.1 匯編語言源程序格式匯編語言源程序

21、格式n助記符指令一般包含助記符指令一般包含4個部分,其一般組成形式個部分,其一般組成形式為:為:n標號標號: 助記符助記符 操作數操作數 ;注釋;注釋1標號區標號區n所有匯編指令和大多數匯編偽指令前面都可以帶所有匯編指令和大多數匯編偽指令前面都可以帶有標號,標號可以長達有標號,標號可以長達32個字符,由個字符,由AZ、az、09、_、和和$符號組成,且第一個字符不能是數符號組成,且第一個字符不能是數字,區分大小寫。字,區分大小寫。 2助記符區助記符區n助記符區不能從第一列開始,否則被認為是標號。助記符區不能從第一列開始,否則被認為是標號。3操作數區操作數區n操作數區是一個操作數列表,可以是常數

22、、符號或常數與操作數區是一個操作數列表,可以是常數、符號或常數與符號構成的表達式。操作數間需用符號構成的表達式。操作數間需用“,”號隔開。號隔開。4注釋區注釋區n注釋區可以從任何一列開始,可以包含注釋區可以從任何一列開始,可以包含ASCII字符和空格。字符和空格。 返回本節5.5.2 匯編語言中的常數和字符串匯編語言中的常數和字符串表5-3 COFF常數與字符串NoImage返回本節5.5.3 匯編源程序中的符號匯編源程序中的符號1標號標號2局部標號局部標號3符號常數符號常數4先定義的符號常數先定義的符號常數5替代符號替代符號NoImage表5-4 可以用在表達式中的運算符表5-5 帶有絕對符

23、號、可重定位符號的表達式NoImage返回本節5.5.4 匯編源程序中的表達式匯編源程序中的表達式n表達式可以是常數、符號或由算術運算符結合的表達式可以是常數、符號或由算術運算符結合的常 數 和 符 號 。 表 達 式 值 的 有 效 范 圍 為常 數 和 符 號 。 表 達 式 值 的 有 效 范 圍 為 -3276832767。1運算符(運算符(表表5-4 所示)所示)2合格的表達式合格的表達式(表表5-5所示所示 )返回本節5.6 TMS320C54x C語言編程語言編程n5.6.1 存儲器模式存儲器模式n5.6.2 寄存器規則寄存器規則n5.6.3 函數調用規則函數調用規則n5.6.4

24、 中斷處理中斷處理n5.6.5 表達式分析表達式分析 返回首頁5.6.1 存儲器模式存儲器模式1段段nC54x將存儲器處理為程序存儲器和數據存儲器兩將存儲器處理為程序存儲器和數據存儲器兩個線性塊。程序存儲器包含可執行代碼;數據存個線性塊。程序存儲器包含可執行代碼;數據存儲器主要包含外部變量、靜態變量和系統堆棧。儲器主要包含外部變量、靜態變量和系統堆棧。編譯器的任務是產生可重定位的代碼,允許鏈接編譯器的任務是產生可重定位的代碼,允許鏈接器將代碼和數據定位進合適的存儲空間。器將代碼和數據定位進合適的存儲空間。C編譯編譯器 對器 對 C 語 言 編 譯 后 除 了 生 成語 言 編 譯 后 除 了

25、生 成 3 個 基 本 段 ,個 基 本 段 ,即即. t e x t 、 . d a t a 、 . b s s外 , 還 生外 , 還 生成成.cinit、.const、.stack、.sysmem段段。2C/C+系統堆棧系統堆棧n.stack不同于不同于DSP匯編指令定義的堆棧。匯編指令定義的堆棧。DSP匯編程序中匯編程序中要將堆棧指針要將堆棧指針SP指向一塊指向一塊RAM,用于保存中斷、調用時用于保存中斷、調用時的返回地址,存放的返回地址,存放PUSH指令的壓棧內容。指令的壓棧內容。n.stack定義的系統堆棧實現的功能是保護函數的返回地址,定義的系統堆棧實現的功能是保護函數的返回地址

26、,分配局部變量,在調用函數時用于傳遞參數,保護臨時結分配局部變量,在調用函數時用于傳遞參數,保護臨時結果。果。n.stack定義的段大小(堆棧大小)可用鏈接器選項定義的段大小(堆棧大小)可用鏈接器選項-stack size設定,鏈接器還產生一個全局符號設定,鏈接器還產生一個全局符號_ _STACK_SIZE,并賦給它等于堆棧長度的值,以字為單位,缺省值為并賦給它等于堆棧長度的值,以字為單位,缺省值為1K。3存儲器分配存儲器分配(1)運行時間支持函數。)運行時間支持函數。 (2)動態存儲器分配。)動態存儲器分配。 (3)靜態和全局變量的存儲器分配。)靜態和全局變量的存儲器分配。(4)位域)位域/

27、結構的對準。結構的對準。 返回本節5.6.2 寄存器規則寄存器規則n寄存器規則明確了編譯器如何使用寄存器以及在函數調用寄存器規則明確了編譯器如何使用寄存器以及在函數調用過程中如何保護寄存器。過程中如何保護寄存器。(1)輔助寄存器)輔助寄存器 (2)堆棧指針)堆棧指針SP (3)ARP (4)在默認情況下,編譯器總是假定)在默認情況下,編譯器總是假定ST1中的中的OVM在硬件在硬件復位時被清復位時被清0。若在匯編代碼中對。若在匯編代碼中對OVM置位為置位為1,返回到,返回到C環境時必須復位。環境時必須復位。(5)寄存器變量)寄存器變量 返回本節5.6.3 函數調用規則函數調用規則(1)局部幀的產

28、生)局部幀的產生 (2)參數傳遞)參數傳遞 (3)函數的返回)函數的返回 返回本節5.6.4 中斷處理中斷處理(1)中斷的使能和屏蔽必須由程序員自己來設置。)中斷的使能和屏蔽必須由程序員自己來設置。 (2)中斷程序沒有參數傳遞,即使說明,也會被)中斷程序沒有參數傳遞,即使說明,也會被忽略忽略(3)中斷處理程序不能被正常的)中斷處理程序不能被正常的C程序調用。程序調用。(4)為了使中斷程序與中斷一致,在相應的中斷)為了使中斷程序與中斷一致,在相應的中斷矢量中必須放置一條轉移指令,可以用矢量中必須放置一條轉移指令,可以用.sect匯編匯編偽指令建立一個簡單的跳轉指令表來完成此項功偽指令建立一個簡單

29、的跳轉指令表來完成此項功能。能。(5)在匯編語言中,注意在符號名前面加上一個)在匯編語言中,注意在符號名前面加上一個下劃線,例如下劃線,例如c_int00記為記為_ c_int00。(6)中斷程序使用的所有寄存器,包括狀態寄存中斷程序使用的所有寄存器,包括狀態寄存器和程序中調用函數使用的寄存器都必須予以保器和程序中調用函數使用的寄存器都必須予以保護。護。(7)TMS320C54x C編譯器將編譯器將C語言進行了擴展,語言進行了擴展,中斷可以利用中斷可以利用interrupt關鍵字由關鍵字由C/C+函數直接函數直接處理。處理。返回本節5.6.5 表達式分析表達式分析n當當C程序中需要計算整型表達

30、式時,必須注意以程序中需要計算整型表達式時,必須注意以下幾點:下幾點:(1)算術上溢和下溢。)算術上溢和下溢。 (2)整除和取模。)整除和取模。 (3)C代碼對代碼對16位乘法結果高位乘法結果高16位的訪問。位的訪問。 返回本節5.7 用用C語言和匯編語言混合編程語言和匯編語言混合編程n5.7.1 獨立的獨立的C模塊和匯編模塊接口模塊和匯編模塊接口n5.7.2 從從C程序中訪問匯編程序變量程序中訪問匯編程序變量n5.7.3 在在C程序中直接嵌入匯編語句程序中直接嵌入匯編語句 返回首頁5.7.1 獨立的獨立的C模塊和匯編模塊接口模塊和匯編模塊接口n在編寫獨立的匯編程序時,必須注意以下幾點:在編寫

31、獨立的匯編程序時,必須注意以下幾點:(1)不論是用)不論是用C語言編寫的函數還是用匯編語言編語言編寫的函數還是用匯編語言編寫的函數,都必須遵循寄存器使用規則。寫的函數,都必須遵循寄存器使用規則。(2)必須保護函數要用到的幾個特定寄存器。)必須保護函數要用到的幾個特定寄存器。 (3)中斷程序必須保護所有用到的寄存器。)中斷程序必須保護所有用到的寄存器。(4)從匯編程序調用)從匯編程序調用C函數時,第一個參數(最左函數時,第一個參數(最左邊)必須放入累加器邊)必須放入累加器A中,剩下的參數按自右向中,剩下的參數按自右向左的順序壓入堆棧。左的順序壓入堆棧。(5)調用)調用C函數時,注意函數時,注意C函數只保護了幾個特定的函數只保護了幾個特定的寄存器,而其他是可以自由使用的。寄存器,而其他是可以自由使用的。(6)長整型和浮點數在存儲器中存放的順序是低位)長整型和浮點數在存儲器中存放的順序是

溫馨提示

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

評論

0/150

提交評論