版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、DSP的CMD文件詳解(整理版CMD是用來分配ROM和RAM空間用的,告訴鏈接程序怎樣計(jì)算地址和分配 空間。所以不同的芯片就有不同大小的ROM和RAM ,存放用戶程序的地方也不 盡相同。所以要根據(jù)芯片進(jìn)行修改,分為MEMORY和SECTIONS兩個局部。MEMORY(PAGE 0PAGE 1)SECTIONS(.vectors.reset)MEMORY是用來指定芯片的ROM和RAM的大小和劃分出幾個區(qū)間。PAGE 0對應(yīng)ROM , PAGE 1對應(yīng)RAM o PAGE里包含的區(qū)間名字與其后面的參數(shù)反映 了該區(qū)間的起始地址和長度。SECTIONS :(在程序里添加下面的段名,如.vectors。
2、用來指定該段名以下, 另一個段名以上的程序(屬于PAGE0或數(shù)據(jù)(屬于PAGE1放到“”符號后的空間名 字所在的地方。SARAM : origin = 0800h , length = 0800h EXT : origin = 8000h , length = 8000h SECTIONS.reset: VECS PAGE 0.vectors : VECS PAGE 0 .pvecs : PVECS PAGE 0 .text: PROG PAGEO.cinit: PROG PAGE 0.bss : SARAM PAGE 1,const: SARAM PAGE 1 .stack : Bl PAG
3、E 1)第二章CMD文件的編寫L COFF格式1通用目標(biāo)文件格式(Common Object File Format)是一種流行的二進(jìn)制可執(zhí) 行文件格式,二進(jìn)制可執(zhí)行文件包括庫文件(lib),目標(biāo)文件(obj)最終可執(zhí)行 文件(out) o ,現(xiàn)今PC機(jī)上的Windows95和NT4.0以后的操作系統(tǒng)的二進(jìn)制文 件格式(PE)就是在COFF格式基礎(chǔ)上的進(jìn)一步擴(kuò)充。2COFF格式:詳細(xì)的COFF文件格式包括段頭,可執(zhí)行代碼和初始化數(shù) 據(jù),可重定位信息,行號入口,符號表,字符串表等,這些屬于編寫操作系統(tǒng)和編 譯器人員關(guān)心范疇。而對于C只需要了解定義段和給段分配空間就可以了。3采用COFF更有利于模
4、塊化編程,程序員可以自由決定愿意把哪些代碼歸屬到哪些段,然后加以不同的處理。2、Section目標(biāo)文件中最小單位稱為塊。一個塊就是最終在存儲器映象中占據(jù) 連續(xù)空間的一段代碼或數(shù)據(jù)。1COFF目標(biāo)文件包含三個默認(rèn)的塊:.text可執(zhí)行代碼.data已初始化數(shù)據(jù).bss為未初始化數(shù)據(jù)保存的空間2匯編器對塊的處理未初始化塊:.bss變量存放空間.usect用戶自定義的未初始化段初始化塊:.text匯編指令代碼.data常數(shù)數(shù)據(jù)(比方對變量的初始化數(shù)據(jù)).sect用戶自定義的已初始化段.asect通.sect ,多了絕對地址定位功能,一般不用3C語言的段未初始化塊(data):.bss存放全局和靜態(tài)變
5、量.ebss長調(diào)用的.bss(超過了 64K地址限制.stack存放C語言的棧.sysmem存放C語言的堆.esysmem長調(diào)用的.sysmem(超過了 64K地址限制初始化塊:.text可執(zhí)行代碼和常數(shù)(program.switch switch語句產(chǎn)生的常數(shù)表格(program/低64K數(shù)據(jù)空間).pinit Tables for global constructors (C+(program.cinit用來存放對全局和靜態(tài)變量的初始化常數(shù)值(program.const全局和靜態(tài)的const變量初始化值和字符串常數(shù),(data ) .econst 長.const (可定位到任何地方)(da
6、ta)3自定義段(C語言)#pragma DATA_SECTION(函數(shù)名或全局變量名,”用戶自定義在數(shù)據(jù)空間的段 名;#pragmaCODE_SECTION(函數(shù)名或全局變量名,用戶自定義在程序空間的 段名,不能在函數(shù)體內(nèi)聲明,必須在定義和使用前聲明,#pragma可以阻止對未 調(diào)用的函數(shù)的優(yōu)化3、連接命令文件(CMD)1 MEMORY指定存儲空間MEMORYPAGE 0:name 0 fattr : origin 二 constant, length 二 constant PAGE n:name n attr : origin = constant, length = constant )
7、PAGE n:標(biāo)示存儲空間,n SECTIONS分配段SECTIONS( name : property,property,)name:輸出段的名稱property :輸出段的屬性:load = allocation (強(qiáng)制地址或存儲空間名稱)同allocation :定義輸出段將會 被裝載到哪里。run= allocation (強(qiáng)制地址或存儲空間名稱)同allocation :定義輸出段將會在 哪里運(yùn)行。注:CMD文件中只出現(xiàn)一個關(guān)鍵字load或run時,表示兩者的地址時表示兩 者的地址時重合的。PAGE = n,段位于那個存儲頁面空間。例:ramfuncs : LOAD = FLASHD
8、,RUN = RAMLO,LOAD_ST ART (_RamfuncsLoadStart,LOAD_END(_RamfuncsLoadEnd,RUN_START (_RamfuncsRunStart,PAGE= 03直接寫編譯命令1 rts2800_ml.lib 連接系統(tǒng)文件 rts2800_ml.libo filename.out最終生成的二進(jìn)制文件命名為filename.outm filename.map 生成映射文件 filename.mapstack 0 x200 堆棧為 512 字4、.const 段:由關(guān)鍵字const限定的全局變量(const限定的局部變量不產(chǎn)生)初始化值,和 出
9、現(xiàn)在表達(dá)式(做指針使用,而用來初始化字符串?dāng)?shù)組變量不產(chǎn)生)中的字符串常 數(shù),另外數(shù)組和結(jié)構(gòu)體是局部變量時,其初始值會產(chǎn)生.const段,而全局時不產(chǎn) 生。DSP的CMD文件講解2 :CMD文件由三局部組成:(1輸入輸出定義;(2 MEMORY命令/ (3 SECTION 命令。輸入/輸出定義:這一局部,可以通過CCS的“Build Option”菜單設(shè)置o Obj鏈接的目標(biāo)文件o lib鏈接的庫文件o m叩生成的交叉索引文件o out生成的可執(zhí)行代碼MEMORY命令:描述系統(tǒng)實(shí)際的硬件資源SECTION命令:描述“段”如何定位 下面給出一個例子:-C0 hello.outm hello.map
10、-stack 1001 rts2xx.libMEMORY (PAGE 0: VECT:origin=0 x8000,length 0 x040PAGE 0: PROG:origin=0 x8040,length 0 x6000PAGE 1: DATA:origin=0 x8000,length 0 x400 )SECTIONS.vextors VECT PAGE 0.text PROG PAGE 0.bss DATA PAGE 1.const DATA PAGE 1)存儲模型說明:.cinit存放程序中的變量初值和常量,const存放程序中的字符常量、浮點(diǎn)常量和用const聲明的常量.swit
11、ch存放程序中switch語句的跳轉(zhuǎn)地址表.text存放程序代碼.bss為程序中的全局和靜態(tài)變量保存存儲空間.far為程序中用far聲明的全局和靜態(tài)變量保存空間.stack為程序系統(tǒng)堆棧保存存儲空間,用于保存返回地址、函數(shù)間的參數(shù)傳 遞、存儲局部變量和保存中間結(jié)果.sysmem用于程序中的malloc、calloc、和realoc函數(shù)動態(tài)分配存儲空間.text 可執(zhí)行代碼一、CMD命令文件常用的偽指令1、.cint :存放已明確初始化的全局變量和靜態(tài)變量2s .const :存放已明確初始化的字符串常量、全局變量和靜態(tài)常量3、.switch :存放對于大型switch語句的跳轉(zhuǎn)表4s .tex
12、t :存放可執(zhí)行代碼和浮點(diǎn)數(shù)常量.bss :存放沒有初始化的全局變量和靜態(tài)變量.stack :定義軟件堆棧二、CMD命令文件內(nèi)容CMD是用來分配程序存儲器空間rom和數(shù)據(jù)存儲器空間ram的,告訴鏈接程 序怎樣計(jì)算地址和分配空間。不同的芯片有不同大小的rom和ram,放用戶程序 的地方也不盡相同,所以要根據(jù)DSP的存儲器的地址范圍來編寫。分兩局部: MEMORY 和 SECTIONS.1、MEMORY是用來指定芯片的rom和ram的大小和劃分出幾個區(qū)間。MEMORY PAGE 0 : namel(attr: origin二constant, length=constant;PAGE 1 : na
13、men(attr: origin二constant, length二constant;PAGE 0對應(yīng)rom , PAGE 1對應(yīng)ram o PAGE里包含的區(qū)間名字與其后面的 參數(shù)反映了該區(qū)間的起始地址和長度。name存儲器名稱,同一頁上的存儲器名稱 不能相同,不同頁上的可以相同。attr存儲區(qū)的屬性,未規(guī)定的可以有R (只 讀)、W (只寫)、X (存儲器可以包含可執(zhí)行代碼)、I (存儲器可以被初始 化)。2、Section塊用來控制段的構(gòu)成與地址分配。對于不同的系統(tǒng)配置,Section的 分配方式也不相同,鏈接器通過Section來控制地址的分配,所以Section的分配成 了配置 d文
14、件的重要環(huán)節(jié)。SECTIONS.vectors : VECS PAGE 0.reset: VECS PAGE 0它分成兩個基本的局部:(1)被初始化的Section (包含數(shù)據(jù)表和可執(zhí)行代碼).text :它包含所有的可執(zhí)行代碼和常數(shù),必須放在程序頁.cinit :它包含初始化的變量和常量表,要求放在程序頁,pinit :它包括全局構(gòu)造器(C+)初始化的變量表,要求放在程序頁.const :它包括字符串、聲明、以及被明確初始化過的全局和靜態(tài)變量,要求 放在低地址數(shù)據(jù)頁。.econst:是在使用大存儲器模式時使用的,包括字符串、聲明、以及被明確初 始化過的全局變量和靜態(tài)變量,可以在數(shù)據(jù)頁的任何地
15、方。.switch :它包括為轉(zhuǎn)換聲明設(shè)置的表格,可以放在程序頁,也可以放在低地址 的數(shù)據(jù)頁。(2)未被初始化的Section(為程序運(yùn)行中創(chuàng)立和存放的變量在存儲器中保存 空間.bss :它為全局變量和靜態(tài)變量保存空間.在程序開始運(yùn)行時,C導(dǎo)入路徑把數(shù) 據(jù)從.cinit節(jié)復(fù)制出去然后存在.bss節(jié)中.要求放在低地址的數(shù)據(jù)頁.ebbs :它是在遠(yuǎn)訪問(C和大存儲器模式下使用,它為全局變量和靜態(tài)變量保存 空間.在程序開始運(yùn)行時,c導(dǎo)入路徑把數(shù)據(jù)從.cinit段復(fù)制出去然后存在.ebss節(jié) 中??梢源娣旁跀?shù)據(jù)頁的任何地方。.stack :為C系統(tǒng)堆棧保存空間,這局部存儲器為用來將聲明傳給函數(shù)及為局
16、部變量留出空間。要求放在低地址的數(shù)據(jù)頁。.system :動態(tài)存儲器分配保存空間,這個空間用于malloc函數(shù),如果不使用 malloc函數(shù),這個段的大小就是0。要求放在低地址的數(shù)據(jù)頁。.esystem :動態(tài)存儲器分配保存空間,這個空間用于外部malloc函數(shù),如果不 使用外部malloc函數(shù),這個段的大小就是0??梢卜旁跀?shù)據(jù)頁的任何地方eg:命令文件例如MEMORY(PAGE 0: VECS: origin = OOOOOh, length = 00040h 程序復(fù)位PVECS: origin = 00040h, length = 00070h /夕卜圍模塊中斷向量 PROG: origi
17、n 二 OOObOh, length = 07F50h /片上 FlashPAGE 1: BO: origin = 00200h, length = OOlOOh /DRAM BO 塊 Bl: origin = 00300h, length = OOlOOh /DRAM Bl 塊B2: origin = 00060h, length = 00020h /DRAM B2 塊SARAM: origin = 00800h, length = 00800h /SRAM 塊EXT : origin = 08000h, length = 08000h /外部存儲器SECTIONS.vectors : VE
18、CS PAGE 0.reset: VECS PAGE 0eg:MEMORY(PAGE 0:VECS :origin = OOOOOh, length = 00040hLOW :origin = 00040h, length = 03FC0hSARAM :origin = 04000h, length = 00800hBO :origin 二 OFFOOh, length = 001 OOhPAGE 1:BO :origin = 00200h, length = 001 OOhBl :origin = 00300h, length = 001 OOhB2 :origin = 00060h, le
19、ngth = 00020h.reset: VECS PAGE 0 復(fù)位中斷向量.vectors : VECS PAGE 0 中斷向量表.pvecs : PVECS PAGE 0 外圍模塊中斷向量表.text: PROG PAGE 0 /代碼.cinit: PROG PAGE 0.bss : SARAM PAGE 1 塊 B2.const: SARAM PAGE 1 塊 B2.stack : B1 PAGE 1 /堆棧,40個單元)DSP的CMD文件寫法綜述DSP的存儲器的地址范圍,CMD是主要是根據(jù)那個來編的。CMD它是用來分配rom和ram空間用的,告訴鏈接程序怎樣計(jì)算地址和分配 空間.所以
20、不同的芯片就有不同大小的rom和ram.放用戶程序的地方也不盡相同.所 以要根據(jù)芯片進(jìn)行修改.分兩局部.MEMORY和SECTIONS.PAGE 0PAGE 1SECTIONSSECTIONS(.vectors.reset是用來指定芯片的rom和ram的大小和劃分出幾個區(qū)間.PAGE 0 對應(yīng) rom;PAGE 1 對應(yīng) ramPAGE里包含的區(qū)間名字與其后面的參數(shù)反映了該區(qū)間的起始地址和長度.SECTIONS :(在程序里添加下面的段名如.vectors.用來指定該段名以下,另一 個段名以上的程序(屬于PAGE0或數(shù)據(jù)(屬于PAGE1放到“”符號后的空間名字所 在的地方。SECTIONS.v
21、ectors : VECS PAGE 0 /* Interrupt vector table */.reset: VECS PAGE 0 /* Reset code */eg:PAGE 0: VECS: origin = OOOOOh, length = 00040h LOW: origin = 00040h, length 二 03FC0h SARAM: origin = 04000h, length = 00800h BO: origin = OFFOOh, length = OOlOOhPAGE 1: BO: origin = 00200h, length = 001 OOh Bl: o
22、rigin = 00300h, length = 001 OOh B2: origin = 00060h, length = 00020h SARAM: origin = 08000h, length 二 00800h SECTIONS(,text: LOW PAGE 0.cinit: LOW PAGE 0.: LOW PAGE 0.const: SARAM PAGE 1.data : SARAM PAGE 1.bss : SARAM PAGE 1.stack : SARAM PAGE 1.sysmem : SARAM PAGE 1SARAM :origin = 08000h, length
23、= 00800h)(.text: LOW PAGE 0.cinit: LOW PAGE 0.switch : LOW PAGE 0.const : SARAM PAGE 1.data : SARAM PAGE 1.bss : SARAM PAGE 1.stack : SARAM PAGE 1.sysmem : SARAM PAGE 1)由三局部組成:輸入/輸出定義:這一局部,可以通過CCS的“Build Option.”菜單設(shè) 置:Qbj(鏈接的目標(biāo)文件、.lib(鏈接的庫文件、.m叩(生成的交叉索引文 件、.out(生成的可執(zhí)行代碼。MEMORY命令:描述系統(tǒng)實(shí)際的硬件資源SECTION命令
24、:描述“段”如何定位例子: d文件-co hello.outm hello.mapstack 100-1 rts2xx.libMEMORY (PAGE 0: VECT:origin=0 x8000,length 0 x040PAGE 0: PROG:origin=0 x8040,length 0 x6000PAGE 1: DATA:origin=0 x8000,length 0 x400)SECTIONS(.vextors VECT PAGE 0.text PROG PAGE 0.bss DATA PAGE 1.const DATA PAGE 1存儲模型:C程序的代碼和數(shù)據(jù)如何定位系統(tǒng)定義:.
25、cinit存放程序中的變量初值和常量,const存放程序中的字符常量、浮點(diǎn)常量和用const聲明的常量.switch存放程 序中switch語句的跳轉(zhuǎn)地址表.text存放程序代碼.bss為程序中的全局和靜態(tài)變量保存存儲空間.far為程序中用far聲明的全局和靜態(tài)變量保存空間.stack為程序系統(tǒng)堆棧保存存儲空間,用于保存返回地址、函數(shù)間的參數(shù)傳 遞、存儲局部變量和保存中間結(jié)果.sysmem用于程序中的malloc、calloc、和realoc函數(shù)動態(tài)分配存儲空間CMD的專業(yè)名稱叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡稱 為命令文件,其中比擬關(guān)鍵的就是MEMORY和SECTIONS兩個
26、偽指令的使用, 常常令人困惑,系統(tǒng)出現(xiàn)的問題也經(jīng)常與它們的不當(dāng)使用有關(guān)。CCS是DSP軟件 對DOS系統(tǒng)繼承的開發(fā)環(huán)境,CCS的命令文件經(jīng)過DOS命令文件長時間的引申 開展,已經(jīng)變得非常簡潔(不知道TI文檔有沒有詳細(xì)CMD配置說明)。我學(xué) CMD是從DOS里的東西開始的,所以也從DOS環(huán)境下的CMD說起:1、命令文件的組成命令文件的開頭局部是要鏈接的各個子目標(biāo)文件的名字,這樣鏈接器就可以根 據(jù)子目標(biāo)文件名,將相應(yīng)的目標(biāo)文件鏈接成一個文件;接下來就是鏈接器的操作指 令,這些指令用來配置鏈接器,接下來就是MEMORY和SECTIONS兩個偽指令 的相關(guān)語句,必須大寫。MEMORY ,用來配置目標(biāo)存
27、儲器,SECTIONS用來指定段的存放位置。結(jié)合下面的典型DOS環(huán)境的命令文件link d來做一下說明: file.obj 子目標(biāo)文件名1file2.obj子目標(biāo)文件名2flle3.obj 子目標(biāo)文件名3-0 prog.out 連接器操作指令,用來指定輸出文件-m prog.m 用來指定MAP文件MEMORY略SECTIONS略otherlink d本命令文件link d要調(diào)用的otherlink d等其他命令文件,那么文件的名字 要放到本命令文件最后一行,因?yàn)榉砰_頭的話,鏈接器是不會從被調(diào)用的其他命令 文件中返回到本命令文件。2、MEMORY偽才旨令MEMORY用來建立目標(biāo)存儲器的模型,SE
28、CTIONS指令就可以根據(jù)這個模型 來安排各個段的位置,MEMORY指令可以定義目標(biāo)系統(tǒng)的各種類型的存儲器及容 量。MEMORY的語法如下:MEMORYPAGE 0 :namel(attr : origin = constant,length 二 constantnameln(attr : origin = constant,length = constant PAGE 1 : name2(attr : origin 二 constant,length 二 constantname2n(attr : origin = constant,length = constant PAGE n : na
29、men(attr : origin = constant,length = constantnamenn(attr : origin = constant,length = constant PAGE關(guān)鍵詞對獨(dú)立的存儲空間進(jìn)行標(biāo)記,頁號n的最大值為255,實(shí)際應(yīng)用 中一般分為兩頁,PAGE0程序存儲器和PAGE1數(shù)據(jù)存儲器。name存儲區(qū)間的名 字,不超過8個字符,不同的PAGE上可以出現(xiàn)相同的名字(最好不用,免的搞 混),一個PAGE內(nèi)不許有相同的name。attr的屬性標(biāo)識,為R表示可讀;W可 寫X表示區(qū)間可以裝入可執(zhí)行代碼;I表示存儲器可以進(jìn)行初始話,什么屬性代碼 也不寫,表示存儲區(qū)間具
30、有上述的四種屬性,基本上我們都選擇這種寫法。origin: 略。length:略。下面是經(jīng)常用的2407的簡單寫法大家參考,程序從0 x060開始,要避開加密 位,不從0 x0044開始更可靠一點(diǎn),此例中的同名的頁可以只寫第一個,其后省 略,但寫上至少平安一點(diǎn):MEMORYPAGE 0: VECS: origin = 0 x0000, length 0 x40PAGE 0: PROG: origin = 0 x0060, length 0 x6000PAGE 1: B0 : origin = 0 x200, length 0 x100PAGE 1: Bl : origin = 0 x300,
31、length Ox 100PAGE 1: DATA: origin = 0 x0860, length 0 x0780)3、 SECTIONS 偽指令SECTIONS指令的語法如下:SECTIONS(.text: 所有.text輸入段名 load=加載地址run =運(yùn)行地址.data: 所有.data輸入 段名 load=加載地址run =運(yùn)行地址.bss: 所有.bss輸入段名 load=加載地址run =運(yùn)行地址.other: 所有.other輸入段名 load =加載地址run =運(yùn)行地址SECTIONS必須用大寫字母,其后的大括號里是輸出段的說明性語句,每一 個輸出段的說明都是從段名開始,段名之后是如何對輸入段進(jìn)行組織和給段分配存 儲器的參數(shù)說明:以.text段的屬性語句為例,”所有.text輸入段名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度木材砍伐承包合同示范文本(含林權(quán)流轉(zhuǎn))
- 2025年度外籍教師專業(yè)能力提升聘用合同范本
- 2025年個人與游戲公司勞務(wù)合同范文(2篇)
- 農(nóng)村房屋建設(shè)施工合同范本1
- 個人貨物運(yùn)輸合同
- 2025年u盤買賣合同(4篇)
- 鋼鐵廠脫硫除塵工程合同三篇
- 山東省聊城市莘縣市級名校2025屆中考猜題生物試卷含解析
- 2025屆陜西省寶雞市岐山縣重點(diǎn)名校中考生物全真模擬試卷含解析
- 二零二五年度網(wǎng)絡(luò)安全防護(hù)授權(quán)委托合同書3篇
- 【課件】寒假是用來超越的!課件 2024-2025學(xué)年高中上學(xué)期寒假學(xué)習(xí)和生活指導(dǎo)班會
- 2024-2025學(xué)年北師大版數(shù)學(xué)七年級上冊期末練習(xí)卷
- 2025年山東兗礦集團(tuán)公司招聘筆試參考題庫含答案解析
- 燃?xì)庥邢薰竟こ滩抗芾碇贫葏R編
- 2024年中國干粉涂料市場調(diào)查研究報(bào)告
- (自考)經(jīng)濟(jì)學(xué)原理中級(政經(jīng))課件 第二章 商品和貨幣
- ×××老舊小區(qū)改造工程施工組織設(shè)計(jì)(全面)
- GB/T 3324-2024木家具通用技術(shù)條件
- 《材料合成與制備技術(shù)》課程教學(xué)大綱(材料化學(xué)專業(yè))
- 小紅書食用農(nóng)產(chǎn)品承諾書示例
- 釘釘OA辦公系統(tǒng)操作流程培訓(xùn)
評論
0/150
提交評論