版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章章 C/C+语言程序设计语言程序设计n C55x C/C+语言概述语言概述n C55x C/C+语言编程基础语言编程基础n C55x C/C+编译器的使用编译器的使用n C和汇编语言混合编程和汇编语言混合编程源代码源代码 (source code) 预处理器预处理器 (preprocessor) 编译器编译器 (compiler) 汇编程序汇编程序 (assembler) 目标代码目标代码 (object code) 链链接器接器 (Linker) 可执行程序可执行程序 (executables) 6.1 C55x C/C+语言概述语言概述6.1.1 C/C+语言概况语言概况l汇编语言
2、依赖于汇编语言依赖于计算机硬件计算机硬件,程序的,程序的可读性和可移植可读性和可移植性比较差性比较差。一般高级语言具有很好的可移植性,但是。一般高级语言具有很好的可移植性,但是难以实现汇编语言的某些功能(如对内存地址的操作、难以实现汇编语言的某些功能(如对内存地址的操作、位操作等)。位操作等)。lC/C+语言作为一种高级语言,既可以语言作为一种高级语言,既可以访问物理地址访问物理地址又可以又可以进行位操作进行位操作,能,能直接对硬件进行操作直接对硬件进行操作,能实现,能实现汇编语言的汇编语言的大部分大部分功能,适合用作功能,适合用作DSP开发语言。开发语言。6.1.2 C55x C/C+语言概
3、况语言概况lC55x C/C+编译器全面支持编译器全面支持ANSI C/C+语言标准,语言标准,能够把按照标准能够把按照标准ANSI C/C+规范编写的源程序进行规范编写的源程序进行全面优化,编译成全面优化,编译成C55x 汇编语言源程序。汇编语言源程序。lC55x C/C+编译器工具拥有完整的编译器工具拥有完整的实时运行库。实时运行库。l C55x C/C+编译器输出文件的特性。编译器输出文件的特性。包括标准输入输出、串操作、包括标准输入输出、串操作、动态内存分配、数据转换、三动态内存分配、数据转换、三角函数、指数函数、双曲函数角函数、指数函数、双曲函数等,但是等,但是不包含信号处理函数不包
4、含信号处理函数,因为它们涉及到目标系统的具因为它们涉及到目标系统的具体特性体特性n生成的汇编语言便于查看,使生成的汇编语言便于查看,使用户能够看到产生自用户能够看到产生自C/C+源程源程序的代码。序的代码。n COFF文件允许用户在链接时文件允许用户在链接时定义自己的系统存储器配置定义自己的系统存储器配置 。n对于嵌入式场合,编译器允许对于嵌入式场合,编译器允许用户把所有代码和初始化数据链用户把所有代码和初始化数据链接进接进ROM,使代码自复位后开始,使代码自复位后开始运行运行6.2 C55x C/C+语言编程基础语言编程基础6.2.1 数据类型数据类型lC55x C语言支持的数据类型语言支持
5、的数据类型:类型长度(位)内容最小值最大值字符型、带符号字符型16ASCII码-32 76832 767无符号字符型16ASCII码065 535短整型、带符号短整型16二进制补码-32 76832 767无符号短整型16二进制数065 535整型、带符号整型16二进制补码-32 76832 767无符号整型16二进制数065 535长整型、带符号长整型32二进制补码-2 147 483 6482 147 483 647无符号长整型32二进制数04 294 967 295charunsigned char short intunsigned short intintunsigned int l
6、ong intunsigned long int类型长度(位)内容最小值最大值带符号特长整型40二进制补码-5.49756E+115.49756E+11无符号特长整型40二进制数01.09951E+12枚举16二进制补码-32 76832 767浮点3232位IEEE 1.18E-383.40E+38双精度3232位IEEE1.18E-383.40E+38长双精度3232位IEEE1.18E-383.40E+38数据指针(小存储器模式)16二进制数00 xFFFF数据指针(大存储器模式)23二进制数00 x7FFFFF程序指针24二进制数00 xFFFFFFl定义各种数据类型时应注意如下规则:
7、定义各种数据类型时应注意如下规则:u避免设避免设int和和long为相同大小为相同大小u对对定点算法(特别是乘法)尽量使用定点算法(特别是乘法)尽量使用int数据类型数据类型。用。用long类型作乘法操作数会导致调用运行时间库(类型作乘法操作数会导致调用运行时间库(run-time library)的程序)的程序u避免设避免设char为为8位或位或long为为64位位u最好使用最好使用int类型类型作循环指数变量和其它位数不太重要时作循环指数变量和其它位数不太重要时的整型变量,因为的整型变量,因为int是对目标系统操作最高效的整数类是对目标系统操作最高效的整数类型,而不管芯片结构如何型,而不管
8、芯片结构如何6.2.2 关键字关键字1. const l将这个关键字使用到对将这个关键字使用到对任意变量或数组任意变量或数组的定义上可的定义上可以确保它们的值不改变。以确保它们的值不改变。l如果定义一个对象为如果定义一个对象为const,那么,那么const段段就会为就会为该对象分配存储空间。该对象分配存储空间。const int n=2;2. ioportlC55x C编译器增加了编译器增加了ioport关键字来关键字来支持支持I/O寻址模式寻址模式uioport类型限定词可以和标准类型(数组、结构体、共类型限定词可以和标准类型(数组、结构体、共用体和枚举)一起使用用体和枚举)一起使用u可以
9、和可以和const及及volatile一起使用。一起使用。uioport可以单独使用,这种情况下可以单独使用,这种情况下int限定词就是默认的限定词就是默认的lioport类型限定词类型限定词只能用于全局或静态变量只能用于全局或静态变量。局部变量不能。局部变量不能用用ioport限制,除非变量是个指针限制,除非变量是个指针ioport unsigned int *ebsr ioport volatile unsigned short * PIOPUS;例例6-1,ioport关键字的使用。关键字的使用。ioport int k ; /*valid* /void foo(void)ioport
10、int i ; /*invalid* /ioport int *j ; /*valid* /3. interruptlC55x C编译器增加了编译器增加了interrupt关键字,来指定关键字,来指定某个函数为中断函数。某个函数为中断函数。void interrupt isr() 4. onchiplOnchip关键字声明一个特殊指针,该指针所指向的数关键字声明一个特殊指针,该指针所指向的数据可用作据可用作双双MAC指令的操作数指令的操作数。在链接时这些数据必。在链接时这些数据必须被链接到须被链接到DSP片上存储器片上存储器,否则会导致总线错误。,否则会导致总线错误。onchip int x1
11、00; /* 数组声明数组声明 */onchip int *p ; /* 指针声明指针声明 */5. volatilel在任何情况下,优化器会通过分析数据流来在任何情况下,优化器会通过分析数据流来避免存避免存储器访问。储器访问。l如果程序依靠存储器访问,则必须使用如果程序依靠存储器访问,则必须使用volatile关关键字来指明这些访问。键字来指明这些访问。u编译器将编译器将不会优化不会优化任何对任何对volatile变量的引用变量的引用 volatile int i=10; int a=i; . /其他代码,并未明确告诉编译器,其他代码,并未明确告诉编译器,对对i进行过操作进行过操作 int
12、b=i; 6.2.3 寄存器变量和参数寄存器变量和参数l寄存器变量就是用寄存器变量就是用register关键字声明的变量。关键字声明的变量。l根据是否使用优化器,根据是否使用优化器,C编译器对寄存器变量采用不同编译器对寄存器变量采用不同的处理方式。的处理方式。l编译器会尽量分配好所声明的寄存器变量。编译器会尽量分配好所声明的寄存器变量。l整型整型、浮点型浮点型和和指针类型指针类型对象都可以声明为寄存器变对象都可以声明为寄存器变量量,而其它类型对象不行。而其它类型对象不行。u当使用优化器时,编译器当使用优化器时,编译器忽略任忽略任何寄存器声明何寄存器声明,通过一种能够最,通过一种能够最有效地使用
13、寄存器的代价算法,有效地使用寄存器的代价算法,把寄存器分配给变量和临时量。把寄存器分配给变量和临时量。u当不使用优化器进行编译时,编当不使用优化器进行编译时,编译器将译器将使用使用register关键字的变量关键字的变量分配到寄存器中分配到寄存器中register int a; 6.2.4 asm指令指令lasm指令指令可以直接将可以直接将C55x汇编语言指令嵌入到编译器汇编语言指令嵌入到编译器的汇编语言输出中。的汇编语言输出中。l指令格式:指令格式: asm (“assembler text”); asm (“ nop”); 插入一条汇编指令插入一条汇编指令nopl插入的代码必须是插入的代码
14、必须是合法的汇编语言指令合法的汇编语言指令包含引用的代码行必须用标号、空格、星号、分号开头。包含引用的代码行必须用标号、空格、星号、分号开头。l使用使用asm指令存在的问题:指令存在的问题:容易破坏容易破坏C环境,当使用带环境,当使用带asm指令的指令的优化器优化器时必须小心。时必须小心。优化器可以重新改变周围代码顺序并可能引起不可预知的结果优化器可以重新改变周围代码顺序并可能引起不可预知的结果6.2.5 Pragma指令指令lPragma指令告诉编译器的指令告诉编译器的预处理器预处理器如何处理函数。如何处理函数。l必须在必须在函数体外函数体外确定确定pragma,且必须出现在任何声明、,且必
15、须出现在任何声明、定义或对函数和符号引用之前。否则,编译器会输出警告。定义或对函数和符号引用之前。否则,编译器会输出警告。#Pragma Para 6.2.6存储器模式存储器模式1.小存储器模式(默认模式)小存储器模式(默认模式)n使用小存储器模式将得到比使用大存储模式时使用小存储器模式将得到比使用大存储模式时更少的更少的代码和数据代码和数据。n 在小存储器模式中,在在小存储器模式中,在单页单页(64KB)存储器内的以)存储器内的以下段必须都分配合适:下段必须都分配合适:n.bss和和.data段(所有静态和全局数据)。段(所有静态和全局数据)。n.stack和和sysstack段(第一和第二
16、系统堆栈)。段(第一和第二系统堆栈)。n.sysmem段(动态存储空间)。段(动态存储空间)。n.const段。段。l在小存储器模式中,对在小存储器模式中,对.text段(代码)、段(代码)、.switch段段(switch语句)和语句)和.cinit段(变量初始化)的大小和段(变量初始化)的大小和位置没有限制。位置没有限制。l小存储器模式下编译器使用小存储器模式下编译器使用16位数据指针位数据指针来访问数据。来访问数据。XARn寄存器的高寄存器的高7位用来设置指向包含位用来设置指向包含.bss段的存储段的存储页。页。2.大存储器模式大存储器模式l大存储器模式支持不严格的数据放置。大存储器模式
17、支持不严格的数据放置。l在大存储器模式下,在大存储器模式下,数据指针为数据指针为23位位,在存储器中占,在存储器中占2字空间。字空间。.stack和和.sysstack段必须在同一页上。段必须在同一页上。l在大存储器模式下编译代码时,必须和在大存储器模式下编译代码时,必须和rts55x.lib运运行时间库链接。行时间库链接。应用程序中的所有文件都必须使用相应用程序中的所有文件都必须使用相同的存储器模式。同的存储器模式。l链接器不允许同时存在大存储器模式和小存储器模式。链接器不允许同时存在大存储器模式和小存储器模式。-l rts55x.lib6.2.7 存储器分配存储器分配1. C编译器生成的段
18、编译器生成的段lC编译器生成的段有两种基本的类型,即编译器生成的段有两种基本的类型,即初始化段初始化段和和未初始未初始化段化段l初始化段有:初始化段有:u.cinit段,段, 包含初始化数据表格和常数包含初始化数据表格和常数u.pinit段段, 包含实时运行时调用的数据表格包含实时运行时调用的数据表格u.const段段,包含用,包含用const定义(不能同时被定义(不能同时被volatile定义)的字符串常定义)的字符串常 量和数据量和数据u.switch段段,包含,包含switch语句所用表语句所用表u.text段段, 包含所有可执行代码包含所有可执行代码汇编器生成了汇编器生成了.data段
19、,但段,但C编译编译器并不使用这个段。器并不使用这个段。l未初始化段未初始化段保留了存储器空间保留了存储器空间,一段程序可以在运行期一段程序可以在运行期间使用这个空间来生成和存储变量:间使用这个空间来生成和存储变量:u.bss段段,为全局和静态变量保留了空间。,为全局和静态变量保留了空间。u.stack段段,为,为C系统堆栈分配存储地址。这个存储系统堆栈分配存储地址。这个存储地址用来传递变量和局部存储地址用来传递变量和局部存储u.sysstack段段,为第二系统堆栈分配存储地址,为第二系统堆栈分配存储地址u.sysmem段段,为动态存储分配保留空间。这个空间被,为动态存储分配保留空间。这个空间
20、被malloc、calloc和和realloc函数调用。函数调用。u.cio段段,支持,支持C I/O。.cio段必须放在链接器命令文件中段必须放在链接器命令文件中才能使用才能使用C I/O表表6-2 段及其存储位置段及其存储位置MEMORY DARAM: o=0 x100,l=0 x07f00 VECT : o=0 x0d000,l=0 x100 DARAM2: o=0 x0d100,l=0 x1f00 SARAM: o=0 x10000,l=0 x30000 SDRAM: o=0 x40000,l=0 x3e0000 SECTIONS .text: DARAM .vectors: VECT
21、 .trcinit: DARAM .gblinit: DARAM .cinit: DARAM .pinit: DARAM .sysinit: DARAM .bss: DARAM2 .far: DARAM2 .const: DARAM .switch: DARAM .sysmem: DARAM .cio: DARAM .sysheap: DARAM .sysstack DARAM .stack: DARAM 2. 堆栈堆栈l用来放置用来放置局部变量局部变量、传递参数传递参数给函数、给函数、保存处理器状态保存处理器状态,它被放在存储器的一个连续块中,并从高地址到低地址存它被放在存储器的一个连续块中
22、,并从高地址到低地址存放数据。放数据。l编译器用编译器用堆栈指针(堆栈指针(SP)来管理堆栈。来管理堆栈。C55x支持支持第二系第二系统堆栈统堆栈,使用第二堆栈指针,使用第二堆栈指针SSP来管理第二系统堆栈。来管理第二系统堆栈。l代码不会检查是否在运行时间内堆栈出现溢出,必须为堆代码不会检查是否在运行时间内堆栈出现溢出,必须为堆栈分配合适的存储空间。栈分配合适的存储空间。l两堆栈的两堆栈的大小都由链接器设置大小都由链接器设置。两种默认堆栈大小都是。两种默认堆栈大小都是1000字节。可通过链接器命令中的字节。可通过链接器命令中的-stack或或-sysstack选项改变堆栈大小。选项改变堆栈大小
23、。-stack 500-sysstack 5003.动态存储器分配动态存储器分配l由编译器提供的由编译器提供的运行时间支持库运行时间支持库包含几个在运行时间内包含几个在运行时间内为变量动态分配存储器的函数(为变量动态分配存储器的函数(malloc、calloc和和realloc)l存储器被从一个在存储器被从一个在.sysmen段段定义的全局池(定义的全局池(pool)或)或堆(堆(heap)中分配出来。可通过)中分配出来。可通过-heap size选项和链接选项和链接器命令来设置器命令来设置.sysmem段的大小。默认大小为段的大小。默认大小为2000字节字节l动态分配的对象必须用动态分配的对
24、象必须用指针寻址指针寻址。6.2.8 中断处理中断处理n中断程序会执行中断程序会执行任何其它函数执行的工作任何其它函数执行的工作。n对所有的中断屏蔽都要进行处理。通过嵌入汇编语言语对所有的中断屏蔽都要进行处理。通过嵌入汇编语言语句可以句可以使能或禁止中断使能或禁止中断,也可以修改,也可以修改IER0/1寄存器而寄存器而不会破坏不会破坏C环境或环境或C指针。指针。n中断处理程序中断处理程序不能有参数不能有参数,即使声明了参数也会被忽略,即使声明了参数也会被忽略n中断处理程序中断处理程序不能被普通不能被普通C代码调用代码调用。1.1.关于中断的几个要点关于中断的几个要点n为了将中断程序和中断联系起
25、来,需要将分支程序放在合为了将中断程序和中断联系起来,需要将分支程序放在合适的中断向量表中。适的中断向量表中。n在汇编语言中,需要在中断程序名前加下划线,如在汇编语言中,需要在中断程序名前加下划线,如_c_int00。 c_int00是是C程序入口。这个名字被保存为程序入口。这个名字被保存为系统重启中断系统重启中断。这个特殊的中断程序这个特殊的中断程序初始化系统并调用了主函数初始化系统并调用了主函数。2. C中断程序的使用中断程序的使用l通过通过interrupt关键字关键字可以用可以用C函数直接处理中断。函数直接处理中断。l interrupt关键字可以和定义为返回关键字可以和定义为返回vo
26、id并不含参数的并不含参数的函数一起使用。中断函数体可以有函数一起使用。中断函数体可以有局部变量局部变量,可以,可以自由自由使用堆栈使用堆栈。例,例,interrupt void isr() .6.2.9 系统初始化系统初始化l在运行在运行C程序之前必须先程序之前必须先建立建立C运行环境运行环境,该工作由被称为,该工作由被称为_c_int00的的C启动程序启动程序来完成来完成.l为使系统开始运行,必须由复位硬件调用为使系统开始运行,必须由复位硬件调用_c_int00函数,函数,将将_c_ int00函数和其它目标模块链接起来。函数和其它目标模块链接起来。l当当C程序被链接时,链接器会在可执行输
27、出模块中给符号程序被链接时,链接器会在可执行输出模块中给符号_c_int00设置入口点的值设置入口点的值。l _c_int00函数执行如下工作来初始化函数执行如下工作来初始化C环境:环境:u建立堆栈和第二系统堆栈。建立堆栈和第二系统堆栈。u通过从在通过从在 .cinit段段中的初始化表中复制数据到中的初始化表中复制数据到.bss段段中的变量来初始化全局变量。中的变量来初始化全局变量。u调用调用main函数函数开始执行开始执行C程序。程序。 6.3 TMS320C55x的的C代码优化代码优化l由于由于C语言程序的执行效率语言程序的执行效率无法达到无法达到汇编语言程序的水汇编语言程序的水平,所以常
28、常在编写完平,所以常常在编写完C程序后还要进行程序后还要进行C代码优化以代码优化以提高效率提高效率,以,以达到实时性要求达到实时性要求。lC55x的的C/C+编译器中含有编译器中含有优化器(优化器(optimizer)的)的程序模块程序模块。优化器通过执行一些操作(如简化循环,重。优化器通过执行一些操作(如简化循环,重新安排语句和表达式,把变量用寄存器实现等),可以新安排语句和表达式,把变量用寄存器实现等),可以提高提高C/C+程序的运行速度,减少其代码长度。程序的运行速度,减少其代码长度。6.4 C55x C和汇编语言混合编程和汇编语言混合编程l汇编语言所编汇编语言所编程序执行效率高程序执行
29、效率高。 但是不同公司的但是不同公司的DSP芯片所提供的汇编语言各不相同,即使是同芯片所提供的汇编语言各不相同,即使是同一公司的芯片,由于芯片的类型不同,其汇编语言也不尽相同。一公司的芯片,由于芯片的类型不同,其汇编语言也不尽相同。用汇编语言开发用汇编语言开发DSP产品产品周期很长,软件修改、升级、移植都非周期很长,软件修改、升级、移植都非常困难常困难。l采用采用C语言编程具有语言编程具有开发效率高开发效率高的优点,有助于提高产的优点,有助于提高产品开发速度,程序修改、升级和移植也很方便。品开发速度,程序修改、升级和移植也很方便。 但是但是C语言的语言的执行效率较低执行效率较低,通常不能满足实
30、时性要求,且,通常不能满足实时性要求,且无法无法控制某些硬件控制某些硬件。l一般来说,只是在一般来说,只是在DSP运算能力不是很紧张时才采运算能力不是很紧张时才采用用C语言开发语言开发DSP程序,更加普遍的是采用程序,更加普遍的是采用C和汇编和汇编语言混合编程。语言混合编程。 通常对于实时性要求不高的部分如通常对于实时性要求不高的部分如主控程序采用主控程序采用C语言编写语言编写,对于对于实时性要求较高实时性要求较高的模块如的模块如FFT、FIRIIR滤波等则滤波等则采用汇采用汇编语言编写编语言编写。例,一个典型的函数调用。从例,一个典型的函数调用。从C C代码中访问汇编语言函数。代码中访问汇编
31、语言函数。(a)C程序程序(父函数父函数):extern int asmfunc(int,int *); /声明汇编函数声明汇编函数int gvar ; /定义全局变量定义全局变量main()int i;i=asmfunc(i,&gvar); /调用函数调用函数(b)汇编程序汇编程序(子函数子函数) :_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i, i=T0 RET;6.4.4 C和汇编语言的接口和汇编语言的接口 混合使用混合使用C代码和汇编语言代码的主要方法有:代码和汇编语言代码的主要方法有:l使用几个使用几个独立的汇编代码模块独立的汇编代码模块,并将它们与
32、编译了的,并将它们与编译了的C模模块块进行链接进行链接,这是最通用的方法。,这是最通用的方法。l在在C源代码中使用源代码中使用汇编语言变量和常数汇编语言变量和常数。l将汇编语言程序将汇编语言程序直接嵌入直接嵌入C源代码源代码中。中。l在在C源代码中使用源代码中使用本征函数本征函数直接调用汇编语言语句。直接调用汇编语言语句。1. 在在C代码中访问汇编语言代码中访问汇编语言函数函数l定义汇编函数时,需要在函数名前加定义汇编函数时,需要在函数名前加下划线下划线“_” 让编译器识别。让编译器识别。例,从例,从C代码中访问汇编语言函数。代码中访问汇编语言函数。(a)C程序:程序:extern int a
33、smfunc(int,int *); /声明汇编函数声明汇编函数int gvar ; /定义全局变量定义全局变量main()int i;i=asmfunc(i,&gvar); /调用函数调用函数(b)汇编程序)汇编程序:_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i, i=T0 RET;2. 在在C代码中访问汇编语言代码中访问汇编语言变量变量n访问访问.bss段或段或.usect段中没有初始化的变量:段中没有初始化的变量:使用使用.bss或或.usect指令来定义变量指令来定义变量使用使用.global指令来定义为外部变量指令来定义为外部变量在汇编语言中的变量前
34、加下划线在汇编语言中的变量前加下划线“_”在在C代码中声明变量为代码中声明变量为外部变量外部变量并正常地访问它并正常地访问它例,从程序中访问定义在例,从程序中访问定义在.bss段的变量段的变量(a)C程序:程序:extern int var; /* 外部变量外部变量 */var = 1; /* 使用变量使用变量 */(b)汇编语言程序:)汇编语言程序:.bss var,1;定义变量定义变量.global bar;声明变量为外部变量声明变量为外部变量n当变量不是被存放在当变量不是被存放在.bss段时,这时应该定义一个指向段时,这时应该定义一个指向该变量的指针并从该变量的指针并从C语言中对其间接访
35、问。语言中对其间接访问。u首先,要首先,要定义变量定义变量u其次,声明一个指向该变量起始地址的其次,声明一个指向该变量起始地址的全局指针全局指针,这,这个变量就可以被链接到存储空间的任何地方个变量就可以被链接到存储空间的任何地方u最后,在程序中访问时,必须先声明该对象为最后,在程序中访问时,必须先声明该对象为extern型,型,并且不能在其名称前面加下划线,然后就并且不能在其名称前面加下划线,然后就可以正常访问它了可以正常访问它了例,在例,在C代码中访问没有在代码中访问没有在 .bss段中声明的变量。段中声明的变量。(a)C程序:程序:extern float sine ;/*这就是对象这就是对象*/float *sine_p=sine;/*声明指针指向它声明指针指向它*/f=sine_p2;/*正常访问该对象正常访问该对象*/(b)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年国庆前期工作安排部署方案
- 2026年食堂经理年终述职报告
- 2026年春节回家安排相亲
- 2026年城市消防专项规划方案
- 2026年安保部下半年计划工作
- 2026年教育建设工程施工协议
- 2026年煤矿安全生产规划
- 2026年幼儿园春节教学计划
- 2026年春节工地复工计划
- 基于智慧化的医院成本管控体系
- 生产线平衡实战技法培训
- DB32∕T 5352.3-2026 基础数据库应用服务规范 第3部分:电子证照
- 学生饮水卫生安全课件
- 2026年兰州大学管理岗招聘考试笔试试题(含答案)
- 2026年潍坊三模数学测试题及答案
- 220kV主变中性点隔直装置使用及维护
- 江苏省南京市2026年高三第三次联考(5月)数学试题试卷含解析
- 2026云南昆明市官渡区国有资产投资经营有限公司招聘5人笔试备考试题及答案解析
- MAN 16-24副机中文说明书
- 2025年度中国酒店行业白皮书-UHC
- 2025年河海大学测量学答案测量学试题及答案
评论
0/150
提交评论