版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统教案嵌入式软件系统设计1/5/2023嵌入式系统教案嵌入式软件系统设计12/28/2022提纲13245嵌入式软件开发过程ARM软件设计与代码分析ARM软件开发流程和开发工具67第六章嵌入式软件系统设计2提纲13245嵌入式软件开发过程ARM软件设计与代码分析AR嵌入式系统软件开发流程软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。嵌入式软件开发过程概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。详细设计:详细描述各个模块的实现方法与过程,模块间接口等问题,以作为编码人员的编码准则。编码3嵌入式系统软件开发流程软件需求分析:确定设计任务和目标,并提嵌入式系统的开发流程单元调试:编码完成后,对各个模块进行单元调试,以保证模块正常工作。嵌入式软件开发过程集成调试4嵌入式系统的开发流程单元调试:编码完成后,对各个模块进行单元常用调试方法软件仿真驻留监控程序硬件要求高,一般在硬件稳定之后进行需要占用目标板上的一部分资源不能对程序的全速运行进行完全仿真JTAG仿真器完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口仿真效果更加接近于目标硬件在线仿真器ARM软件开发流程和开发工具5常用调试方法软件仿真ARM软件开发流程和开发工具5处理器的选择处理性能
技术指标
功耗
操作系统和软件支持工具的选择
是否内置调试工具
ARM软件开发流程和开发工具6处理器的选择处理性能ARM软件开发流程和开发工具6操作系统和软件支持工具的选择
如果用户希望使用WindowsCE、Linux等操作系统,就需要选择ARM720T以上带有MMU(MemoryManagementUnit)功能的ARM芯片。ARM720T、ARM920T、ARM922T、ARM946T、Strong-ARM都带有MMU功能。而ARM7TDMI则没有MMU,不支持WindowsCE和Linux,但目前有uCLinux以及uC/OS-II等不需要MMU支持的操作系统可运行于ARM7TDMI硬件平台之上。ARM软件开发流程和开发工具7操作系统和软件支持工具的选择如果用户希望使用Windows操作系统和软件支持工具的选择
如果决定采用Linux、WindowsCE、vxWorks等操作系统时,在选择处理器时应该尽量选择该操作系统已经支持的处理器,这样可以大大加快开发进度,降低难度。选择不同的操作系统,其软件开发过程和调试手段各不相同,你的选择方案是否能够提供各个开发阶段(包括bootloader开发、操作系统移植、驱动开发和应用开发)所需的软件支持工具也是一个必须考虑的因素。
ARM软件开发流程和开发工具8操作系统和软件支持工具的选择如果决定采用Linux、Win硬件驱动程序的调试如果硬件平台是自行设计的,必须首先对硬件进行调试,硬件调试成功是进行操作系统移植和应用程序开发的一个基本前提。这个过程通常是通过编写一些简单的测试程序直接驱动硬件以验证硬件是否正确,这些程序可以基于操作系统进行编程,也可以不使用操作系统,而且后一种方法来得更加简单,调试也更方便和快捷。ARM软件开发流程和开发工具9硬件驱动程序的调试如果硬件平台是自行设计的,必须首先对硬件进操作系统的选择和移植μC/OS-IILinux/uClinuxWindowsCEvxWorksARM软件开发流程和开发工具10操作系统的选择和移植μC/OS-IIARM软件开发流程和开μC/OS-II免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。它可以基于ROM运行(ROMable)、可裁减,具有高度移植性。μC/OS-II实时嵌入式内核在工业控制、数据采集等领域应用广泛。但μC/OS-II内核不支持文件系统、网络协议等功能,而且没有提供统一的硬件驱动程序接口和开发工具链,在复杂应用中需要考虑内核以外功能的实现难易程度。ARM软件开发流程和开发工具11μC/OS-II免费公开源代码、结构小巧、具有可剥夺实时内μC/OS-II在μC/OS-II开发中,内核、驱动程序和应用程序都是集中编译,μC/OS-II编译以后的二进制代码中既包含内核代码,也包含驱动程序和应用程序的代码。μC/OS-II没有提供统一的开发工具链,μC/OS-II程序的编译应该采用支持所选处理器的编译器。对于ARM处理器,可以在Windows环境中使用ADS1.2、ADTIDE中编译μC/OS-II,也可以在Linux环境中使用GNUGCC编译μC/OS-II。ARM软件开发流程和开发工具12μC/OS-II在μC/OS-II开发中,内核、驱动程序和Linux/uClinuxLinux/uClinux是对于有MMU和没有MMU的处理器的Linux解决方案。Linux/uClinux提供强大的文件系统、网络功能、GUI等软件模组支持,而且这些功能都是可以裁减的,同时它还提供了标准的驱动程序接口和软件开发接口,便于用户编程和程序维护。Linux/uClinux自身具备一整套工具链(GNUGCC),包括编译和调试工具,用户可以自行建立嵌入式系统的开发环境和交叉运行环境。ARM软件开发流程和开发工具13Linux/uClinuxLinux/uClinux是对于Linux/uClinux对于ARM处理器,Linux/uClinux内核、驱动程序以及应用程序的编译都在Linux环境中使用GNUGCC完成。对于内核和驱动程序的调试通常借助于运行于Linux/uClinux之前的bootloader来完成,只有在很少的情况下需要借助在线仿真器完成。对于应用程序的调试则可以完全抛弃在线仿真器,使用GDB完成。ARM软件开发流程和开发工具14Linux/uClinux对于ARM处理器,Linux/uWindowsCEWindowsCE是Windows界面在嵌入式处理器中的实现,它提供了友好的人机交互界面和强大的二次开发功能。WindowsCE包括四大基本模块,它们提供了操作系统的关键特性,分别是:内核(Kernel)模块、对象存储(ObjectStore)模块、GWES(用户、应用程序和操作系统之间的图形用户界面)模块和通信(Communication)模块。ARM软件开发流程和开发工具15WindowsCEWindowsCE是Windows界面WindowsCEWindowsCE拥有完善的软件支持开发工具,WindowsCE的核心移植和驱动开发使用专门的操作系统定制工具:WindowsCEPlatformBuilder(简称PB)。而应用程序的开发则有嵌入式开发工具包EmbeddedVisualTools,包括EmbeddedVisualC++(简称EVC)和EmbeddedVisualBasic(简称EVB)等。同时EmbeddedVisualTools下还可以进行部分驱动程序的开发。同时在WindowsCE中还提供了用于WindowsCE开发的bootloader:EBOOT。
ARM软件开发流程和开发工具16WindowsCEWindowsCE拥有完善的软件支持开vxWorksVxWorks是专门为实时嵌入式系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能的屏蔽了不同CPU之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于VxWorks操作系统的应用程序可以在不同CPU平台上轻松移植。ARM软件开发流程和开发工具17vxWorksVxWorks是专门为实时嵌入式系统设计开发vxWorksVxWorks包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。TornadoII是为开发VxWorks应用系统提供的集成开发环境,TornadoII中包含的工程管理软件,可以将用户自己的代码与VxWorks的核心有效的组合起来,可以按用户的需要裁剪配置VxWorks内核。
ARM软件开发流程和开发工具18vxWorksVxWorks包括了进程管理、存储管理、设备ARM主流开发工具Windows操作系统ARMADS/SDT+调试器GNU+Cygwin+调试器ARMSDT+简易电缆Linux操作系统GNU+GDBARM软件开发流程和开发工具19ARM主流开发工具Windows操作系统ARM软件开发流程和ARM嵌入式开发模式(ARMADS/SDT+调试器)ARM软件开发流程和开发工具20ARM嵌入式开发模式(ARMADS/SDT+调试器)ADS与Multi-ICE
ARMADS全称为ARMDeveloperSuite,是ARM公司推出的用于ARM程序设计、开发和调试的集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。ADS由命令行开发工具,ARM运行时库,图形化集成开发环境(CodeWarrior和AXD),实用程序和支持软件组成。ARM软件开发流程和开发工具21ADS与Multi-ICEARMADS全称为ARMDeADS命令行开发工具
ARMC(C++)编译器ARM汇编器(armasm)ARM链接器(armlink)符号调试器(armsd)ARM软件开发流程和开发工具22ADS命令行开发工具ARMC(C++)编译器ARM软件ARM运行时库ANSIC函数库:(armlib)C++函数库:ARM软件开发流程和开发工具23ARM运行时库ANSIC函数库:(armlib)ARM软图形化集成开发环境(CodeWarrior和AXD)
CodeWarriorforARM
ADS调试器实用程序fromELF
armar
Flashdownloader
支持的软件ARMulatorARM软件开发流程和开发工具24图形化集成开发环境(CodeWarrior和AXD)CoADTforARM集成开发系统ARM软件开发工具-ADTIDE简介25ADTforARM集成开发系统ARM软件开发工具-ADTADT1000EmulatorforARMARM软件开发工具-ADTIDE简介
26ADT1000EmulatorforARMARM软件ADT1000EmulatorforARMARM软件开发工具-ADTIDE简介
ADTEmulatorforARM是连接主机核目标机之间的硬件设备,它实现ADTIDEforARM与目标机之间的连接。它具有如下特征:支持ARM核CPU非插入式调试,无需目标存储器,不占用目标系统的任何端口2.5V/3.3V/5V兼容电平接口支持标准的14/20针JTAG接口运行状态指示与主机之间通过并口连接下载速度达到25Kbytes/S27ADT1000EmulatorforARMARM软件ADTIDEforARMARM软件开发工具-ADTIDE简介
28ADTIDEforARMARM软件开发工具-ADTIADTIDEforARM主要特征-可视化编程环境ARM软件开发工具-ADTIDE简介
支持ARM7、ARM9、SecurCore等。运行于Windows98、NT、2000、XP等平台。中文、英文版本支持可视化的源码编辑和工程管理功能界面友好,使用方便:类似MSVisualStudio的用户界面,支持打印功能,支持文件内查找功能和FindinFiles功能29ADTIDEforARM主要特征-可视化编程环境AADTIDEforARM主要特征-可视化编程环境ARM软件开发工具-ADTIDE简介
工程管理器:ADTIDE提供图形化的工程管理工具,实现文件级、文件目录级、工程级的多级编译连接选项管理以及工程级的调试参数管理源码编辑器:支持标准的文本编辑功能,支持C语言、汇编语言语法高亮显示辅助编辑工具:提供一系列辅助编辑工具,方便开发人员。包括:多剪贴板工具、代码模板工具、头文件和源文件切换工具、注释工具、符号配对书写工具等多种辅助编辑工具。30ADTIDEforARM主要特征-可视化编程环境AADTIDEforARM主要特征-交叉编译功能ARM软件开发工具-ADTIDE简介
支持开发语言:ANSIC;EmbeddedC++;汇编语言编译工具:使用著名优秀自由软件GNU的GCC交叉编译工具,并经过优化和严格测试,支持C语言、汇编语言等编译参数设置:完全图形界面方式的编译参数设置,提供可视化的设置功能。支持工程级、文件目录级、文件级编译参数设置31ADTIDEforARM主要特征-交叉编译功能ARADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
同时提供了图形和命令行两种调试方式程序的单步执行程序下载存储区下载和上载功能。工程级调试参数管理支持源程序、反汇编程序和混合窗口显示,支持ARM/THUMB方式显示具有与MSVisualStudio类似的调试菜单功能:Go,Stop,Reset,Restart,Stepinto,Stepover,Stepout,RuntoCursor等丰富的示例程序32ADTIDEforARM主要特征-调试功能ARM软ADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
断点功能:支持软件断点和硬件断点,实现断点设置、断点屏蔽、断点取消、断点列表等功能变量监视功能:随程序运行同步更新变量,即时修改变量值,可设置自动/手动刷新方式、十进制/十六进制显示ARM各种模式的寄存器即时查看与修改,当前模式指示,寄存器值修改时红色突显存储器查看与修改,可设置自动/手动刷新方式、字节/双字节/四字节显示、大/小端方式显示,存储器值修改时红色突显33ADTIDEforARM主要特征-调试功能ARM软ADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
函数堆栈显示,可设置自动/手动刷新方式、十进制/十六进制显示、参数值显示,参数类型显示板上寄存器(OnBoardRegister)的查看和修改,可以查看支持CPU的所有板上寄存器的具体意义、当前值、各个位的意义,可设置自动/手动刷新方式、二进制/十进制/十六进制显示、大/小端方式显示,支持十进制/十六进制方式修改寄存器值,寄存器值修改时红色突显。flash在线编程器,支持对多种flash芯片的空白检查、擦除、编程、校验等操作,支持单一操作和自动操作两种操作方式,支持8/16/32位flash访问宽度,支持多片flash同时编程,编程速度达15Kbytes/s。提供统一的flash编程接口,可以方便地添加flash编程方案。34ADTIDEforARM主要特征-调试功能ARM软ADTIDEforARMARM软件开发工具-ADTIDE简介
ADTIDE(Arm7Lpt、Arm9Lpt、SoftSim、Arm7Simple)用户手册、编程指南丰富例程35ADTIDEforARMARM软件开发工具-ADTI多版本支持ARM软件开发工具-ADTIDE简介
软件仿真版本ARM7版本ARM9版本简易仿真版本36多版本支持ARM软件开发工具-ADTIDE简介
多工程管理ARM软件开发工具-ADTIDE简介
工程当前活动工程37多工程管理ARM软件开发工具-ADTIDE简介
可视化编辑器ARM软件开发工具-ADTIDE简介
编辑菜单语法高亮编辑器辅助编辑工具条书签38可视化编辑器ARM软件开发工具-ADTIDE简介
GCC交叉编译ARM软件开发工具-ADTIDE简介编译菜单编译工具条编译结果输出错误定位39GCC交叉编译ARM软件开发工具-ADTIDE简介编译菜单编译器设置ARM软件开发工具-ADTIDE简介多配置管理多工程设管理多参数配置40编译器设置ARM软件开发工具-ADTIDE简介多配置管理多汇编器设置ARM软件开发工具-ADTIDE简介多配置管理多工程设管理多参数配置41汇编器设置ARM软件开发工具-ADTIDE简介多配置管理多连接器设置ARM软件开发工具-ADTIDE简介多配置管理多工程设管理多参数配置42连接器设置ARM软件开发工具-ADTIDE简介多配置管理多调试功能ARM软件开发工具-ADTIDE简介
调试菜单调试工具条命令行调试窗口43调试功能ARM软件开发工具-ADTIDE简介
多种调试模式ARM软件开发工具-ADTIDE简介
源码模式混合模式汇编模式44多种调试模式ARM软件开发工具-ADTIDE简介
断点ARM软件开发工具-ADTIDE简介
断点列表断点45断点ARM软件开发工具-ADTIDE简介
存储器窗口ARM软件开发工具-ADTIDE简介字模式半字模式字节模式修改凸显标记46存储器窗口ARM软件开发工具-ADTIDE简介字模式半字模存储区上载下载功能ARM软件开发工具-ADTIDE简介
存储区上载存储区下载47存储区上载下载功能ARM软件开发工具-ADTIDE简介寄存器观察窗口ARM软件开发工具-ADTIDE简介
多模式寄存器显示修改凸显标记48寄存器观察窗口ARM软件开发工具-ADTIDE简介
函数调用栈窗口ARM软件开发工具-ADTIDE简介
函数调用栈49函数调用栈窗口ARM软件开发工具-ADTIDE简介
变量观察窗口ARM软件开发工具-ADTIDE简介
局部变量全局变量多个观察窗口50变量观察窗口ARM软件开发工具-ADTIDE简介
命令窗口ARM软件开发工具-ADTIDE简介
51命令窗口ARM软件开发工具-ADTIDE简介
单步调试-STEPINTOARM软件开发工具-ADTIDE简介52单步调试-STEPINTOARM软件开发工具-ADT单步调试-STEPOVERARM软件开发工具-ADTIDE简介
53单步调试-STEPOVERARM软件开发工具-ADT单步调试-STEPOUTARM软件开发工具-ADTIDE简介
54单步调试-STEPOUTARM软件开发工具-ADTI单步调试-RUNTOCURSORARM软件开发工具-ADTIDE简介
55单步调试-RUNTOCURSORARM软件开发工具-板上寄存器ARM软件开发工具-ADTIDE简介寄存器组寄存器寄存器位域热点描述信息修改凸显标记56板上寄存器ARM软件开发工具-ADTIDE简介寄存器组寄存板上寄存器ARM软件开发工具-ADTIDE简介57板上寄存器ARM软件开发工具-ADTIDE简介57FLASH在线编程器ARM软件开发工具-ADTIDE简介
58FLASH在线编程器ARM软件开发工具-ADTIDE简介工具菜单ARM软件开发工具-ADTIDE简介
可自定制59工具菜单ARM软件开发工具-ADTIDE简介
在线帮助ARM软件开发工具-ADTIDE简介
60在线帮助ARM软件开发工具-ADTIDE简介
嵌入式软件开发无操作系统的软件开发启动代码应用程序基于操作系统的软件开发bootloader操作系统移植BSP板级支持包应用程序开发ARM软件设计与代码分析61嵌入式软件开发无操作系统的软件开发ARM软件设计与代码分析6启动代码功能硬件初始化引导C代码特征通常用汇编语言编写程序复位运行入口点代码量非常小程序流程设置中断、异常入口关中断硬件寄存器初始化(GPIO配置、总线配置、PLL时钟)初始化栈指针数据区初始化C入口函数调用BLMainARM软件设计与代码分析62启动代码功能程序流程ARM软件设计与代码分析62应用程序(无操作系统)功能硬件驱动应用特征通常用C语言或者嵌入式汇编语言编写程序较复杂,代码量较大ARM软件设计与代码分析63应用程序(无操作系统)功能ARM软件设计与代码分析63bootloader功能硬件初始化引导操作系统下载程序(串口、网口、USB)烧写flash特征程序复位运行入口点通常用汇编语言+C语言编写代码量较小ARM软件设计与代码分析64bootloader功能ARM软件设计与代码分析64嵌入式操作系统移植LinuxWindowsCEuC/OSIIuClinuxNucleusARM软件设计与代码分析65嵌入式操作系统移植LinuxARM软件设计与代码分析65BSP板级支持包功能为应用程序提供统一的硬件操作接口特征高度硬件相关高度依赖于具体硬件平台各种操作系统各异ARM软件设计与代码分析66BSP板级支持包功能ARM软件设计与代码分析66应用程序开发(操作系统)功能GUI图形、人机交互控制算法特征硬件依赖程度小部分可仿真调试各种操作系统各异ARM软件设计与代码分析67应用程序开发(操作系统)功能ARM软件设计与代码分析67嵌入式软件设计和调试流程编辑创建工程添加文件、编写程序汇编语言加C语言编译配置编译、汇编和连接参数编写连接脚本文件编译调试连接调试器下载程序运行、调试固化通过仿真器烧写flash专用或通用的编程器通过bootloader烧写flashARM软件设计与代码分析68嵌入式软件设计和调试流程编辑调试ARM软件设计与代码分析68交叉编译GNU交叉编译编译.carm-elf-gcc汇编.Sarm-elf-gas连接.oarm-elf-ld操作文件汇编文件.SC文件.c链接脚本文件ldscript库文件.o.lib.a生成调试格式文件.elfDWARF-1DWARF-2生成bin文件elf2binarm-elf-objcopyARM软件设计与代码分析69交叉编译GNU交叉编译生成调试格式文件.elfARM软件设计链接脚本段Text段rodata段data段bss段符号Image_RO_Limit
Image_RW_BaseImage_ZI_BaseImage_ZI_LimitGCC库专用调试信息ARM软件设计与代码分析70链接脚本段GCC库专用ARM软件设计与代码分析70链接脚本示例程序在SDRAM中运行程序在FLASH中运行ARM软件设计与代码分析71链接脚本示例程序在SDRAM中运行程序在FLASH中运行ARGCC库GCC库标准C函数库lib.a-lc标准数学函数库libm.a-lm标准函数库的支持库libg.a-lgGCC的支持库libgcc.a-lgcc链接排列顺序-lm–lc–lgcc-lgARM软件设计与代码分析72GCC库GCC库ARM软件设计与代码分析72ARM9-2440启动代码分析ARM软件设计与代码分析在基于ARM920Tcore的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行,因此在这个地址处安排的通常就是系统的启动代码。它通常也是BootLoader程序的一部分,可以在启动代码基础上编写BootLoader。用汇编语言编写。启动代码是在复位后运行其它程序之前运行的一段小程序。通过它,初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用C函数准备好正确的环境。73ARM9-2440启动代码分析ARM软件设计与代码分析在基于启动代码的移植和修改ARM软件设计与代码分析启动代码除了依赖于CPU的体系结构外,实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的启动代码也能运行在另一块板子上,也还是需要作一些必要的修改。74启动代码的移植和修改ARM软件设计与代码分析启动代码除了依赖启动代码流程图启动代码的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用C函数。注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;ARM软件设计与代码分析75启动代码流程图启动代码的功能:RAM初始化,设置各个部件的时设置异常跳转表复位异常直接跳转到ResetHandler处,它是相对跳转,位置无关。ARM软件设计与代码分析76设置异常跳转表复位异常直接跳转到ResetHandler处,关闭看门狗设置S3C2440WTCON寄存器必须设置0x01e000000x01d30000ARM软件设计与代码分析77关闭看门狗设置S3C2440WTCON寄存器0x01e00设置中断模式并禁止中断设置S3C2440中断寄存器设置所有一级中断源与二级中断源为不可用状态ARM软件设计与代码分析78设置中断模式并禁止中断设置S3C2440中断寄存器ARM软件配置存储器控制寄存器宽度ARM软件设计与代码分析0x01e00000配置值79配置存储器控制寄存器宽度ARM软件设计与代码分析0x01e0堆栈初始化ARM软件设计与代码分析80堆栈初始化ARM软件设计与代码分析80C代码初始化ARM软件设计与代码分析拷贝RW数据段ZI段清零跳转到Main函数处执行81C代码初始化ARM软件设计与代码分析拷贝RW数据段ZI段清零ARM9-2440BOOTLOADER分析ARM软件设计与代码分析BootLoader是在启动代码的基础之上,通常启动代码包含于BootLoader之中BootLoader常用于引导操作系统或者应用程序BootLoader可以包含一些简单的调试手段ARM9-2440使用通用的u-boot82ARM9-2440BOOTLOADER分析ARM软件设计与u-boot简介ARM软件设计与代码分析u-boot是由德国DENX小组开发的交叉平台BootLoader,其全称为“universalBootLoader”。u-boot的开发目标是支持尽可能多的嵌入式处理器和嵌入式操作系统。它提供数百种嵌入式开发板和各种CPU,包括PowerPC、ARM、Xscale、MIPS、Coldfire、NIOS、Microblaze和x86等,同时它除了支持Linux系统的引导外,还支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等多种嵌入式操作系统的引导。83u-boot简介ARM软件设计与代码分析u-boot是由德国u-boot简介ARM软件设计与代码分析u-boot的用户接口类似于Linux的shell界面,通过串口连接以后,用户可以交互式的输入命令和看到结果,u-boot的启动界面如下所示:U-Boot1.1.1(Sep62004-12:12:06)U-Bootcode:33F80000->33F9CED0BSS:->33FA116CRAMConfiguration:Bank#0:3000000064MBFlash:32MBIn:serialOut:serialErr:serialHitanykeytostopautoboot:0JX2410#84u-boot简介ARM软件设计与代码分析u-boot的用户接BootLoader的基本概念BootLoader是系统加电后运行的第一段软件代码。嵌入式系统中,整个系统的加载启动任务完全由BootLoader来完成。比如在一个基于ARM920Tcore的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。简单地说,BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。通常,BootLoader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的BootLoader是很困难的。ARM软件设计与代码分析85BootLoader的基本概念BootLoader是系统加电BootLoader的移植和修改BootLoader除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,也还是需要作一些必要的修改。ARM软件设计与代码分析86BootLoader的移植和修改BootLoader除了依BootLoader的安装系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C2440在复位时都从地址0x00000000取它的第一条指令。嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。也就是说对于基于S3C2440的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如FLASH。ARM软件设计与代码分析87BootLoader的安装系统加电或复位后,所有的CPU通用来控制BootLoader的设备或机制串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader程序在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。ARM软件设计与代码分析88用来控制BootLoader的设备或机制串口通讯是最简单BootLoader的操作模式启动加载模式:这种模式也称为"自主"(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的固态存储设备中。BootLoader的这种模式通常在系统更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。在uboot中可以通过修改环境变量实现自主模式。ARM软件设计与代码分析89BootLoader的操作模式启动加载模式:这种模式也称BootLoader与主机间文件传输的通信设备及协议最常见的情况就是,目标机上的BootLoader通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmodem/ymodem/zmodem协议以及在以太网上采用TFTP协议。ARM软件设计与代码分析90BootLoader与主机间文件传输的通信设备及协议最常见的BootLoader的主要任务与典型结构框架从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。大多数BootLoader都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。ARM软件设计与代码分析91BootLoader的主要任务与典型结构框架从操作系统的角度BootLoader的主要任务与典型结构框架BootLoader的stage1通常包括以下步骤 为加载BootLoader的stage2准备RAM空间拷贝BootLoader的stage2到RAM空间中设置好堆栈跳转到stage2的C入口点BootLoader的stage2通常包括以下步骤初始化本阶段要使用到的硬件设备调用应用程序或启动内核ARM软件设计与代码分析92BootLoader的主要任务与典型结构框架BootLoadStage1初始化流程图stage1的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用Stage2。注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;ARM软件设计与代码分析93Stage1初始化流程图stage1的功能:RAM初始Stage2流程图stage2的功能: 初始化串口,显示菜单,通过控制台获取用户输入,并执行相应的命令操作。ARM软件设计与代码分析94Stage2流程图stage2的功能: 初始化串口,显示板级支持包ARM软件设计与代码分析BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。95板级支持包ARM软件设计与代码分析BSP(板级支持包)是介于板级支持包的特点ARM软件设计与代码分析硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。96板级支持包的特点ARM软件设计与代码分析硬件相关性:因为嵌入板级支持包的功能ARM软件设计与代码分析97板级支持包的功能ARM软件设计与代码分析97板级支持包的功能ARM软件设计与代码分析嵌入式系统初始化片级初始化板级初始化系统级初始化硬件相关的设备驱动程序和BootLoader存在一定的重叠98板级支持包的功能ARM软件设计与代码分析嵌入式系统初始化和B系统级初始化ARM软件设计与代码分析这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口。99系统级初始化ARM软件设计与代码分析这是一个以软件初始化为主硬件相关的驱动程序ARM软件设计与代码分析与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。100硬件相关的驱动程序ARM软件设计与代码分析与初始化过程相反,ARM9-2440应用代码设计及中断处理ARM软件设计与代码分析连接脚本101ARM9-2440应用代码设计及中断处理ARM软件设计与代码ARM9-2440应用代码中断向量ARM软件设计与代码分析起始地址0x30000000除复位异常外,其余异常入口地址由FLASH跳转得到102ARM9-2440应用代码中断向量ARM软件设计与代码分析起ARM9-2440中断处理流程执行0x18处指令:LDRpc,=0x03000018,由u-boot控制执行0x03000018处指令:HandlerIRQ,2410init.s执行HandlerIRQ,2410init.s执行HandleIRQ处保存的中断分发例程,2410init.s中初始化为IsrIRQARM软件设计与代码分析根据INTOFFSET的值从中断向量表中取出中断服务函数地址R8中为产生了中断的中断源的中断服务函数地址跳转到中断服务函数地址处运行103ARM9-2440中断处理流程执行0x18处指令:LDRp中断向量表ARM软件设计与代码分析从_ISR_STARTADDRESS+0x20开始每四个字节表示一个中断源的中断服务函数地址104中断向量表ARM软件设计与代码分析从_ISR_STARTAD注册中断服务函数并使能中断函数实现
/*请求中断*/ Irq_Request(IRQ_EINT2,eint2_isr); Irq_Request(IRQ_EINT3,eint3_isr); /*使能中断*/ Irq_Enable(IRQ_EINT2);Irq_Enable(IRQ_EINT3);ARM软件设计与代码分析注册中断服务函数,即将eint2_isr中断服务函数的地址赋值到中断向量表中。开启中断源,必须在注册中断服务函数完成后进行。105注册中断服务函数并使能中断函数实现ARM软件设计与代码分析用C代码编写的中断服务函数函数实现
ARM软件设计与代码分析必须声明为中断服务函数清除中断标记处理中断106用C代码编写的中断服务函数函数实现ARM软件设计与代码分析嵌入式系统教案嵌入式软件系统设计1/5/2023嵌入式系统教案嵌入式软件系统设计12/28/2022提纲13245嵌入式软件开发过程ARM软件设计与代码分析ARM软件开发流程和开发工具67第六章嵌入式软件系统设计108提纲13245嵌入式软件开发过程ARM软件设计与代码分析AR嵌入式系统软件开发流程软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。嵌入式软件开发过程概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。详细设计:详细描述各个模块的实现方法与过程,模块间接口等问题,以作为编码人员的编码准则。编码109嵌入式系统软件开发流程软件需求分析:确定设计任务和目标,并提嵌入式系统的开发流程单元调试:编码完成后,对各个模块进行单元调试,以保证模块正常工作。嵌入式软件开发过程集成调试110嵌入式系统的开发流程单元调试:编码完成后,对各个模块进行单元常用调试方法软件仿真驻留监控程序硬件要求高,一般在硬件稳定之后进行需要占用目标板上的一部分资源不能对程序的全速运行进行完全仿真JTAG仿真器完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口仿真效果更加接近于目标硬件在线仿真器ARM软件开发流程和开发工具111常用调试方法软件仿真ARM软件开发流程和开发工具5处理器的选择处理性能
技术指标
功耗
操作系统和软件支持工具的选择
是否内置调试工具
ARM软件开发流程和开发工具112处理器的选择处理性能ARM软件开发流程和开发工具6操作系统和软件支持工具的选择
如果用户希望使用WindowsCE、Linux等操作系统,就需要选择ARM720T以上带有MMU(MemoryManagementUnit)功能的ARM芯片。ARM720T、ARM920T、ARM922T、ARM946T、Strong-ARM都带有MMU功能。而ARM7TDMI则没有MMU,不支持WindowsCE和Linux,但目前有uCLinux以及uC/OS-II等不需要MMU支持的操作系统可运行于ARM7TDMI硬件平台之上。ARM软件开发流程和开发工具113操作系统和软件支持工具的选择如果用户希望使用Windows操作系统和软件支持工具的选择
如果决定采用Linux、WindowsCE、vxWorks等操作系统时,在选择处理器时应该尽量选择该操作系统已经支持的处理器,这样可以大大加快开发进度,降低难度。选择不同的操作系统,其软件开发过程和调试手段各不相同,你的选择方案是否能够提供各个开发阶段(包括bootloader开发、操作系统移植、驱动开发和应用开发)所需的软件支持工具也是一个必须考虑的因素。
ARM软件开发流程和开发工具114操作系统和软件支持工具的选择如果决定采用Linux、Win硬件驱动程序的调试如果硬件平台是自行设计的,必须首先对硬件进行调试,硬件调试成功是进行操作系统移植和应用程序开发的一个基本前提。这个过程通常是通过编写一些简单的测试程序直接驱动硬件以验证硬件是否正确,这些程序可以基于操作系统进行编程,也可以不使用操作系统,而且后一种方法来得更加简单,调试也更方便和快捷。ARM软件开发流程和开发工具115硬件驱动程序的调试如果硬件平台是自行设计的,必须首先对硬件进操作系统的选择和移植μC/OS-IILinux/uClinuxWindowsCEvxWorksARM软件开发流程和开发工具116操作系统的选择和移植μC/OS-IIARM软件开发流程和开μC/OS-II免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。它可以基于ROM运行(ROMable)、可裁减,具有高度移植性。μC/OS-II实时嵌入式内核在工业控制、数据采集等领域应用广泛。但μC/OS-II内核不支持文件系统、网络协议等功能,而且没有提供统一的硬件驱动程序接口和开发工具链,在复杂应用中需要考虑内核以外功能的实现难易程度。ARM软件开发流程和开发工具117μC/OS-II免费公开源代码、结构小巧、具有可剥夺实时内μC/OS-II在μC/OS-II开发中,内核、驱动程序和应用程序都是集中编译,μC/OS-II编译以后的二进制代码中既包含内核代码,也包含驱动程序和应用程序的代码。μC/OS-II没有提供统一的开发工具链,μC/OS-II程序的编译应该采用支持所选处理器的编译器。对于ARM处理器,可以在Windows环境中使用ADS1.2、ADTIDE中编译μC/OS-II,也可以在Linux环境中使用GNUGCC编译μC/OS-II。ARM软件开发流程和开发工具118μC/OS-II在μC/OS-II开发中,内核、驱动程序和Linux/uClinuxLinux/uClinux是对于有MMU和没有MMU的处理器的Linux解决方案。Linux/uClinux提供强大的文件系统、网络功能、GUI等软件模组支持,而且这些功能都是可以裁减的,同时它还提供了标准的驱动程序接口和软件开发接口,便于用户编程和程序维护。Linux/uClinux自身具备一整套工具链(GNUGCC),包括编译和调试工具,用户可以自行建立嵌入式系统的开发环境和交叉运行环境。ARM软件开发流程和开发工具119Linux/uClinuxLinux/uClinux是对于Linux/uClinux对于ARM处理器,Linux/uClinux内核、驱动程序以及应用程序的编译都在Linux环境中使用GNUGCC完成。对于内核和驱动程序的调试通常借助于运行于Linux/uClinux之前的bootloader来完成,只有在很少的情况下需要借助在线仿真器完成。对于应用程序的调试则可以完全抛弃在线仿真器,使用GDB完成。ARM软件开发流程和开发工具120Linux/uClinux对于ARM处理器,Linux/uWindowsCEWindowsCE是Windows界面在嵌入式处理器中的实现,它提供了友好的人机交互界面和强大的二次开发功能。WindowsCE包括四大基本模块,它们提供了操作系统的关键特性,分别是:内核(Kernel)模块、对象存储(ObjectStore)模块、GWES(用户、应用程序和操作系统之间的图形用户界面)模块和通信(Communication)模块。ARM软件开发流程和开发工具121WindowsCEWindowsCE是Windows界面WindowsCEWindowsCE拥有完善的软件支持开发工具,WindowsCE的核心移植和驱动开发使用专门的操作系统定制工具:WindowsCEPlatformBuilder(简称PB)。而应用程序的开发则有嵌入式开发工具包EmbeddedVisualTools,包括EmbeddedVisualC++(简称EVC)和EmbeddedVisualBasic(简称EVB)等。同时EmbeddedVisualTools下还可以进行部分驱动程序的开发。同时在WindowsCE中还提供了用于WindowsCE开发的bootloader:EBOOT。
ARM软件开发流程和开发工具122WindowsCEWindowsCE拥有完善的软件支持开vxWorksVxWorks是专门为实时嵌入式系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能的屏蔽了不同CPU之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于VxWorks操作系统的应用程序可以在不同CPU平台上轻松移植。ARM软件开发流程和开发工具123vxWorksVxWorks是专门为实时嵌入式系统设计开发vxWorksVxWorks包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。TornadoII是为开发VxWorks应用系统提供的集成开发环境,TornadoII中包含的工程管理软件,可以将用户自己的代码与VxWorks的核心有效的组合起来,可以按用户的需要裁剪配置VxWorks内核。
ARM软件开发流程和开发工具124vxWorksVxWorks包括了进程管理、存储管理、设备ARM主流开发工具Windows操作系统ARMADS/SDT+调试器GNU+Cygwin+调试器ARMSDT+简易电缆Linux操作系统GNU+GDBARM软件开发流程和开发工具125ARM主流开发工具Windows操作系统ARM软件开发流程和ARM嵌入式开发模式(ARMADS/SDT+调试器)ARM软件开发流程和开发工具126ARM嵌入式开发模式(ARMADS/SDT+调试器)ADS与Multi-ICE
ARMADS全称为ARMDeveloperSuite,是ARM公司推出的用于ARM程序设计、开发和调试的集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。ADS由命令行开发工具,ARM运行时库,图形化集成开发环境(CodeWarrior和AXD),实用程序和支持软件组成。ARM软件开发流程和开发工具127ADS与Multi-ICEARMADS全称为ARMDeADS命令行开发工具
ARMC(C++)编译器ARM汇编器(armasm)ARM链接器(armlink)符号调试器(armsd)ARM软件开发流程和开发工具128ADS命令行开发工具ARMC(C++)编译器ARM软件ARM运行时库ANSIC函数库:(armlib)C++函数库:ARM软件开发流程和开发工具129ARM运行时库ANSIC函数库:(armlib)ARM软图形化集成开发环境(CodeWarrior和AXD)
CodeWarriorforARM
ADS调试器实用程序fromELF
armar
Flashdownloader
支持的软件ARMulatorARM软件开发流程和开发工具130图形化集成开发环境(CodeWarrior和AXD)CoADTforARM集成开发系统ARM软件开发工具-ADTIDE简介131ADTforARM集成开发系统ARM软件开发工具-ADTADT1000EmulatorforARMARM软件开发工具-ADTIDE简介
132ADT1000EmulatorforARMARM软件ADT1000EmulatorforARMARM软件开发工具-ADTIDE简介
ADTEmulatorforARM是连接主机核目标机之间的硬件设备,它实现ADTIDEforARM与目标机之间的连接。它具有如下特征:支持ARM核CPU非插入式调试,无需目标存储器,不占用目标系统的任何端口2.5V/3.3V/5V兼容电平接口支持标准的14/20针JTAG接口运行状态指示与主机之间通过并口连接下载速度达到25Kbytes/S133ADT1000EmulatorforARMARM软件ADTIDEforARMARM软件开发工具-ADTIDE简介
134ADTIDEforARMARM软件开发工具-ADTIADTIDEforARM主要特征-可视化编程环境ARM软件开发工具-ADTIDE简介
支持ARM7、ARM9、SecurCore等。运行于Windows98、NT、2000、XP等平台。中文、英文版本支持可视化的源码编辑和工程管理功能界面友好,使用方便:类似MSVisualStudio的用户界面,支持打印功能,支持文件内查找功能和FindinFiles功能135ADTIDEforARM主要特征-可视化编程环境AADTIDEforARM主要特征-可视化编程环境ARM软件开发工具-ADTIDE简介
工程管理器:ADTIDE提供图形化的工程管理工具,实现文件级、文件目录级、工程级的多级编译连接选项管理以及工程级的调试参数管理源码编辑器:支持标准的文本编辑功能,支持C语言、汇编语言语法高亮显示辅助编辑工具:提供一系列辅助编辑工具,方便开发人员。包括:多剪贴板工具、代码模板工具、头文件和源文件切换工具、注释工具、符号配对书写工具等多种辅助编辑工具。136ADTIDEforARM主要特征-可视化编程环境AADTIDEforARM主要特征-交叉编译功能ARM软件开发工具-ADTIDE简介
支持开发语言:ANSIC;EmbeddedC++;汇编语言编译工具:使用著名优秀自由软件GNU的GCC交叉编译工具,并经过优化和严格测试,支持C语言、汇编语言等编译参数设置:完全图形界面方式的编译参数设置,提供可视化的设置功能。支持工程级、文件目录级、文件级编译参数设置137ADTIDEforARM主要特征-交叉编译功能ARADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
同时提供了图形和命令行两种调试方式程序的单步执行程序下载存储区下载和上载功能。工程级调试参数管理支持源程序、反汇编程序和混合窗口显示,支持ARM/THUMB方式显示具有与MSVisualStudio类似的调试菜单功能:Go,Stop,Reset,Restart,Stepinto,Stepover,Stepout,RuntoCursor等丰富的示例程序138ADTIDEforARM主要特征-调试功能ARM软ADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
断点功能:支持软件断点和硬件断点,实现断点设置、断点屏蔽、断点取消、断点列表等功能变量监视功能:随程序运行同步更新变量,即时修改变量值,可设置自动/手动刷新方式、十进制/十六进制显示ARM各种模式的寄存器即时查看与修改,当前模式指示,寄存器值修改时红色突显存储器查看与修改,可设置自动/手动刷新方式、字节/双字节/四字节显示、大/小端方式显示,存储器值修改时红色突显139ADTIDEforARM主要特征-调试功能ARM软ADTIDEforARM主要特征-调试功能ARM软件开发工具-ADTIDE简介
函数堆栈显示,可设置自动/手动刷新方式、十进制/十六进制显示、参数值显示,参数类型显示板上寄存器(OnBoardRegister)的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年回收站废品销售合同3篇
- 2024版公益活动策划委托合同3篇
- 2024年度体育赛事运营商务服务合同3篇
- 2024年度二手房自助交易电子签章法律效力合同3篇
- 2024年度文化艺术演出合同:某著名交响乐团中国巡演3篇
- 2024年水泥期货交易合同2篇
- 2024版主题餐厅转让及接手合同范本含员工培训协议2篇
- 2024年棉花合同条款-棉花种植基地棉花销售合同3篇
- 高薪出国劳务合同范例
- 车间厂房保养合同模板
- 提高患者满意度的导医接待工作方法
- 皮肤美容与整形技术的新进展
- 《柔性生产方式》课件
- 单位员工餐厅整体保障服务方案
- 中国旗袍课件
- 销售线索培训课件
- 北京市西城区2023-2024学年七年级上学期期末数学试题
- 提高肿瘤治疗前TNM分期评估率PDCA
- 2024年江苏省环保集团招聘笔试参考题库含答案解析
- 2023年山东工业技师学院教师招聘笔试参考题库(共500题)答案详解版
- 月嫂职业道德与礼仪培训服务
评论
0/150
提交评论