




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020年2月22日DSP原理及应用1 第6章 TMS320C54xC语言程序设计 内容提要 C54x的程序设计语言可以选择:汇编语言和C语言。 汇编语言的优点:程序执行效率高,硬件定时准确; 缺点:程序不够直观,可移植性和可维护性差 C语言特点:可移植性和可维护性好 程序设计是应用软件设计的基础,主要任务是利用C指令 和伪指令编写源程序以完成指定的功能。 本章重点介绍DSP的C语言程序设计的特点、DSP C语 言编程的设计技巧、C与汇编的混合编程实现等 2020年2月22日DSP原理及应用2 第6章 TMS320C54xC 语言程序设计 6.1 C54x C 语言介绍 6.2 C54x C
2、语言编程 6.3 C54x C 代码优化 2020年2月22日DSP原理及应用3 第6章 TMS320C54xC语言程序设计 6.1 C54x C语言介绍 C54x C编译器支持美国国家标准委员会 (American Nation Standards Institute ,ANSI)开发 的C语言标准。 2020年2月22日DSP原理及应用4 第6章 TMS320C54xC 语言程序设计 概括地讲,C54x C继承了ANSI C的大部分基本特征,只要与硬 件不是特别相关的部分都是它们的相同点。 C54x C 继承了ANSI C结构化程序设计的基本思想,以函数作 为基本单位,函数的定义和引用方式
3、完全一致,大部分变量、常量 、数组、结构体、枚举、联合体、指针的定义语法结构也完全一致 ,局部变量、全局变量、静态变量、动态变量等基本定义也一致, 宏定义、宏展开、宏调用的思想语法规则基本一致。 6.1.1 C54x C与ANSI C的相同点 2020年2月22日DSP原理及应用5 第6章 TMS320C54xC 语言程序设计 1. 常量定义 6.1.1 C54x C 与ANSI C的相同点 格式:const 类型 符号=数值; 例6-1 const short d1=8 ; C54xC也可以用下面的方法定义符号常量 #define d1 8 ;/程序中出现d1时均会以8来代替 2020年2月
4、22日DSP原理及应用6 第6章 TMS320C54xC语言程序设计 2. 变量定义 1 )一般变量的定义 格式:类型 符号; 例6-2 charch_1 ;/定义了一个字符变量,名字为 ch_1 shortsh_1;/ 定义了一个短整型变量,名字为 sh_1 long1_dat1;/ 定义了一个长整型变量 1_dat1 int*pi_1;/ 定义了一个指向整型数据的指针变量, 名字为pi_1 Shortsh_a10;/ 定义了一个短整型数组,数组的长 度为10 2020年2月22日DSP原理及应用7 第6章 TMS320C54xC语言程序设计 2)扩展变量的定义 structstr_t/ 定
5、义一个结构类型 str_t short sh_a; longl_b; floatf_c; structstr_tstr_a;/ 定义一个str_t型结构变量str_a 2020年2月22日DSP原理及应用8 第6章 TMS320C54xC语言程序设计 3)自定义变量的定义 格式:typedef 已有类型 新数据类型 例6-3 typedef unsigned shortUS_DATA; US_DATAush_t; 等同于: unsigned shortush_t; 或者:#define US_DATAunsigned short; 2020年2月22日DSP原理及应用9 第6章 TMS320C
6、54xC 语言程序设计 3.函数的定义和组织 C54x C和ANSI C一样,整个程序有一个主函数 (main函数)和零个或者多个子函数构成,如下所示: float sub_cac(float a, float b);/ 子函数声明 void main()/ 主函数定义,整个程序内有且只有一个 float a=1; float b=2; float c; c=sub_cac(a,b);/ 子函数调用 while(1) / 死循环,等待外部事件发生 2020年2月22日DSP原理及应用10 第6章 TMS320C54xC 语言程序设计 float sub_cac(float e,float f)
7、/ 子函数定义 float g; g=e*f; return g; 除此之外,C54x C的算术运算符、关系运算符、逻辑运算符、 位操作运算符,包括运算符之间的优先级和综合性等也都和 ANSI C 一样,函数语句的组织也分成顺序结构、分支结构、 循环结构等。 2020年2月22日DSP原理及应用11 第6章 TMS320C54xC语言程序设计 6.1.2 C54x C 与ANSI C 的不同点 C54x C与ANSI C的不同点总的来说有以下几个方面: 1. 所处理数据的性质不同 面向PC机的ANSI C所处理的数据是一些采集好 的、数据量较多的、以数据块为单位的数据。对这 些数据的处理实时性
8、要求并不是很高。 C54x C 的编程对象C54x DSP工作于实时性处 理场合,对于处理时间有比较严格的实时性要求。 2020年2月22日DSP原理及应用12 第6章 TMS320C54xC语言程序设计 2.数据出输入输出设备不同 C54x C处理的数据来自于实时采集数据,数据 处理的结果通过通信口传递给其他计算机或者芯片 (如MCU、ARM等)使用,或者通过 D/A输出。 面向PC机的ANSI C所处理的数据来自硬盘、内存等 存储介质,或者是键盘的输入。其输出是显示器、通信口 或者实时输出。对人机界面提出了较高的要求。 2020年2月22日DSP原理及应用13 第6章 TMS320C54x
9、C语言程序设计 3.“ 死循环”的对待上不同 面向PC机的ANSI C程序,最怕的事情就是程序 内部出现“死循环”。 C54x C在系统初始化之后安排“死循环”,在“死 循环”内等待各种中断事件(如外部中断事件、定时器 中断事件、通信口的中断事件等)的发生。 2020年2月22日DSP原理及应用14 第6章 TMS320C54xC 语言程序设计 4.语法及数据结构细节上的不同 (1)C54x的C语言数据类型及其表示范围 由于C54x是一种16位定点DSP,所处理的数据一般都 是以字(word ,16bit )为单位,而对于小于 16位的数据 的运算,需要配合逻辑和以为运算来完成。 C54x编译
10、器将16位数据定义成最短的数据表示类型, 如signed char, char, unsigned char, short, signed short, int, signed int, enum, unsigned int,* 指针 都是16位数据,与ANSI C有较大区别。 2020年2月22日DSP原理及应用15 第6章 TMS320C54xC语言程序设计 对于16位表示范围不够的数据, C54x 编译器安排 了32位的数据类型,32位的数据包括long, signed long, float, double, long double 。这也是表示范围最 大的一种数据类型。与 ANSI
11、C有较大区别。 2020年2月22日DSP原理及应用16 第6章 TMS320C54xC 语言程序设计 (2)C54x 的C语言特有数据类型 C54x的C语言除了从ANSI C继承了一些既有数据类型,在表示 方法上作了少许调整。为了便于C语言直接对DSP硬件进行操作, C54x的C语言还扩展了一些专用或者说是特有的数据类型。 1)地址变量 在DSP的C语言程序中,经常需要对某一个存储单元进行访问, 这个存储单元可能是普通的数据存储器单元,也可能是存储器映像 寄存器。对于他们的访问必须明确指出其地址,为此C54x的C语言 编译器设置一种地址变量来实现对这些指定数据存储单元的访问。 2020年2月
12、22日DSP原理及应用17 第6章 TMS320C54xC语言程序设计 1)地址变量 所谓的地址变量实际上就是指定了具体地址的指针变 量。 为了防止编译器将其优化掉( C54x 编译器在对程 序进行优化时,会将定义了但从来没有使用的变量 优化掉,以便节省存储空间),往往需要用 volatile 关键字进行说明,如: volatile short *mcbsp0_drr10=0 x10; short sh_drr10_data; sh_drr10_data=*mcbsp0_drr10 2020年2月22日DSP原理及应用18 第6章 TMS320C54xC 语言程序设计 2)I/O端口变量 C5
13、4x的存储空间有三个:程序存储空间、数据存储空 间和I/O空间。为了实现C访问DSP的I/O空间,C54x C 语言规定了一种I/O端口变量,对这些端口变量的访问就 是对I/O空间的访问。I/O端口变量的定义格式如下: ioport 数据类型 porthex_num; 其中, ioport :端口变量定义关键字;数据类型: 只能是char, short, int, unsigned等16位类型; hex_num: 该I/O端口的16进制表示的端口地址。 2020年2月22日DSP原理及应用19 第6章 TMS320C54xC语言程序设计 2)I/O端口变量 例如: ioport short p
14、ort100;/定义了一个端口变量 ,端口地址是100h 端口变量定义好后,对这些变量的访问在形式上和普 通的变量没有太大区别,如: short sh_1,sh_2;/ 定义了两个短整型变量 sh_1=port100;/ 端口读操作 port100=sh_2;/ 端口写操作 2020年2月22日DSP原理及应用20 第6章 TMS320C54xC语言程序设计 I/O变量可以和其他变量一样参加任何的表达式运算 例如: short s1,s2; s1=0 x55; s2=port100+s1; /从100端口读数据,将所读到的数据和s1加在一起,结 果送s2 2020年2月22日DSP原理及应用2
15、1 第6章 TMS320C54xC语言程序设计 需要注意的是:一般情况下 I/O变量的读写速度 有快有慢,快的和 CPU的处理速度差不多,慢的和 CPU 的处理速度差距非常大。对于读写速度慢的 I/O变量 的读写,需要在程序中通过调用不同的延时程序实现延时 。 2020年2月22日DSP原理及应用22 第6章 TMS320C54xC语言程序设计 DSP的C语言扩展了寄存器变量。在一个 C函数内部最 多可以使用两个寄存器变量,编译器在编译这两个寄存器 变量时用AR6和AR7这两个辅助寄存器分别做了对应: 3)寄存器变量 AR6被赋给第一个寄存器变量 AR7被赋给了第二个寄存器变量 寄存器变量的定
16、义格式: register type AR6 或 register type AR7 2020年2月22日DSP原理及应用23 第6章 TMS320C54xC语言程序设计 1)变量的初值问题 (3)DSP C语言关于变量的特殊规定 ANSI C语言规定:没有显式初始化的变量都将初始化 为0 DSP的C语言规定:没有显式初始化的变量仍保持未 初始化状态 2020年2月22日DSP原理及应用24 第6章 TMS320C54xC语言程序设计 例如: int sum; int a8 =1,2,3,4,5,6,7,8; for(i=0;i16;/16 位*16位结 果应用32位表示 result3=(u
17、nsigned long)m3*m4)16; 2020年2月22日DSP原理及应用30 第6章 TMS320C54xC语言程序设计 这里的m1*m2的中间结果作了强制 long转换,是为了 防止有效数据位的丢失。 2020年2月22日DSP原理及应用31 第6章 TMS320C54xC 语言程序设计 6.2.1 C54xC语言开发的存储器结构 1.C54x C语言开发的段结构 C编译器对C语言源程序进行编译后产生汇编程序, 汇编程序再经过汇编将成为 COFF格式的目标文件,该文件 将包含七个可以进行重新定位的代码和数据段,他们是: 6.2 C54x C语言编程 2020年2月22日DSP原理及
18、应用32 第6章 TMS320C54xC 语言程序设计 已初始化段: (1).text段,包含了可执行代码。 (2).cinit段,包含明显初始化的全局变量和静态变量。 (3).const段,包含字符串常数和全局变量。 (4).switch段,包含大型switch语句的跳转表 未初始化段 (1).bss段,包含了未初始化的全局变量和静态变量 (2).stack段,定义软件堆栈 (3).system段,为动态存储器函数malloc,calloc,realloc(这些 函数由运行支持库提供)分配存储器空间 2020年2月22日DSP原理及应用33 第6章 TMS320C54xC语言程序设计 (1)
19、 已初始化段 1).cinit段 DSP的C语言全局变量和静态变量,其存储单元定义 在段.bss中,需要显式初始化的值存放在段 .cinit中。在 DSP上电时,系统初始化函数( bootloader)会自动调用 段.cinit的值来初始化段.bss。对于没有显式定义初始化 值的,则保持未初始化状态。 2020年2月22日DSP原理及应用34 第6章 TMS320C54xC语言程序设计 例如:假设在C程序中定义了两个初始化变量: int a=45; int b5=2,3,4,5,6; 则这两个变量的初始化信息如下: .sect “ .cinit” ; 初始化段 * 变量a的记录* .word
20、1 ; 数据长度为1 .word _a;.bss中的地址 .word 45;数据 2020年2月22日DSP原理及应用35 第6章 TMS320C54xC 语言程序设计 *变量b的记录* .word 5;数据长度为1 .word _b;.bss中的地址 .word 2,3,4,5,6;数据 2).switch 段 当C语言程序中有分支语句switch时,如: int i; int function( ) switch(i) case 1; return 1; 2020年2月22日DSP原理及应用36 第6章 TMS320C54xC 语言程序设计 break; default; return 0
21、; break; C语言程序经过编译将产生 .switch 段,该段记录 了开关变量和相应开关值,以及需要执行的程序起始 位置的对应关系。 2020年2月22日DSP原理及应用37 第6章 TMS320C54xC 语言程序设计 (2)未初始化段 1 ).stack段 .stack段定义了软件堆栈,该堆栈用于函数调用、变 量传递以及局部变量分配。软件堆栈的大小由连接器选项 -stack 后面的数值规定(如 -stack 40 规定了栈的大小为 40字),如果没有规定,则默认大小为 400h即1K。 注意:C编译器并不提供检查堆栈溢出的手段,因此,必须 保证有足够的空间由于堆栈,否则,发生溢出现象
22、将破坏程 序的运行环境,从而导致程序的瘫痪。 2020年2月22日DSP原理及应用38 第6章 TMS320C54xC 语言程序设计 2 ) . system段 . system 段为动态存储器函数malloc,calloc, realloc( 这些函数由运行支持库提供 )分配存储器空间。若 C程序没有使用这些函数,编译器就不创建 .system 段。 (3)自定义段 除了C编译器所产生的标准段: .text, .cinit, .const, .switch, .bss, .stack, .system段外,用户还可以利用 progma 伪指令来产生其他的自定义段。 2020年2月22日DSP
23、原理及应用39 第6章 TMS320C54xC语言程序设计 CODE_SECTION pragma 如果用户想将程序中的代码(如函数)编译成不同 于.text段的其他段,并链接到不同于 .text段的独立区 域,就可以使用CODE_SECTION pragma伪指令。其 语法结构为: # pragma CODE_SECTION (symbol ,“section name”) 这里 ,section name代表了要产生的段名,而 symbol 代表了要汇编到该段的符号(如函数名)。 2020年2月22日DSP原理及应用40 第6章 TMS320C54xC语言程序设计 DATA_SECTION
24、 pragma 如果用户想将程序中的部分数据编译成不同于 .bss段 的其他段,并链接到不同于 .bss段的独立区域,就可以使 用DATA_SECTION pragma伪指令。其语法结构为 : # pragma DATA_SECTION (symbol,“section name”) 这里 ,section name代表了要产生的段名,而 symbol 代表了要汇编到该段的符号(如变量名)。 2020年2月22日DSP原理及应用41 第6章 TMS320C54xC语言程序设计 2. C54x C 语言开发的存储器结构 (1)段的存储器定位 DSP的C语言程序经过编译器编译后生成一些段,如 已初
25、始化的.text ,.cinit, .const, switch段和未初始化的 .bss, .stack, .system段,还有一些自定义段,这些段在 链接时必须指定相应的存储位置。 2020年2月22日DSP原理及应用42 第6章 TMS320C54xC语言程序设计 C54x的段存储器分配 段名及段的类型存储器类型Page类型 已初始化段 .cinitROM or RAM0 .const ROM or RAM1 .switchROM or RAM0 .textROM or RAM0 未初始化段 .bssRAM1 .stack RAM1 .systemRAM1 命名段命名段 CODE_SEC
26、TIONROM or RAM0 DATA_SECTIONRAM1 2020年2月22日DSP原理及应用43 第6章 TMS320C54xC语言程序设计 DSP编译器支持两种存储器模式:小存储器模式 (little endian )和大存储器模式(big endian) ; (2)存储器模式 小存储器模式:编译器默认的存储器模式。这要求 .bss在128个字(一个数据页)范围内,这样编译器 在编译成汇编时,不需要修改 DP的值,程序代码简单 ,运算效率高。 大存储器模式:对 .bss大小没有限制,访问变量 时需要首先确定DP值,这将增加指令访问周期 2020年2月22日DSP原理及应用44 第6
27、章 TMS320C54xC 语言程序设计 6.2.2 C54x C语言开发的函数及其约定 DSP的C语言和基本C的开发一样,也是采用函数作 为主体的模块化程序设计方法。同样也是以 main函数作 为主函数,其他功能函数作为子函数,函数的定义函数的 声明和函数的调用方法,从形式上都是一样的。 而对于函数的参数传递,不同的计算机结构确定了不同 种类甚至不同信号的计算机,其 C语言函数在参数传递的 实现上也是有一定的差异的。 2020年2月22日DSP原理及应用45 第6章 TMS320C54xC语言程序设计 1.C54x C 语言开发的寄存器约定规则 编译器的寄存器约定规则规定了在函数内如何使用
28、寄存器,以及在函数之间相互调用时如何保存(或称为 保护)这些寄存器的值。 寄存器值的保存分成两种基本类型,即入口保存和调 用保存。 2020年2月22日DSP原理及应用46 第6章 TMS320C54xC语言程序设计 调用保存(save-on-call ) :为了防止调用函数所使 用的寄存器的值被调用函数更改掉,在调用被调用函数之 前,由调用函数负责将这些寄存器的值进行保护,因此称 为“调用保存”。 如:AR0、AR2-AR5、A、B、T、BRC 入口保存(save-on-entry: 当被调用函数需要使用某 个寄存器时,这些寄存器原来的值由被调用函数负责保存 。这些寄存器值的保护,一般放置在
29、被调用函数的入口处 ,因此称为“入口保存”。 如:AR1、AR6、AR7 2020年2月22日DSP原理及应用47 第6章 TMS320C54xC语言程序设计 2.C54x C 语言开发的函数调用规则 C54x C 编译器规定了一组严格的函数调用规则,任 何调用C函数或被C调用的函数都必须遵循这些规则,否 则,就会破坏C环境,造成不可预测的结果。 假定有一个函数function1 ,它接收了调用者传递给它 的参数,它自己有自己的局部变量,它还要调用另一个 函数function2 ,function1 也需要传递参数给 function2 ,并从function2 中返回计算结果。 2020年2
30、月22日DSP原理及应用48 第6章 TMS320C54xC语言程序设计 其调用关系是: main( )function1() function2() 2020年2月22日DSP原理及应用49 第6章 TMS320C54xC语言程序设计 3.C54x C 语言开发的标识符命名约定和混合语言编程 约定: C编译器在编译C语言程序时,会自动在所有标识 符(函数名、变量名等)之前加下划线“ _” ,比如在C 程序中定义的变量x,则编译以后的汇编程序里面会成 为_x,在汇编程序中使用该变量,变量的标号应该是 _x。 汇编程序中定义一个标识符 _x,C语言程 序调用是x,而不是_x 2020年2月22日
31、DSP原理及应用50 第6章 TMS320C54xC语言程序设计 (1)在C中访问.bss中定义的汇编变量 1 )在C中访问.bss中定义的汇编变量 汇编程序: .bss _var,1 ; 定义变量 .global _var ; 说明为外部变量 C程序: extern int var; /* 声明为外部变量*/ var=1; /* 访问外部变量*/ 2020年2月22日DSP原理及应用51 第6章 TMS320C54xC 语言程序设计 2)在C中访问汇编常数。 汇编程序: .global _table_size ;说明为外部变量 _table_size .set 10000 ;定义常数 C程序
32、: extern int table_size; /*声明为外部变量*/ for(i=0;itable_size;i+) 2020年2月22日DSP原理及应用52 第6章 TMS320C54xC 语言程序设计 3)在C中访问汇编常数表 汇编程序: .global _sine ; 说明为外部变量 .sect “sine_tab” ; 定义命名段 _sine: .word 0 .word 1*32768/100 .word 2*32768/100 .word 2*32768/100 2020年2月22日DSP原理及应用53 第6章 TMS320C54xC语言程序设计 C程序: extern int
33、 sine; /* 声明为外部变量*/ int *sine_pointer=sine; /* 访问外部变量*/ float f; f=(float)sine_pointer2/32768; 2020年2月22日DSP原理及应用54 第6章 TMS320C54xC 语言程序设计 (2)在汇编程序中访问 C变量的例子 1)在汇编中访问C中定义的全局变量。 C程序: int i; /* 全局变量*/ main( ) 汇编程序: .global _i ; 说明为外部变量 STM _i,AR0 ;AR0=i 2020年2月22日DSP原理及应用55 第6章 TMS320C54xC 语言程序设计 2)在汇
34、编中访问C中定义的全局数组 C程序: int h20; /* 全局数组变量*/ main( ) 2020年2月22日DSP原理及应用56 第6章 TMS320C54xC语言程序设计 汇编程序: .global _h ; 说明为外部变量 .data h_add .word _h ; 数组h的起始地址 .text STM h_add,AR0 RPTZ A, #19 ST A,*AR0+ 2020年2月22日DSP原理及应用57 第6章 TMS320C54xC语言程序设计 (3)在C中访问汇编函数 C程序: extern int asmfunc( ); /* 定义外部的汇编 函数*/ int gva
35、r; /* 定义全局变量*/ main( ) int i; i=samfunc(i); /* 调用函数*/ 2020年2月22日DSP原理及应用58 第6章 TMS320C54xC 语言程序设计 汇编程序 FP .set AR7 .mmregs ;使能存储器映像寄存器 .global _asmfunc ;说明为外部函数 .global _gvar ;C中定义的变量 .text _asmfunc: FRAME #-1 ;(SP)-1SP,形成局部帧 NOP ; 避免流水线冲突 STL A, SP ; 参数i暂存到SP ADD (_gvar),A ; 将参数与gvar相加 STL A, (_gva
36、r) ; 保存至gvar FRAME #1 ;(SP)+1SP, 撤销局部帧 RET ; 函数返回 2020年2月22日DSP原理及应用59 第6章 TMS320C54xC语言程序设计 (4)在C中使用内嵌汇编 在C程序中内嵌汇编语句是一种直接的 C模块和汇编 模块接口方法。采用这种方法一方面可以在 C程序中实现 用C语言难以实现的一些硬件控制功能;另一方面,也可 以用这种方法在C程序中的关键部分用汇编语句代替 C语 句以优化程序。 格式:asm(“ 汇编语句”) 如:asm(“SSBX INTM” ) 2020年2月22日DSP原理及应用60 第6章 TMS320C54xC语言程序设计 注意
37、: (1)” 内的内容要符合汇编语言语法规则 例如:标号要从头开始 (2)这种方式交易破坏C环境,汇编出错编译器查不出; (3)插入跳转、标号可能导致C代码出错; (4)不要在内嵌汇编中改变C变量的值; (5)不要在内嵌汇编中更改汇编环境的设置。因为改变可 能与C编译器的设置有冲突。 2020年2月22日DSP原理及应用61 第6章 TMS320C54xC语言程序设计 6.2.3 C54x C语言中断处理函数的实现 1.C语言中断函数的定义 C语言中断函数的定义有两种实现方法,如下: (1)c_intd 函数 C编译器约定,任何具有名为 c_intd(d为09)的函 数都被假定为一个中断程序。
38、如: void c_int1() 2020年2月22日DSP原理及应用62 第6章 TMS320C54xC语言程序设计 这种定义的中断函数每个中断都采用固定的处理程 序名。其中c_int0函数是系统复位的中断处理程序,主 要用来完成系统上电后的初始化。该函数是 rts.lib库 函数来完成的,不用编写。 缺点:可以定义的中断处理函数数目较少(只有 9个) ,另外,函数名称与其功能的对应关系不够直观。因此 ,除了c_int0函数外,一般不建议使用这种定义方法。 2020年2月22日DSP原理及应用63 第6章 TMS320C54xC 语言程序设计 (2 ) interrupt 函数 中断函数定义的另一种实现方法就是利用 interrupt 关键 字,将该关键字后面所定义的函数声明为中断函数,当编 译器编译该函数时,就会把该函数编译成中断处理函数。 void interrupt isr() 采用这种方法,可以对每种中断服务函数的功能,给 它起一个有意义的名称,非常直观,同时,中断服务函数 的个数也没有严格的限制。 2020年2月22日DSP原理及应用64 第6章 TMS320C54xC 语言程序设计 2.关于C语言中断函数的说明 (1)中断函数的返回类型必须是 void类型,并且不能 有参数。 (4)中断函数不能被普通 C代码之间调用 (5)C编译器规定进入中断函数时,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新生儿臂丛神经损伤的临床护理
- 《如何在手机上制作课件》
- 2025汽车销售合同范本2
- 2025博尔特委托试验合同
- 2025关于租赁合同的管辖问题案例分析
- 深圳七下生物期末试卷及答案
- 陕西中考试卷及答案全套b卷
- 2025年买卖食品的合同范本
- 浙江国企招聘2025温州机场集团招聘31人笔试参考题库附带答案详解
- 电容器在数据中心电力系统的优化设计考核试卷
- 公共资源交易知识培训
- 《危机管理案例》课件
- DB13-T5687-2023负压封闭引流术护理规范
- 海绵材料项目可行性研究报告
- 2025年四川成都地铁运营有限公司招聘笔试参考题库含答案解析
- 【MOOC】《学术交流英语》(东南大学)章节中国大学慕课答案
- 幼儿园阅读活动环境创设
- 如何与人有效沟通培训
- 食品企业生产部门质量奖惩条例
- 《妇产科学》课件-15.3绝经综合征
- 幼儿园中班彩虹泡泡龙课件
评论
0/150
提交评论