




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ARM嵌入式軟件開發剖析嵌入式開發過程嵌入式開發過程“PC軟件軟件”獨立的嵌入式應用獨立的嵌入式應用當程序員開始開發一個基于ARM應用的時候,你可以使用ARM的ADS編寫類似于“HELLO WORLD”的程序,使用ARMulator或者在評估板上來調試,但當你把他移植到獨立的嵌入式應用設備中時,下面這些問題就成為我們首要考慮的:n 硬件環境中所使用的C庫函數n 目標板上的存儲器資源n 應用程序的初始化議程議程nPC軟件的構造軟件的構造定制標準C庫函數到目標板 定制IMAGE的存儲器映射到目標板復位和初始化深層次的存儲器器映象考慮編譯和調試IMAGEADS默認的標準默認的標準C庫庫ANSI Ci
2、nput/outputerror handlingstack &heapsetupotherSemihosting Support應用程序調用的應用程序調用的C庫函數庫函數eg: fputc三三設備驅動層設備驅動層使用使用semihosting SWIseg: _sys_write三三調試工具環境調試工具環境C LibraryDebug AgentC庫函數功能是支持PC軟件軟件的,而目標板上的可執行軟件則依賴相關的硬件資源;在ARM體系中,我們可以采用semihosting通過相應的驅動來進行調試。ADS默認的存儲器映射默認的存儲器映射n在默認的情況下,我們鏈接、定位、運行在在默認的情
3、況下,我們鏈接、定位、運行在0 x8000nheap 被直接放置在數據區的上面被直接放置在數據區的上面n堆棧的基地址是通過調試環境從堆棧的基地址是通過調試環境從C庫函數的庫函數的Startup Code 里讀取出來的。里讀取出來的。nARMulator = from configuration file (peripherals.ami) ndefault = 0 x08000000nMulti-ICE = from debugger internal variable $top_of_memoryndefault = 0 x80000RORWZI0 x8000鏈接時確定由調試環境提供Heap
4、(malloc,alloc)StackC LibraryUser Code應用程序啟動應用程序啟動_mainncopy code and datanzero uninitialized data_rt_entryset up application stack and heapinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )causes the linker to pull in library initialization code程序入口點Agenda一個PC軟件
5、的構造定制標準C庫函數到目標板 定制IMAGE的存儲器映射到目標板復位和初始化深層次的存儲器器映象考慮編譯和調試IMAGE重定向重定向C庫函數庫函數 (1)SemihostingSupportANSI Cinput/outputn你可以使用適合你目標板運行的驅動來替換標準你可以使用適合你目標板運行的驅動來替換標準C庫中的設備驅動。庫中的設備驅動。 Eg: printf( ) 可打印到可打印到LCD上,而不是打印控制臺上上,而不是打印控制臺上input/outputANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget重定向重定向C庫
6、函數庫函數(2)n要重定向要重定向C庫函數庫函數,簡單的辦法是使用你自己的可執行的簡單的辦法是使用你自己的可執行的semihosting SWIs來代來代替原來的替原來的C庫函數,從而來滿足你的系統要求庫函數,從而來滿足你的系統要求n 比如說比如說, the printf三系列函數三系列函數(sprintf三除外三除外) 都會調用都會調用fputc三三. 在默認情況在默認情況下下fputc三的執行使用了三的執行使用了semihosting SWI. 用下面的語句來代替:用下面的語句來代替:nextern void sendchar(char *ch);int fputc(int ch, FIL
7、E *f) /* e.g. write a character to an LCD */ char tempch = ch; sendchar(&tempch); return ch;n可查看在可查看在ADS Embedded exle目錄下的目錄下的retarget.c,可看到更多的重定向例子可看到更多的重定向例子 n你可以確定有不在連接時使用你可以確定有不在連接時使用semihosting SWI 的嗎的嗎?.消除消除C庫函數中的庫函數中的semi hostingn為了確保在連接時沒有函數使用了為了確保在連接時沒有函數使用了semi hosting SWIs ,你可以在程序中加入下
8、你可以在程序中加入下面的句子:面的句子:#pragma import(_use_no_semihosting_swi) n如果在程序中仍然使用了如果在程序中仍然使用了semihosting ,編譯時將會報錯:編譯時將會報錯:Error: Symbol _semihosting_swi_guard multiply definedn修改修改:n 如果使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么連接器將會把那些使用了smeihosting 的程序列出來, 然后:n提供你自己可運行的功
9、能函數。n在在ADS 1.2 編譯器和庫函數手冊編譯器和庫函數手冊, 表表4-2給出了所有使用了給出了所有使用了semihosting的的C庫函庫函數。數。n注意注意: 連接器在用戶自己的應用代碼中不會出現任何有關連接器在用戶自己的應用代碼中不會出現任何有關 semihosting SWI使用使用的報告。的報告。Agenda一個PC軟件的構造定制定制標準C庫函數到目標板 定制定制IMAGE的存儲器映射到目標板的存儲器映射到目標板復位和初始化深層次的存儲器器映象考慮編譯和調試IMAGE分散加載(分散加載(Scatterloading)n在一個實際應用當中,你可能并不想在在一個實際應用當中,你可能
10、并不想在0 x8000處開始運行。處開始運行。n大多數嵌入式系統都有存儲器設備,他們的地址空間是在整個存儲器映射中交叉出現的。n分散加載提供了一種把你的代碼和數據放在不同的存儲器定位上的辦法n分散加載定義了兩種類型的存儲器區域。nLoad 區: - 在reset/load時保留了應用程序的代碼和數據 (典型應用為 ROM).nExecution 區 在程序執行的同時保留了程序的代碼和數據。在應用程序啟動 期間,每個load區都可創建一個或多個可執行區。n分散加載了的應用把詳細的存儲器映射保存在一個描述文件中,作為一個參數給分散加載了的應用把詳細的存儲器映射保存在一個描述文件中,作為一個參數給a
11、rmlink使用使用 eg: armlink program.o -scatter scatter.scf -o program.axfExecute ViewRAM0 x100000 x180000 x40000 x0000ROMRO分散加載分散加載(簡單例子簡單例子)只讀代碼和數據保存在ROM中C庫函數初始化代碼 (在 _main) 將 :從ROM拷貝RW數據到RAM在RAM中的ZI 數據初始化RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWFill with zerosZICopyRWExecute ViewRAM0 x100000 x1
12、80000 x40000 x0000ROMROLOAD_ROM 0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWScatter 描述文件描述文件n通配符(*)語法允許簡單的對CODE 和DATA 進行分組EXEC_ROM 0 x0000 0 x4000 * (+RO)RAM 0 x10000 0 x8000 * (+RW,+ZI)RWZIRORWZIROCODERO -DATARO -CODEAB鏈接器放置規則鏈接器放置規則n在每個可執行區,鏈接器通過一些基本的規則來放置在每個可執行區,鏈接器通過一些基本的規則來放
13、置CODE 和和DATAn基本的排序方法是通過屬性來安排的基本的排序方法是通過屬性來安排的:nRO 領先于RW ,RW 領先于ZIn有相同的屬性時,CODE 在DATA之前放置。n更多的排序方法決定于:更多的排序方法決定于:n輸入的組名按字母排序, n在ARMLINK命令行中指定的順序。neg: armlink Asection Afrom file1.osection Afrom file2.o在在SCATTOR 文件中的對象排序文件中的對象排序n為了把特定的為了把特定的CODE 和和DATA 放在指定的地址上,你可以不考慮標準的放置規則放在指定的地址上,你可以不考慮標準的放置規則n使用使用
14、+FIRST 和和 +LAST ,直接把第一個和最后一個對象放在可執行區。直接把第一個和最后一個對象放在可執行區。n圖例:把VECTOR表放在區的開始。LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) file1.o (+RO) file2.o (+RO) :在可執行區內,scattor 文件中要排序的對象對輸出image沒有影響鏈接器的標準放置規則仍然適用ROOT區區LOAD_ROM 0 x0000 0 x4000 ; start address and length EXEC_ROM
15、0 x0000 0 x4000 ; root (load = exec address) _main.o (+RO) ; copying code * (Region$Table) ; RO/RW addresses to copy * (ZISection$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000 * (+RO) ; All other RO areas * (+RW,+ZI) ; program variables Must be in a root regionoutside root region一個 root 區是一個可執行
16、區,它的加載地址等于執行地址。Root區要點區要點n一個 root 區是一個可執行區,它的加載地址等于執行地址.n每個每個scatter描述文件必須最少包含一個描述文件必須最少包含一個root區,并且最少要包含下列內容:區,并且最少要包含下列內容:n 含有拷貝code/data的代碼nRegion$Table 和 ZISection$Table 含有將要拷貝的code/data的地址,他是由鏈接器產生的,不是一個對象文件。(所以*必須用)Error: L6202E: Section Region$Table cannot be assigned to a non-root region.Err
17、or: L6202E: Section ZISection$Table cannot be assigned to a non-root region.n注意注意: 如果如果 * (+RO)被定位在被定位在 root 區區,在此之前的將被自動放置在此之前的將被自動放置nMain應用程序的入口點必須放在應用程序的入口點必須放在root區。區。Error: L6203E: Entry point (0 x08000000) lies within non-root region EXE_FLASH.Run-time 存儲器管理存儲器管理 SemihostingSupportANSI CStack
18、&HeapSetupStack &HeapSetupANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget如何設置stack和 heap來滿足我們的目標存儲器? n我們已經通過執行我們已經通過執行_user_initial_stackheap三把三把C標準庫的運行存儲器模式修標準庫的運行存儲器模式修改到目標平臺上。改到目標平臺上。Stack 和和 Heap 初始化初始化C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryin
19、itialize library functionscall top-level constructors (C+)Exit from applicationmain( )cause linker to pull in library initialization codeImage Entry Point_user_initial_stackheap( )set up application stack and heapRun-time 存儲器模式存儲器模式n你必須決定在放置你必須決定在放置stack和和heap時所使用的區域是單一的區時所使用的區域是單一的區(one-region mode
20、l)或是不同的兩個區或是不同的兩個區(two-region model)HeapStackStackOne region modelTwo region modelHBSBSBHBHL單一存儲器模式是默認方式為了實現多區域模式,你可以使用 use_two_region_memory在所有的模式下,軟件堆棧檢查要許可。編譯開關是: -apcs /swst 指定堆棧限制 (為 two-region 模式)heap is checked against stack pointerHeapheap is checked against heap limit(SL)_user_initial_stack
21、heap( )n可以用可以用C或匯編來寫,他要返回:或匯編來寫,他要返回:nHeap 基地址在R0 ,STACK 的基地址在R1.nHeap 的限制地址在R2,STACK的限制地址在R3EXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, =0 x80000 ;HBLDR r1, =0 x88000 ;SB; r2 not used (HL); r3 not used (SL)MOV pc, lrHeapStackHeap 的限制地址在單一模式是不被使用的。Stack 的限制地址只在軟件堆棧檢查許可的情況下才有效。HB = 0
22、 x80000SB = 0 x88000警告警告! n當使用分散加載時你必須執行當使用分散加載時你必須執行 _user_initial_stackheap三三n在在C庫初始化代碼內的庫初始化代碼內的_user_initial_stackheap三三 的默認執行是在映像文件的的默認執行是在映像文件的RW/ZI數據段后放置數據段后放置HEAP。n使用使用 Image$RW$Base / Image$ZI$Base 連接符號連接符號n這些符號對這些符號對scatterloading是無效的。是無效的。n在和早期版本的軟件中:在和早期版本的軟件中:n符號被設置為符號被設置為0X0, heap被定位在這
23、被定位在這!nHeap的并發使用,無論是直接的并發使用,無論是直接(e.g. with malloc三三)或間接或間接(by use of argc/argv)的都可能破壞向量表或其他代碼,典型的結果是不可預知的程序在運的都可能破壞向量表或其他代碼,典型的結果是不可預知的程序在運行時出錯了。行時出錯了。n在在ADS 1.2:n符號沒有定義,應用程序不會聯接:符號沒有定義,應用程序不會聯接:nError: L6218E: Undefined symbol Image$ZI$Limit (referred from sys_stackheap.o).Agenda一個PC軟件的構造裁減標準C庫函數到
24、目標板 定制IMAGE的存儲器映射到目標板復位和初始化復位和初始化深層次的存儲器器映象考慮編譯和調試IMAGEThe Vector TableAREA Vectors, CODE, READONLYIMPORT Reset_Handler; import other exception handlers; ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP; Reserved vectorBIRQ_Handler; FIQ_Handler will follow directlyE
25、ND在使用scatterloading+FIRST時直接定位在0X0(或 0 xFFFF0000)ENTRY 直接告訴鏈接器這是一個入口點,防止某些段被刪除中斷向量表中斷向量表初始化步驟初始化步驟C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )tells linker to link in library initializ
26、ation codeImage Entry Point_user_initial_stackheap( )set up stack & heapreset handlerinitialize stack pointersconfigure MMU/MPUsetup cache/enable TCM$Sub$main( )enable caches & interruptsROM or RAM at 0 x0?n需要一個有效的地址在需要一個有效的地址在 0 x0這項功能可被編碼在像RESET HANDLER 一樣的模塊中在本章結束的時候,我們還會講到。ROM0 x100000 x
27、180000 x40000 x0000AliasedROMReset HandlerROM/RAM RemappingRAM0 x100000 x180000 x40000 x0000ROMROM at 0 x0Reset HandlerVectorsReset Handler0 x40000 x0000RAMVectorsROM/RAM Remapping 下面的例子可像Reset handler 一樣在源碼中編碼。; - Integrator CM control regCM_ctl_reg EQU 0 x1000000C ; Address of CM Control RegisterR
28、emap_bit EQU 0 x04 ; Bit 2 is remap bit of CM_ctl ENTRY; On reset, an alias of ROM is at 0 x0, so jump to real ROM. LDR pc, =Instruct_2 Instruct_2 ; Remap by setting Remap bit of the CM_ctl register LDR r1, =CM_ctl_reg LDR r0, r1 ORR r0, r0, #Remap_bit STR r0, r1; RAM is now at 0 x0.; The exception
29、vectors must be copied from ROM to RAM (in _main); Reset_Handler follows on from here這個功能也可在有mmu時使用ROM/RAM的重定向的重定向初始化棧的指針初始化棧的指針; - Amount of memory (in bytes) allocated for stacksLen_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256 Offset_FIQ_Stack EQU 0Offset_IRQ_Stack EQU Offset_FIQ_Stack + Len_FIQ_Stack R
30、eset_Handler LDR r0, stack_base ; located by scatter file; Enter each mode in turn and set up the stack pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_FIQ_Stack MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_IRQ_Stack ; System mode st
31、ack is set up last MSR CPSR_c, #Mode_SYS:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_SYS_Stack; Set up stack limit if needed LDR r10, stack_limit ; located by scatter file局部存儲器設置局部存儲器設置nrun-time的存儲器必須在的存儲器必須在C庫初始化前定義庫初始化前定義n如果你使用的ARM7芯片還有MMU/MPU,它必須設置;nROM/RAM 的重新映射必須完成。nTCMs(Tightly coupl
32、ed memory) 如果有如果有TCM,典型的必須使能它。典型的必須使能它。n請注意:在TCM使能之前,要屏蔽ROMn在Cache打開之前要返回。n在在c庫初始化代碼運行之后,如果庫初始化代碼運行之后,如果cache被使能,可以避免與被使能,可以避免與cache相關的問題;相關的問題;擴展功能擴展功能n系統初始化代碼通常在進入主應用之前運行系統初始化代碼通常在進入主應用之前運行n當然,當然,reset handler 不是一個適合使能中斷和使能不是一個適合使能中斷和使能caches地方。地方。n在在reset handler最后應該放一個最后應該放一個C運行庫初始化代碼運行庫初始化代碼nEG
33、。 IMPORT _mainn B _mainn我們可使用我們可使用$Sub和和$Super功能來包裝符號功能來包裝符號nextern void $Super$main(void);nvoid $Sub$main(void)nn cache_enable三三;/ enables cachesn int_enable三三; / enables interruptsn sys_to_usr_mode三三;/ change mode - see next sliden $Super$main三三;/ calls original main三三nn相關描述可在章查閱到。相關描述可在章查閱到。運行模式考
34、慮運行模式考慮n主應用程序運行在何種模式是要考慮的重要問題。主應用程序運行在何種模式是要考慮的重要問題。n用戶模式(User mode)是非特權模式(unprivileged mode)-保護你的系統n系統初始化代碼只能運行在特權模式系統初始化代碼只能運行在特權模式(privileged mode)。n需要執行特權操作 比如:使能中斷。n如果你的應用要運行在管理模式如果你的應用要運行在管理模式,簡單的在管理模式下退出你的簡單的在管理模式下退出你的reset handler 就就可。可。n如果你想在用戶模式下運行你的應用,你需在如果你想在用戶模式下運行你的應用,你需在$Sub$main( )改變
35、為用戶模式改變為用戶模式n當然, _user_initial_stackheap( ) 必須有權使用你的應用模式寄存器。n解決辦法是在系統模式里退出reset handlern所有C庫初始化代碼有權使用用戶寄存器,但是仍然可以執行特權操作。Agenda一個PC軟件的構造裁減標準C庫函數到目標板 定制IMAGE的存儲器映射到目標板復位和初始化深層次的存儲器器映象考慮編譯和調試IMAGE長跳轉長跳轉VeneersROM_LOAD 0 x0000 ROM_EXEC 0 x0000 * (+RO) RAM 0 x80000000 farfunc.o (+RO) * (+RW,+ZI) /* main.
36、c */int main(void) farfunc三三; /* farfunc.c */ void farfunc(void); :代碼段可被遠距離分開放置 (比BL的跳轉范圍還遠)鏈接器可自動增加長跳轉Veneers,遠距離的函數可被成功調用。0 x00000000 bl Ven$AA$L$farfunc:Ven$AA$L$farfunc ldr pc,pc,#-4dcd 0 x80000000:0 x80000000:mov pc,lr存儲器映射寄存器存儲器映射寄存器n你可以使用你可以使用scatterloading來放置外設寄存器的存儲器映射來放置外設寄存器的存儲器映射n在文件中定義它
37、在文件中定義它 e.g. struct volatile unsigned reg1; /* timer control */ volatile unsigned reg2; /* timer value */ timer_reg;在存儲器映射的請求地址上增加另外的可執行區來放置他們在存儲器映射的請求地址上增加另外的可執行區來放置他們:LOAD_FLASH 0 x24000000 0 x04000000 : TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) :UNINIT 顯示在顯示在 ZI 段沒有被初始化為段沒有被初始化為0。Stack 和和 Heap 區
38、區(1)n你也可以在你也可以在SCATTER文件中放置文件中放置stack和和heapn在匯編原文件里定義在匯編原文件里定義stack 和和heap 區區 比如比如. stackheap.sn這個空間直接保留一個為0的存儲器塊AREA stack, DATA, NOINITSPACE 0 x3000 ; Reserve stack spaceAREA heap, DATA, NOINITSPACE 0 x3000 ; Reserve heap spaceENDStack 和和 Heap 區區(2)n增加一個可執行區來定位這個區域增加一個可執行區來定位這個區域LOAD_FLASH 0X24000
39、000 0 x04000000:STACK 0 x1000 UNINIT ; length = 0 x3000 stackheap.o (stack) ; stack = 0 x4000 to 0 x1000HEAP 0 x15000 UNINIT ; length = 0 x3000 stackheap.o (heap) ; heap = 0 x15000 to 0 x18000nHeap的基地址起始為的基地址起始為 0 x15000. Stack的最大地址為的最大地址為 0 x4000.Stack 和和 Heap 區區 (3)n鏈接器將產生一個為每個可執行區的基地址和限制地址的符號指針鏈接
40、器將產生一個為每個可執行區的基地址和限制地址的符號指針n在你的代碼中引入這些符號IMPORT |Image$STACK$ZI$Base|IMPORT |Image$STACK$ZI$Limit|IMPORT |Image$HEAP$ZI$Base|IMPORT |Image$HEAP$ZI$Limit|stack_baseDCD |Image$STACK$ZI$Limit|stack_limitDCD |Image$STACK$ZI$Base|heap_baseDCD |Image$HEAP$ZI$Base|heap_limitDCD |Image$HEAP$ZI$Limit|n使用使用DCD
41、指令為這些段命名指令為這些段命名_user_initial_stackheap( )n在在reset handler,這個這個stack指針指針 (r13)和和stack 限制值限制值(r10) 通常設置了,他們通常設置了,他們分別通過分別通過R1和和R3作為參數傳遞給作為參數傳遞給 _user_initial_stackheapIMPORT _use_two_region_memoryEXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, heap_base; SB value setup in reset handler L
42、DR r2, heap_limit; SL value setup in reset handlerMOV pc, lrStackHeap這個_user_initial_stackheap( )例子實現了兩個存儲器區域模式。 必須引用 _use_two_region_memory,在這HEAP被檢查,它是HEAP的限制值,而不是STACK指針存儲器映射例子存儲器映射例子16 bitRAM0 x100000 x180000 x40000 x0000Fast32 bitRAMVector TableStackException HandlersRW & ZIHeapFlash0 x2400
43、00000 x28000000Reset HandlerROPeripherals0 x40000000外設控制寄存器的地址映射直接在FLASH運行的代碼大小16位 RAM 被用來保存數據和HEAP區一些緊急的代碼和數據可放在快速的RAM區SCATTER文件例子文件例子 : :16bitRAM 0 x10000 * (+RW,+ZI) HEAP 0 x15000 UNINIT stackheap.o (heap) TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) FLASH 0 x24000000 0 x04000000 FLASH 0 x24000000
44、0 x04000000 init.o (Init, +First) * (+RO) 32bitRAM 0 x0000 vectors.o (Vect, +First) handlers.o (+RO) STACK 0 x1000 UNINIT stackheap.o (stack) :這個scatter文件執行上頁所顯示的存儲器映射。Agenda一個PC軟件的構造裁減標準C庫函數到目標板 定制IMAGE的存儲器映射到目標板復位和初始化深層次的存儲器器映象考慮編譯和調試編譯和調試IMAGE不使用段的消除和程序的入口點不使用段的消除和程序的入口點n在默認的情況下,鏈接器將從最終的在默認的情況下,鏈
45、接器將從最終的image文件中刪除一些從不使用的代碼段文件中刪除一些從不使用的代碼段,或從未使用的數據段。,或從未使用的數據段。n要查看哪些段被刪除了,在鏈接時用:要查看哪些段被刪除了,在鏈接時用: -info unused.n為了確保不刪除重要的段為了確保不刪除重要的段(比如:中斷向量表比如:中斷向量表) :n使用匯編指令使用匯編指令entry標示所有的入口點(標示所有的入口點(c庫有一個入口點:庫有一個入口點:_main三三),n使用使用-entry選擇其中一個入口點作為選擇其中一個入口點作為image的入口,否則,鏈接器將給警的入口,否則,鏈接器將給警 告:告:Image does not have an entry point. (Not specified or not set due to multiple choices)n在生成在生成ROMmable image 使推薦使用下面的鏈接命令:使推薦使用下面的鏈接命令:armlink obj1.o obj2.o -scatter scatter.scf -info unused -entry 0 x0 -o pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鹽城市2024-2025學年五年級下學期數學期末試題一(有答案)
- 2025福建省泉州鳳棲實業有限責任公司社會招聘17人筆試備考試題附答案詳解(完整版)
- 化學●福建卷丨2021年福建省普通高中學業水平選擇性考試化學試卷及答案
- 《老年人能力評估師》三級模擬考試題含答案
- 鄉鎮衛生院財務管理
- 2025兒童腺樣體肥大臨床診治管理專家共識
- AI大模型賦能智慧港口數字化解決方案
- 教學副校長第二學期工作總結
- 銷售策劃試題及答案
- 西醫綜合試題及答案
- 充電員安全培訓課件
- 2025年北京控股集團招聘筆試參考題庫含答案
- 2025-2030年堅果仁能量棒健康配方行業深度調研及發展戰略咨詢報告
- 美愛德華·W·薩義德-東方學
- 工程掛靠協議合同
- 舊電梯拆除作業流程及安全規范
- 2025年上半年婦幼衛生工作總結模版(2篇)
- 《向畫家學構圖》課件
- 《黛玉葬花》課件:從葬花看黛玉的人生哲學
- 新《科學技術普及法》專題講座課件
- 藥品管理與使用規范管理制度
評論
0/150
提交評論