版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、复习提纲:(C语言翻译汇编)1、 概述1. 嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置国内普遍认同的嵌入式系统定义为:以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。2.嵌入式系统的几个重要特征(简述5特征)(1) 嵌入式系统工业是不可垄断的高度分散的工业 从某种意义上来说,通用计算机行业的技术是垄断的。嵌入式系统则不同,它是一个分散的工业,充满了竞争、机遇与创新,没有哪一个系列的处理器和操作系统能够垄断全部市场。(2)操作系统内核小由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的
2、操作系统要小得多。比如ENEA公司的OSE分布式系统,内核只有5K,而Windows的内核则要大得多。(3)专用性强嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植。即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全不同的概念。 (4)系统精简嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。(5)高实时性OS这是嵌入式软件的基本要求,
3、而且软件要求固态存储,以提高速度。软件代码要求高质量和高可靠性、实时性。 6)嵌入式软件开发走向标准化嵌入式系统的应用程序可以没有操作系统直接在芯片上运行。为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS(RealTime Operating System)开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。(7) 嵌入式系统开发需要开发工具和环境由于其本身不具备自主开发能力,即使设计完成以后,用户通常也是不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。这些工具和环境一般是基于通用计算机上的软硬件设备以及各
4、种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。(8) 嵌入式系统运行环境差异很大:(9) 嵌入式系统比通用PC系统资源少得多:(10) 一般的嵌入式系统具有低功耗、体积小、集成度高、成本低等特点:(11) 建立完整的嵌入式系统的系统测试和可靠性评估体系,保证嵌入式系统高效、可靠、稳定工作:(12) 具有较长的生命周期3. 嵌入式系统的组成(最后的图,有印象)嵌入式硬件系统嵌入式处理器各种类型存储器模拟电路及电源接口控制器及接插件嵌入式软件系统实时操作系统(RTOS)板级支持包(BSP)设备驱动(Device
5、Driver)协议栈(Protocol Stack)应用程序(Application)4.嵌入式系统的实时性二、嵌入式系统设计方法、过程(2.3ppt)1.交叉开发环境、先在通用PC机上编程,然后通过交叉编译链接,将程序做成目标平台上可以运行的二进制代码格式。最后将程序下载到目标平台上的特定位置由目标板上启动代码运行这段二进制代码。交叉开发:在一台通用计算机上进行软件的编辑编译,然后下载到嵌入式设备中运行调试的开发方式。 开发计算机一般称宿 主机,嵌入式设备称为目标机,在宿主机上编译好的程序,下载到目标机上运行。交叉开发环境一般由运行于宿主机上的交叉开发软件、宿主机到目标机的调试通道组成。如基
6、于ARM9、COS的嵌入式系统开发,需要安装交叉编译工具ADS 。基于VxWorks的开发环境:Tornado 2. 几种常用的调试方法、指令集模拟器 一种利用PC机端的仿真开发软件模拟调试的方法。 如:Skyeye 清华大学陈渝主持的自由软件项目, ARM公司的ARMulator模拟器驻留监控软件 驻留监控程序运行在目标板上,PC机端调试软件可通过并口、串口、网口与之交互,以完成程序执行、存储器及寄存器读写、断点设置等任务 ARM公司的Angel是长驻在目标机Flash中的监控程序JTAG仿真器(基于JTAG的ICD(In-Circuit Debugg
7、er) 通过ARM芯片的JTAG边界扫描口与ARM核进行通信,不占用目标板的资源,是目前使用最广泛的调试手段在线仿真器ICE(In-Circuit Emulator) 使用仿真头代替目标板上的CPU,可以完全仿真ARM芯片的行为。但结构较复杂,价格昂贵,通常用于ARM硬件开发中(ARM-LINUX开发一般过程不要求)三、Bootloader(3个常用)1、什么是bootloaderBootloader,为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。 Bootloader的位置:通常固化在硬件上的某个固态存储设备上,加电后自启动。Bootloader功能:初始化硬件
8、设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0x) ,将系统的软、硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。 Bootloader的地址:在嵌入式系统中,系统加电复位后,几乎所有的 CPU都从由复位地址上取指令。2、 Bootloader操作模式 两种不同的操作模式:“启动加载”模式和“下载”模式。其区别对于开发人员才有意义。从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。启动加载(Bootloading)模式启动加载模式称为“自举”(Autonomous)模式
9、。即Bootloader从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。启动加载模式是 Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。 下载(Downloading)模式下载方式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被 Bootloader写到目标机上的FLASH 类固态存储设备中。 下载模式应用场合:Bootl
10、oader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用到这种工作模式。用户应用接口:工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。 如在RedBoot下,将出现“RedBoot”提示符;在vivi Bootloader 下出现“vivi”提示符。3、 Bootloader启动过程Bootloader的启动可以分为两个阶段1、第一阶段阶段1主要包含依赖于CPU体系结构及硬件设备的初始化等。通常都用汇编语言来实现。这个阶段的任务有5:(1)、基本的硬件设备初始化这是 Bootloader 一开始就执行的操作,其目的是为阶段
11、2 的执行、以及随后kernel 的执行准备好一些基本的硬件环境。 它通常包括以下工作: 关闭处理器内部指令/数据cache等 关闭中断 关闭看门狗 配置PLL 配置内存 初始化各工作模式的堆栈 配置中断 拷贝RW段,初始化ZI段 (2)、为阶段2代码准备RAM空间为了获得更快的执行速度,通常把 阶段2 的代码加载到 RAM 空间中来执行。 准备RAM空间考虑的因素:阶段2代码大小、堆栈、页大小(4KB的倍数)、安排位置等。 (3)、拷贝阶段2代码到RAM空间(4)、设置好堆栈堆栈指针sp设置在1MB 的 RAM 空间的最顶端(堆栈向下生长)。(5)、跳转到阶段2的C程序入口点在上述一切都就绪
12、后,就可以跳转到 Bootloader 的 stage2 去执行了。2、第二阶段阶段2通常用C语言来实现,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的主要任务有5:(1)、初始化本阶段要使用到的硬件至少初始化一个串口,以便和终端用户进行 I/O 输出信息等。 (2)、检测系统内存映射(memory map)所谓内存映射,就是指在整个物理地址空间中有哪些地址范围被分配用来作为系统的 RAM 单元。为后面使用RAM、运行程序做好准备。(3)、将kernel和根文件系统映像从flash读到RAM空间 (4)、为kernel设置启动参数这是在调用内核之前应该做的准备工作。Linu
13、x 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。启动参数标记列表方法:以ATAG_CORE标记开始,以ATAG_NONE标记结束。在嵌入式 Linux 系统中,通常需要由 Boot Loader 设置的启动参数有:ATAG_CORE、ATAG_MEM(内存映射)、ATAG_NONE等。 (5)、调用内核Bootloader调用Linux kernel的方法是直接跳转到内核的第一条指令处。在跳转时必须满足下列条件:1)、CPU寄存器的设置:R0为0;R1为机器类型ID;R2为启动参数,标记列表在RAM中的起始基地址。 (机器类型参见 linux/arch
14、/arm/tools/mach-types目录)2)、CPU模式: CPU必须设置为SVC模式,必须禁止中断(IRQs和FIQs)。3)、 MMU 和 Cache的设置:MMU 必须关闭;指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭。4、有哪些常用的BootloaderBootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。1、vivivivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBoot RedBoot即红帽(Red Hat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引
15、导/装载器。3、U-Boot U-Boot(Universal Bootloader)由德国DENX小组开发,是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、PowerPC、MIPS等。四、嵌入式微处理器1、嵌入式系统硬件基础知识(体系结构,指令集)1)冯诺依曼体系结构和哈佛体系结构冯诺依曼体系结构数据和指令都存储在一个存储器中的计算机被称为冯诺依曼机指令的执行周期T1)取指令(Instruction Fetch):TF2)指令译码(Instruction Decode):TD3)执行指令(Instruction Execute):TE4)存储(Stor
16、age):TS每条指令的执行周期:T= TF+TD+TE+TS冯诺依曼体系结构特点:1)数据与指令都存储在存储器中2)被大多数计算机所采用3)冯诺依曼体系: 英特尔公司的8086,英特尔公司的其他中央处理器、ARM的ARM7、MIPS公司的MIPS处理器。哈佛体系结构数据和指令存储在各自独立的存储器中的计算机体系结构称为哈佛体系结构哈佛体系结构特点:1)程序存储器与数据存储器分开2)提供了较大的数据存储器带宽3)适合于数字信号处理4)大多数DSP都是哈佛结构5)Microchip公司的PIC16芯片 、摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司
17、的ARM9、ARM10和ARM11。 很难在哈佛机上编写出一个自修改程序(写入数据值然后使用这些值作为指令的程序2) CISC与RISCCISC:复杂指令集(Complex Instruction Set Computer)8/2原则:80%的程序只使用20%的指令具有大量变长形式的不同指令大多数程序只使用少量的指令就能够运行。PUSH AXMOV AL,80HMOV AX,1090HRISC:精简指令集(Reduced Instruction Set Computer)RISC是在开发高性能微处理器过程中的一个进步在通道中只包含最有用的指令(少而简单)确保数据通道快速执行每一条指令使CPU硬
18、件结构设计变得更为简单指令格式和长度固定,且指令类型很少、指令功能简单、寻址方式少而简单,指令译码控制器采用硬布线逻辑,这样易于流水线的实现,进而获得高性能; 由于RISC指令系统强调了对称、均匀、简单,使得程序的优化编译效率更高;大多数指令单周期完成;分开的load-store结构的存取指令,也只有load-store结构的存取指令访问存储器,而数据处理指令只访问寄存器。而CISC处理器一般允许将存储器中的数据作为数据处理指令的操作数;3) 流水线、超标量4) 缓存如何减少CPU与内存之间的速度差异?(4种)1、为什么采用高速缓存微处理器的时钟频率比内存速度提高快得多,高速缓存可以提高内存的
19、平均性能。2、高速缓存的工作原理高速缓存是一种小型、快速的存储器,它保存部分主存内容的拷贝。 5) 总线和总线桥ARM微控制器使用的是AMBA总线体系结构AMBA(Advanced Microcontroller Bus Architecture)是ARM公司公布的总线标准,先进的AMBA规范定义了三种总线: AHB总线(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序 参考同一个时钟沿。 ASB总线(Advanced System Bus):用于连接高性能系统模块,它支持突发数据传输模式。 APB总线(A
20、dvance Peripheral Bus):是一个简单接口支持低性能的外围接口。 2、 ARM编程模型(2工作状态,7种模式,重点)ARM处理器的几大特点如下:小体积、低功耗、成本低、高性能;支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;大量使用寄存器,大多数数据操作都在寄存器中完成,指令执行速度更快;寻址方式灵活简单,执行效率高;指令长度固定; 全球众多的合作伙伴。当前ARM体系结构的扩充包括:Thumb:16位指令集,用以改善代码密度;DSP:用于DSP应用的算术运算指令集;Jazeller:允许直接执行Java代码的扩充。ARM7TDMI 处理器有两
21、种工作状态:*ARM - 32-bit, 按字排列的ARM指令集Thumb -16-bit, 按半字排列的Thumb指令集测试编译器属哪种模式下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式: short int x;char x0,x1;x=0x1122;x0=(char*)&x)0; /低地址单元x1=(char*)&x)1; /高地址单元若x0=0x11,则是大端; 若x0=0x22,则是小端.上面的程序还可以看出,数据寻址时,用的是低位字节的地址。 3、 ARM 指令集中常用指令(寻址方式、数据处理指令、加载/存储指令等)*4、 汇编语言与C/C+的混合编程(3种编程方式,
22、APCS,ATPCS)APCS(ARM Produce Call Standard)是ARM程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。 汇编语言与C/C+的混合编程通常有以下几种方式: 在C/C代码中嵌入汇编指令。 在汇编程序和C/C的程序之间进行变量的互访。 汇编程序、C/C程序间的相互调用。 在以上的几种混合编程技术中,必须遵守一定的调用规则,如物理寄存器的使用、参数的传递等。 一般情况: 程序的初始化部分用汇编语言完成, 然后用C/C完成主要的编程任务, 汇编
23、程序和C/C程序之间一般没有参数的传递,也没有频繁的相互调用,因此,整个程序的结构显得相对简单,容易理解。 5、嵌入式程序设计技巧(时间换空间,8个例子)变量定义参数传递循环条件以空间换时间数学方法解决问题使用位操作嵌入汇编五、硬件系统结构1、S3C2410存储系统组织(8个端口,确定宽度)S3C2410X有117个输入/输出端口。这些端口是:A口(GPA):23个输出口B口(GPB):11个输入/输出口C口(GPC):16个输入/输出口D口(GPD):16个输入/输出口E口(GPE):16个输入/输出口F口(GPF):8个输入/输出口G口(GPG):16个输入/输出口H口(GPH):11个输
24、入/输出口2、 S3C2410的外设管理3、I/O口的组织及一般应用(引脚)、4、 UART S3C2410 的UART(通用异步串行口)有三个独立的异步串行I/O 端口:UART0、UART1、UART2,每个串口都可以在中断和DMA 两种模式下进行收发。UART支持的最高波特率达230.4kbps。每个UART 包含:波特率发生器、接收器、发送器和控制单元。波特率发生器以PCLK或UCLK为时钟源。发送器和接收器各包含1个16 字节的FIFO 寄存器和移位寄存器。 S3C2410 的3个UART都有遵从1.0规范的红外传输功能, UART0、UART1有完整的握手信号,可以连接MODEM。
25、当发送数据的时候,数据先写到FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO 中。编写一程序,使用S3C2410X的UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/发FIFO,8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk为50MHz。(提示:主程序对UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行数据收发,标签清除中断请求标志和中断服务标志)解:(1)计算波特率除数:由公式: UBRDIVn=(int)(CLK/( f
26、B*16) 1 这里:Pclk=50MHz, f B = 125kb/s计算得: UBRDIVn=25 -1=24(2)UART2控制寄存器:线路控制寄存器: ULCON2=0 0 000 0 11=0x03含义:非红外、不校验、 1个停止位、 8个数据位控制寄存器: UCON2=0b 0 0 0 0 0 0 0 01 01=0x05含义:选Pclk、发/收中断脉冲请求、关闭接收超时中断、允许接收错误中断、不回送、不发送暂停信号、发/收用中断方式。FIFO控制寄存器:UFCON2=0b 10 01 0 0 0 1=0x91含义:发/收FIFO选8字节触发、保留位为0、不复位发/收FIFO、使能
27、FIFO。(3)引脚配置 需要设置TxD2、RxD2,它们对应GPH6、GPH7,在GPH配置寄存器GPHCON中的位置为:0b 1 0 1 0 方法:GPHCON= GPHCON&(0xF12)|(0xA12) (4)中断寄存器设置中断模式寄存器:INTMOD&=(115)INT_UART2位于第15位,将UART2设置为IRQ中断中断屏蔽寄存器:INTMSK&=(115) 中断优先级寄存器PRIORITY:不设置,使用固定优先级。子中断屏蔽寄存器:INTSUBMSK&=(76) INT_ERR2、INT_TXD2、INT_RXD2位于子中断屏蔽寄存器中的8、7、6位。(5)在中断服务程序中
28、对寄存器的操作清除中断标志寄存器相应位:SRCPND&=(115)清除中断服务寄存器相应位:INTPND&=(115)5、 时钟和功耗管理(解决方案 简述2410的功耗解决方案)时钟功能有两个锁相环MPLL、UPLL(Phase-Locked Loop )产生系统所需要的不同频率的时钟。(1)为CPU产生FCLK时钟(2)为AHB产生HCLK时钟使用HCLK的设备:中断控制器、存储器管理器、DMA控制器、LCD控制器、FLASH控制器、USB Host(不用PLL时)、总线控制器、片外设备。(3)为APB产生PCLK时钟使用PCLK的设备: 117个通用I/O口GPIO、ADC、5个定时器与4
29、个PWM、3个UART、2个SPI、IIC、USB Device (不用PLL时)、RTC、WDT、SD卡接口、IIS接口(4) 为USB (Host and Device)产生UCLK时钟(48MHz)2、电源管理功能具有4种电源管理模式:正常模式、慢时钟模式、空闲模式、掉电模式。 (1)正常模式: 1)锁相环工作;2)为CPU和所 有片内外设提供时钟。 此模式系统功耗最大。(2)慢时钟模式:锁相环不工作,CPU等直接使用原始时钟、或原始时钟的分频工作。此模式工作时钟频率低而使功耗低,并且锁相环不工作也使功耗降低。(3)空闲模式:停止为CPU提供时钟,CPU不工作(其外设均工作)。退出方法:
30、任何中断请求可唤醒CPU工作,退出空闲模式。(4)断电模式:时钟模块断电,除了唤醒电路之外所有部分均不供电。系统需分成两部分供电。此模式功耗最低。必须设置有外中断退出方法:用中断唤醒。(1)外部中断EINT0-15;(2)实时钟报警中断。如何降低2410的功耗在能够满足功能正常的前提下,尽可能选择低电压工作的CPU能够在总体功耗方面得到较好的效果。对于已经选定的CPU来讲,降低供电电压和工作频率,也是一条节省功率的可行之路。CPU采用内置Flash的方式如果可以通过选取合适的前后级芯片来避免Buffer的使用,对于能量来讲是一个很大的节约。我们可以通过控制CPU进入不同的模式来达到省电的目的关
31、闭不需要的外设控制器在适当的情况下使用DC-DC的电压转换线路,可以有效地节约能量6、程序实例六、实时操作系统1、实时操作系统概念(可重入,任务集翻转)RTOS的基本特征:高效的任务管理 1.支持多任务 2.优先级管理 3.任务调度:基于优先级的抢占式调度、时间片轮转调度的算法 4.支持快速而确定的上下文切换快速灵活的任务间通信 1.信号量:二进制、互斥、计数器 2.通信机制:消息队列、管道等高度的可剪裁性动态链接与部件增量加载快速有效的中断和异常事件处理优化的浮点支持动态内存管理可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中,或对全局变量予以保护。一个不可重入型函数的例子int Temp;Void swap (int *x,int*y)Temp=*x;*X=*Y;*y=Temp;使用以下技术之一即可使Swap()函数具有可重入性:l 把Temp定义为局部变量l调用Swap()函数之前关中断,调用后再开中断l用信号量禁
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026“梦工场”招商银行东莞分行寒假实习生招聘备考题库附答案详解(能力提升)
- 2026建信财产保险有限公司校园招聘20人备考题库附答案详解(模拟题)
- 北京市大兴区司法局招聘临时辅助用工1人备考题库附答案详解(突破训练)
- 2025浙江稠州商业银行嘉兴分行招聘备考题库附答案详解(考试直接用)
- 2026浦发银行宁波分行校园招聘备考题库有完整答案详解
- 2026招商银行合肥分行寒假实习生招募备考题库参考答案详解
- 2025年通榆县政协办公室综合保障中心公开选调事业编制工作人员备考题库(1人)及答案详解(必刷)
- 2025重庆长寿区城市管理综合行政执法支队派遣招聘2人备考题库含答案详解(达标题)
- 2025内蒙古呼和浩特市力信社会工作服务中心招聘备考题库及答案详解(基础+提升)
- 2025甘肃张掖高台县招聘社区工作者8人备考题库含答案详解
- 跨境电商3C手机壳选品运营项目各节点完成情况及核心成效展示
- 静脉输液的并发症
- 2026届上海市松江区高三上学期一模数学试卷及答案解析
- 企业股权收购操作方案范文及要点
- 智慧路灯系统定制开发合同
- 注册安全工程师课件
- 创伤急救模拟教学的跨学科协作模式研究
- 2026届新高考数学冲刺突破复习“三角函数”教学研究与高考备考策略-从基础到高阶的思维建构
- 动态无功补偿培训课件
- 质量保证体系文件模板
- 友谊美课件教学课件
评论
0/150
提交评论