版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,DSP技术,04 TMS320C54x DSP软件开发,DSP技术,DSP汇编语言程序设计 DSP汇编程序开发工具 DSP高级C语言程序设计,DSP程序设计与开发,第一部分 DSP汇编语言程序设计,汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。一条语句占源程序的一行,汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,4.1.1 汇编语言源程序格式,源文件格式,助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。,标号: 助记符 操作数 ; 注释,助记符指令语法格式:,【例】 助记符指令源语句举例。 NANHU .set
2、1 ; 符号NANHU1 Begin: LD #NANHUA,AR1 ; 将1加载到AR1,标 号,助记符,操作数,注 释,4.1.2 汇编语言中的常数与字符串,汇编器可支持7种类型的常数(常量)。,4.2 堆栈的使用方法,1. 堆栈的设置,size .set 120 stack .usect “STACK”,size STM # stack + size,SP,在数据RAM空间开辟一个堆栈区。,在RAM中定义一个STACK 的保留空间,共120个单元,设置堆栈指针,# stack + sizeSP。,保留区的高地址赋给SP, 作为堆栈的栈底,若程序中要使用堆栈,必须先进行设置,如:,设置好堆
3、栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1SP,(PC)+2TOS,pmadPC RET ;(TOS)PC,(SP)+1SP,4.3 汇编器伪指令,将代码和数据汇编进指定的段; 在存储器中为未初始化的变量保留空间; 初始化存储器; 声明全局变量; 为汇编器指定从中可以获得宏的库。,汇编伪指令功能,1.定义段的伪指令 .bss 为未初始化的数据段保留空间(单位为字) .data 指定.data后面的代码为数据段 .sect 定义初始化的命名段 .text 指定.text后面的代码为文本段 .usect 为未初始化的命名段保留空间,2.初始化常数的伪指令 .bes 和.spa
4、ce在当前的段中保留指定的位数 .byte伪指令在当前段中放一个8位值进入连续的字; .field 将单个数放进当前字的指定位域 .float和.xfloat计算单个单精度浮点数,并将其存储在当前段的2个连续的字中; .int, .word 将一个或多个16位的值放进当前段的连续字中, .int 为无符号整型, .word 为带符号整型。 .long , .xlong 把32位数存放到当前段连续的两个字中。 .string,.pstring把8位的字符从一个或多个字符串中传送到当前段中。,3. 输出列表格式伪指令 .title 为汇编器提供一个打印在每一页顶部的标题。 .list/nolist
5、 重新启动/停止源程序清单。 4.引用其他文件的伪指令 .copy/.include 从其他文件包括源语句; .def 识别定义在当前和用在其他模块中的一个或多个符号; .global 定义一个或多个全局符号 .mlib 定义宏库 .ref 识别用在当前模块但定义在其他模块中的一个或多个符号。,5. 控制条件汇编的伪指令 .if/.elseif/.else/.endif 条件汇编 .loop/.break/.endloop 循环汇编 6. 其他伪指令 .equ/.set 使一个符号等于一个值 .end 结束程序 有关伪指令更详细的内容见 TMS320C54x Assembly Language
6、 Tools Users Guide. Texas Instruments Inc, June 2001,宏语言,宏: 用户定义的能被用作指令的程序。,汇编器支持宏语言,使用户可以建立自己的“指令”。当程序要将特定的任务执行若干次时,尤其有用。,宏的使用,DAT0 .set 60h DAT1 .set 61h DAT2 .set 62h DAT3 .set 63h .text ADD3 .macro X1, X2, X3, X_SUM LD X1,A ADD X2,A ADD X3,A STL A, X_SUM .endm, ST #0020h, DAT0 ST #0030h, DAT1 ST
7、 #1140h, DAT2 ADD3 DAT0, DAT1, DAT2, DAT3 NOP .end,【例】计算 y =,程序: * * example.asm * * .title “example.asm” .mmregs STACK .usect “STACK”,10h .bss a,4 .bss x,4 .bss y,1 .def start .data,;为堆栈指定空间 ;为变量分配9个字的空间,table: .word 1,2,3,4 .word 8,6,4,2 .text start: STM #0,SWWSR STM #STACK+10h,SP STM #a,AR1 RPT #
8、7 MVPD table,*AR1+ CALL SUM end: B end,; 变量初始化 ; 插入0个等待状态 ; 设置堆栈指针 ; AR1指向a ; 移动8个数据 ; 程序存储器到数据存储器 ; 调用SUM子程序,续上表,SUM: STM #a, AR3 STM #x, AR4 RPTZ A, #3 MAC *AR3+,*AR4+,A STL A, y RET .end,;子程序执行,续上表,第二部分 DSP汇编程序开发工具,TMS320C54x提供2种编程语言:汇编语言和C/C+语言。对于完成一般性功能的代码,这2种语言都可以使用,但对于一些运算量很大的关键代码,最好采用手工编写的汇编
9、语言来完成。 TMS320C54x 提供有2种开发环境:非集成的开发环境和集成开发环境Code Composer Studio,简称CCS。CCS在WINDOWS操作环境下运行,集成了非集成开发环境的所有功能,并扩展了许多其他功能。,汇编语言程序的编辑、汇编和链接过程,示意图,4.4 COFF的一般概念,汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。,在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。 这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理
10、各种各样的段。,4.4.1 COFF文件的基本单元,1. 段(sections),段是COFF文件中最重要的概念。每个目标文件都分成若干段。 所谓段,是指存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,COFF目标文件都包含以下3种形式的段: .text 段(文本段),通常包含可执行代码; .data 段(数据段),通常包含初始化数据; .bss 段(保留空间段),通常为未初始化变量保留存储空间。,2. 段的基本类型,COFF目标文件中的段有两种基本类型。, 初始化段 未初始化段,(1) 初始化段,初始化段中包含有数据或程序代码。主要有: .text段已初始
11、化程序段; .data段已初始化数据段; .sect段已初始化段,由汇编器伪指令建立的自定义段。,(2) 未初始化段,在存储空间中,为未初始化数据保留存储空间。 它包括: .bss段未初始化段; .usect段未初始化段,由汇编命令建立的命名段(自定义段)。,3. 段与目标存储器的对应关系,汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。 链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的不同存储器中,这一过程称为定位或分配。,目标文件中的段与目标存储器之间的关系,.bss,.data,.text,RAM,E2PROM,ROM,
12、4.4.2 汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个段:, .bss .usect .text .data .sect,定义未初始化段 定义未初始化段 定义已初始化段 定义已初始化段 定义已初始化段,经汇编后,得列表文件(部分):,2 * 3 * 汇编一个初始化表到.data段 * 4 * 5 0000 .data 6 0000 0044 coeff .word 044h,055h,066h 0001 0055 0002 0066 7 * 8 * 在.bss段中为变量保留空间 * 9 * 10 0
13、000 .bss buffer,8 11 * 12 * 仍然在.data 段中 * 13 * 14 0003 0456 prt .word 0456h,5 0000 .data,6 0000 0044 coeff .word 044h,055h,066h,10 0000 .bss buffer,8,14 0003 0456 prt .word 0456h,.data,6,0044,6,0055,6,0066,10,.bss,没有数据 保留8个字,14,0456,15 * 16 * 汇编代码到.text段 * 17 * 18 0000 .text 19 0000 100d add: LD 0Dh
14、,A 20 0001 f010 aloop: SUB #1, A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22 * 23 * 汇编另一个初始化表到.data 段 * 24 * 25 0004 .data 26 0004 00cc ivals .word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee 27 * 28 * 为更多的变量定义另一个段 * 29 * 30 0000 var2 .usect “newvars”,2 31 0001 inbuf .usect “newvars”,8,.text,18 0000 .t
15、ext,19 0000 100d add: LD 0Dh,A,19,100d,20 0001 f010 aloop: SUB #1, A,20,f010,20,0001,21 0003 f842 BC aloop,AGEQ,21,f842,21,0001,25 0004 .data,26 0004 00cc ivals .word 0CCh,0DDh,0EEh,.data,26,00cc,26,00dd,26,00ee,30 0000 var2 .usect “newvars”,2,newvars,30,保留2个字,31 0001 inbuf .usect “newvars”,8,31,保留8
16、个字,32 * 33 * 汇编更多代码到.text段 * 34 * 35 0005 .text 36 0005 110a mpy: LD 0Ah,B 37 0006 f166 mloop MPY #0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39 * 40 * 为中断向量.vectors定义一个自定义段 * 41 * 42 0000 .sect “vectors” 43 0000 0044 .word 044h,088h 0001 0088,35 0005 .text,.text,36 0005 110a mpy: LD 0Ah,B
17、,36,110a,37 0006 f166 mloop MPY #0Ah,B,37,f166,37,000a,38 0008 f868 BC mloop,BNOV,38,f868,38,0006,42 0000 .sect “vectors”,vectors,43 0000 0044 .word 044h,088h,43,0044,43,0088,链接器主要完成以下功能: 将程序中的各段按目标系统存储器配置表(.cmd)进行分配; 给符号和段安排最终地址,完成重定位操作; 在输入文件之间辨认没有定义的外部符号引用。 链接器的使用 lnk500 -option filenamefilename
18、例: lnk500 file1.obj file2.obj o link.out,TMS320C54x链接器把由汇编器产生的COFF目标文件作为输入,结合链接器命令文件(*.cmd),输出可执行文件。,链接器命令文件,目标系统存储器配置和链接使用伪指令MEMORY和SECTIONS描述。 MEMORY : 定义目标系统存储器配置 SECTIONS : 控制段的构成与存储器分配,链接器命令文件含有链接时所需的信息。这些信息包括输入文件名、链接时的参数选项、目标系统存储器配置和链接信息、全局符号定义等。,C54x用户自己设计的系统及存储器配置各不相同。MEMORY伪指令可使你充分描述各个用户系统的
19、实际存储器配置,然后用SECTIONS伪指令去指定各个段与存储器配置的分配关系。 MEMORY伪指令语法格式如下: MEMORY PAGE0: name1(attr):origin=constant, length=constant;fill=constant; . . . PAGEn: namen(attr):origin=constant, length=constant;fill=constant; ,如果没有使用MEMORY和SECTIONS定义存储器空间模型和配置,链接器对C54x使用缺省的存储器模型和段分配方法。,MEMORY /*MEMORY伪指令*/ PAGE0:PROG:or
20、igin=0 x0080 length=0 xFF00 PAGE1:DATA:origin=0 x0080 length=0 xFF80 SECTIONS /*SECTIONS伪指令*/ .text: PAGE=0 .data: PAGE=0 .cinit: PAGE=0 .bss: PAGE=1 ,有关链接命令文件更详细的内容见 1、TMS320C54x Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001 或参考 2、TMS320C54x DSP应用程序设计与开发. 刘益成,北京航空航天大学出版社,200
21、2,链接命令文件的编写,/*链接命令文件*/ /*example.cmd*/ /*/ a.obj b.obj c.obj /*输入文件名*/ -o prog.out /*输出out文件*/ -m prog.map MEMORY /*MEMORY伪指令*/ RAM:origin=0100h length=0100h ROM:origin=0100h length=0100h SECTIONS /*SECTIONS伪指令*/ .text:ROM .data:RAM .bss:RAM ,档案管理器(Archiver),档案管理器允许用户将一组文件归入一个单一文件中,这个单一文件就叫库或归档文件。 档
22、案管理器的使用格式: ar500 -command option libname filename1filenamen command 告诉档案管理器如何处理库 option 告诉档案管理器如何运行 libname 归档库名,默认扩展名(.lib) filename 独立文件名(.obj) 例:创建一个名为function.lib的库,它包括文件sine.obj、cos.obj、flt.obj,命令为: Ar500 a function sine cos flt,绝对列表器,绝对列表器是一个调试工具。它将链接后的目标文件作为输入文件,创建扩展名为.abs的文件作为输出。.abs文件显示目标代码
23、绝对地址的列表。 启动绝对列表器的命令: abs500 -option input-file 具体用法可参考 TMS320C54x Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001,交叉引用列表器,交叉引用列表器也是一种调试工具。链接后的可执行文件作为交叉引用列表器的输入文件,其输出文件为交叉引用列表文件(.xrf)。此列表文件列出可执行文件中符号、符号的定义及它们的引用情况。 启动交叉引用列表器的命令: xref500 -option input file output filename 具体用法可参考
24、 TMS320C54x Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001,十六进制转换公用程序,C54x汇编器、链接器产生COFF可执行文件。COFF文件是TI公司的二进制格式文件,便于模块化编程和提供灵活、方便的代码管理及存储空间管理。但是,大多数EPROM编程器不接收COFF格式文件,因此TI公司提供了一个将COFF文件格式转化为Intel、Tektronix、Motorola-S、ASCII-hex等文件格式的公用程序。 启动十六进制转换程序的命令: hex500 -option filename,
25、第三部分,DSP高级C语言程序设计,TMS320C54x C/C+编译器支持ANSI(American National Standards Institute)开发的C/C+语言标准。,C语言开发的优点,1)便于阅读,维护,交流; 2)编程更为容易,不是特别精通汇编语言的开发人员也可以编写; 3)便于分工合作完成子模块的编写,以及由子模块到大系统的搭建 ; 4)便于移植到C55、C2000、C6000等DSP系统中;,TMS320C54x C编译器支持的关键词,1、const、 volatile 关键词 用来控制数据对象的存储分配,const定义的常数被分配在ROM中,关键词volatile
26、定义的数据分配在RAM中。 例如定义ROM表 const int digits =0,1,2,3,4,5,6,7,8,9 例如定义RAM中的一个指向无符号整型的指针 volatile unsigned int *ctrl,2、ioport 关键词 用来访问TMS320C54x器件的I/O端口空间 格式: ioport type porthex_num ioport 指示这是一个端口变量的关键词。 type(类型) 必须是char(字符)、short(短整数)、int(整数)或无符号的变量。 porthex_num 指端口编号。hex_num变量为十六进制数。,例:声明I/O端口为无符号端口10
27、h,将a写到端口10h,然后将端口10h读进b:,ioport unsigned port10; /*访问I/O端口10h的变量*/ int func() port10=a; /*将a写到端口10h*/ b=port10; /*将端口10h读进b*/ ,端口变量的使用对赋值没有限制。端口变量可像其他变量一样用在表达式中。 a=port10+b; /*读端口10h,加上b,结果赋给a*/ prot10+=a; /*读端口10h,加上a,结果写到端口10h*/,3、interrupt 关键词 用来指定将函数作为中断函数处理。当C代码被中断时,中断程序必须保存所有寄存器的内容。 中断函数的主体可具有
28、局部变量并可自由使用堆栈。 interrupt void int_handler() unsigned int flags; C_int00 是C/C+的进入点,为系统复位中断保留,该中断程序初始化系统并调用函数main。,interrupt double compute_area (double radius) double area = PI * radius * radius;printf(nArea = %f, area);return area;,ISR 不能返回一个值。 ISR 不能传递参数。 C编译器不允许在ISR中做浮点运算。,下面是一个错误的程序:,面向DSP的C程序设计准则
29、,面向DSP的C程序设计基本原则:C程序不但需要对数据流进行编程,也要对时序机制进行编程。,通用PC的C程序 大量数据集中式处理 数据流处理 非实时 直观的输入、输出设备,运行结果无需借助其他设备 数据来源可由软件仿真产生,或通过计算机接口从外部获取,数据可集中处理。,面向DSP的C程序 极少数据的实时处理 数据流、时序处理 实时性 输入/输出为映射在存储空间的数据,结果显示需借助示波器、逻辑分析仪等设备 数据从A/D获得,由于DSP存储容量的限制,数据需实时处理。,实例,#include #include hello.h #define BUFSIZE 30 struct PARMS str
30、 = 2934, 9432, 213, 9432, ,/* * = main = */ void main() #ifdef FILEIO int i; char scanStrBUFSIZE; char fileStrBUFSIZE; size_t readSize; FILE *fptr; #endif /* write a string to stdout */ puts(hello world!n);,续上表,#ifdef FILEIO /* clear char arrays */ for (i = 0; i BUFSIZE; i+) scanStri = 0 /* delibera
31、te syntax error */ fileStri = 0; /* read a string from stdin */ scanf(%s, scanStr); /* open a file on the host and write char array */ fptr = fopen(file.txt, w); fprintf(fptr, %s, scanStr); fclose(fptr);,续上,/* open a file on the host and read char array */ fptr = fopen(file.txt, r); fseek(fptr, 0L,
32、SEEK_SET); readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr); printf(Read a %d byte char array: %s n, readSize, fileStr); fclose(fptr); #endif ,CCS下的运行结果,汇编语言与C/C+混合编程,C语言开发DSP程序可读性和可移置性强,同时使用C编译器的优化功能可以增强编程的效率。而汇编程序比较精练,运行效率高。为了提高程序的开发效率,通常用到汇编语言与C/C+混合编程的方法。特别是用C程序不能深入底层访问硬件寄存器时,可以调用汇编语句来完成一些
33、硬件访问。,独立的DSP C语言和汇编接口 在DSP C程序中访问汇编变量和常量 在DSP C程序中直接嵌套汇编语句 利用DSP C编译器的内联(intrinsics)函数访问汇编语句,独立的DSP C语言和汇编接口,在DSP C和汇编程序相互访问过程中,为了在访问之后返回时程序不出错,需要保护一些特定的寄存器。因此,要求DSP C与汇编程序接口时必须遵循一定的寄存器规则。 这些规则包括有:,(1)必须保护正在运行的函数所用到的几个特定的寄存器,例如AR1、AR6、AR7及SP PUSH(AR7) /*将AR7压入堆栈*/ CALL _c_int3 /*调用C函数*/ AR7=POP() /*
34、将AR7弹出堆栈*/ (2)在中断服务子程序执行前,必须保存所有正在使用的寄存器。 PUSH(PMST) /*将PMST压入堆栈*/ CALL ISR /*调用中断服务程序*/ PMST=POP() /*将PMST弹出堆栈*/,(3)函数有值返回时,返回值在累加器A中。 (4)所有在DSP C中定义的变量、数组等表示符,在汇编程序引用时,都要在表示符的前面加上下划线”_”. (5)在汇编程序和C程序中同时使用的变量或函数,要在汇编程序和C程序中同时说明为外部的,这样链接器才能识别。,C程序(mixc11.c) extern int asmfunction(); /*说明外部的asm函数*/ e
35、xtern int gvar; /*说明外部变量*/ int result; main() int i=200; i=asmfunction(); /*调用汇编函数*/ result=gvar*5+10; ,汇编程序(mixasm11.asm) .global _gvar ;说明外部变量 .global _asmfunction .data ;为汇编变量分配地址 _gvar .word 100 ;定义变量 .text _asmfunction: LD #0,A ; A=0 ADD *(_gvar),A ;(gvar)+A =A STL A, *(_gvar) ;A =(gvar) RET .e
36、nd,C程序调用汇编程序,DSP C程序中访问汇编变量和常数,有时要在C程序中访问汇编程序定义的变量和常数,汇编程序中变量和常量的定义有以下三种方法: 在.bss段中定义的变量 不在.bss段中定义的变量 定义的常量,(1)直接在.bss段或.usect段中定义的未初始化变量 第一步:使用.bss或.usect段定义变量 第二步:使用.global伪指令定义为外部变量 第三步:在汇编程序中将下划线“_”放在变量名之前 第四步:在C中将变量说明为外部变量,1.访问汇编程序定义的变量,C程序(mixc21.c) extern int asmfunction(); /*说明外部的asm函数*/ ex
37、tern int var; /*说明外部变量*/ int result; main( ) int i=1000; var=1000; /*说明外部变量*/ i=asmfunction(); /*调用汇编函数*/ result=var*2+100; wait: goto wait; ,汇编程序(mixasm21.asm) .bss _var,10 ;为变量var留出10个字的空间 .global _var ;说明外部变量 .global _asmfunction .text _asmfunction: LD #1000,A; A=1000 ADD *(_var),A ;(var)+A =A ST
38、L A, *(_var) ;A =(var) RET .end,(2)不在.bss段中定义变量 汇编变量可以在.bss中定义,也可以不在.bss中定义。,C程序(mixc22.c) extern int data ; /*这是一个对象*/ int *data_p=data; /*说明指针指向它*/ int num; main( ) num=data_p3; /*指针指向数组的第4个元素*/ wait: goto wait; ,汇编程序(mixasm22.asm) .global _data ;说明外部变量 .sect “.data:data _tab” ;在.data段产生一个名为”data_
39、tab“的数据段 _data: .word 10 .word 20 .word 30 .word 40 .word 50,C程序(mixc23.c) extern int table_size;/*说明为外部的*/ int a10,b10; main( ) int i; for(i=0;i table_size;i+) /*引用常量*/ ai=0; bi=0; for(i=0;i table_size;i+) /*引用常量*/ ai=i*10+10; bi=ai; wait: goto wait; ,2.访问汇编程序常数 DSP C程序访问在汇编程序中定义的常数有两种方法,其一是利用.set和
40、.global伪指令定义汇编程序外部常量;其二是利用连接器分配语句在链接命令文件中定义他们。,汇编程序(mixasm23.asm) _table_size .set 10 ;定义常量 .global _table_size ;定义为全局,链接命令文件(mix23.cmd) _table_size=10; /*定义常量*/ . . .,或:,3.在汇编程序中访问DSP C程序变量和常量,C程序(mixc25.c) extern int asmfunction(); /*说明外部的asm函数*/ extern int gvar; /*定义变量*/ main( ) int i=0; gvar=100; i=asmfunction(); /*调用汇编函数*/ ,汇编程序(mixasm25.asm) .global _asmfunction .global _gvar ;说明外部变量 .text _asmfunction: LD #1000,A ADD *(_gv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年电子产品制版工专项题库(附答案与解释)
- 2026年河大版(新教材)初中信息技术七年级全一册《记录我们的低碳生活》教案
- 卫生专业技术资格考试核医学技术(中级377)专业知识巩固重点详解(2026年)
- 情绪任务在情感障碍中的近红外脑功能成像研究进展
- 2026年保温材料制造工专项题库(附答案与解释)
- (正式版)DB45∕T 2860-2024 《木薯啤酒渣和甘蔗尾叶混合微贮与使用技术规程》
- 隧道爆破设计作业方案
- 体育舞蹈理论试题
- 数据标注兼职居间服务协议2026版
- 失败容忍条款2026年数据标注兼职合同范本
- 电商代运营服务合同模板2026三篇
- 2025天津泰达产业发展集团所属企业员工岗位社会化公开招聘笔试历年参考题库附带答案详解
- 2026年四川省成都市天府新区数学八上期末学业质量监测模拟试题含解析
- 2026年中国邮政集团有限公司吉林省分公司纪检干部社会招聘1人笔试历年典型考点题库附带答案详解
- 昆山啤酒节策划方案
- 国家卫生健康委员会中国结直肠癌诊疗规范(2025版)
- (2026年)围手术期血压管理课件
- 国企工程管理岗笔试试题及答案
- 诊所医学检验科工作制度
- 心房颤动诊断和治疗中国指南
- 2025年香港苏浙公学笔试面试及答案
评论
0/150
提交评论