《武汉创维特ARM教学系统08嵌入式软件系统设计.ppt》由会员分享,可在线阅读,更多相关《武汉创维特ARM教学系统08嵌入式软件系统设计.ppt(98页珍藏版)》请在三一办公上搜索。
1、嵌入式系统教案,武汉创维特信息技术有限公司,2023/8/13,2,提纲,1,3,2,4,5,嵌入式软件开发过程,ARM软件设计与代码分析,ARM软件开发工具ADT IDE简介,6,7,第六章 嵌入式软件系统设计,3,嵌入式系统软件开发流程,软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。,嵌入式软件开发过程,概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。,详细设计:详细描述各个模块的实现方法与过程,模块间接口等问题,以作为编码人员的编码准则。,编码,4,嵌入式系统的开发流程,单元调试:编码完成后,
2、对各个模块进行单元调试,以保证模块正常工作。,嵌入式软件开发过程,集成调试,5,ARM主流开发工具,Windows操作系统ARM ADS/SDT+调试器GNU+Cygwin+调试器ARM SDT+简易电缆Linux操作系统GNU+GDB,ARM软件开发工具ADT IDE简介,6,常用调试方法,软件仿真驻留监控程序硬件要求高,一般在硬件稳定之后进行需要占用目标板上的一部分资源不能对程序的全速运行进行完全仿真JTAG仿真器完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口仿真效果更加接近于目标硬件在线仿真器,ARM软件开发工具ADT IDE简介,7,ADT for ARM集
3、成开发系统,ARM软件开发工具ADT IDE简介,8,ADT 1000 Emulator for ARM,ARM软件开发工具ADT IDE简介,9,ADT 1000 Emulator for ARM,ARM软件开发工具ADT IDE简介,ADT Emulator for ARM是连接主机核目标机之间的硬件设备,它实现ADT IDE for ARM与目标机之间的连接。,它具有如下特征:,支持ARM核CPU,非插入式调试,无需目标存储器,不占用目标系统的任何端口,2.5V/3.3V/5V兼容电平接口,支持标准的14/20针JTAG接口,运行状态指示,与主机之间通过并口连接,下载速度达到25Kbyt
4、es/S,10,ADT IDE for ARM,ARM软件开发工具ADT IDE简介,11,ADT IDE for ARM主要特征 可视化编程环境,ARM软件开发工具ADT IDE简介,支持ARM7、ARM9、SecurCore等。,运行于Windows98、NT、2000、XP等平台。,中文、英文版本支持,可视化的源码编辑和工程管理功能,界面友好,使用方便:类似MS Visual Studio的用户界面,支持打印功能,支持文件内查找功能和Find in Files功能,12,ADT IDE for ARM主要特征 可视化编程环境,ARM软件开发工具ADT IDE简介,工程管理器:ADT ID
5、E提供图形化的工程管理工具,实现文件级、文件目录级、工程级的多级编译连接选项管理以及工程级的调试参数管理,源码编辑器:支持标准的文本编辑功能,支持C语言、汇编语言语法高亮显示,辅助编辑工具:提供一系列辅助编辑工具,方便开发人员。包括:多剪贴板工具、代码模板工具、头文件和源文件切换工具、注释工具、符号配对书写工具等多种辅助编辑工具。,13,ADT IDE for ARM主要特征 交叉编译功能,ARM软件开发工具ADT IDE简介,支持开发语言:ANSI C;Embedded C+;汇编语言,编译工具:使用著名优秀自由软件GNU的GCC交叉编译工具,并经过优化和严格测试,支持C语言、汇编语言等,编
6、译参数设置:完全图形界面方式的编译参数设置,提供可视化的设置功能。支持工程级、文件目录级、文件级编译参数设置,14,ADT IDE for ARM主要特征 调试功能,ARM软件开发工具ADT IDE简介,同时提供了图形和命令行两种调试方式,程序的单步执行,程序下载,存储区下载和上载功能。,工程级调试参数管理,支持源程序、反汇编程序和混合窗口显示,支持ARM/THUMB方式显示,具有与MS Visual Studio类似的调试菜单功能:Go,Stop,Reset,Restart,Step into,Step over,Step out,Run to Cursor等,丰富的示例程序,15,ADT
7、IDE for ARM主要特征 调试功能,ARM软件开发工具ADT IDE简介,断点功能:支持软件断点和硬件断点,实现断点设置、断点屏蔽、断点取消、断点列表等功能,变量监视功能:随程序运行同步更新变量,即时修改变量值,可设置自动/手动刷新方式、十进制/十六进制显示,ARM各种模式的寄存器即时查看与修改,当前模式指示,寄存器值修改时红色突显,存储器查看与修改,可设置自动/手动刷新方式、字节/双字节/四字节显示、大/小端方式显示,存储器值修改时红色突显,16,ADT IDE for ARM主要特征 调试功能,ARM软件开发工具ADT IDE简介,函数堆栈显示,可设置自动/手动刷新方式、十进制/十六
8、进制显示、参数值显示,参数类型显示,板上寄存器(On Board Register)的查看和修改,可以查看支持CPU的所有板上寄存器的具体意义、当前值、各个位的意义,可设置自动/手动刷新方式、二进制/十进制/十六进制显示、大/小端方式显示,支持十进制/十六进制方式修改寄存器值,寄存器值修改时红色突显。,flash在线编程器,支持对多种flash芯片的空白检查、擦除、编程、校验等操作,支持单一操作和自动操作两种操作方式,支持8/16/32位flash访问宽度,支持多片flash同时编程,编程速度达15Kbytes/s。提供统一的flash编程接口,可以方便地添加flash编程方案。,17,ADT
9、 IDE for ARM,ARM软件开发工具ADT IDE简介,ADT IDE(Arm7Lpt、Arm9Lpt、SoftSim、Arm7Simple),用户手册、编程指南,丰富例程,18,多版本支持,ARM软件开发工具ADT IDE简介,19,多工程管理,ARM软件开发工具ADT IDE简介,20,可视化编辑器,ARM软件开发工具ADT IDE简介,21,GCC交叉编译,ARM软件开发工具ADT IDE简介,22,编译器设置,ARM软件开发工具ADT IDE简介,23,汇编器设置,ARM软件开发工具ADT IDE简介,24,连接器设置,ARM软件开发工具ADT IDE简介,25,调试功能,AR
10、M软件开发工具ADT IDE简介,26,多种调试模式,ARM软件开发工具ADT IDE简介,27,断点,ARM软件开发工具ADT IDE简介,28,存储器窗口,ARM软件开发工具ADT IDE简介,29,存储区上载下载功能,ARM软件开发工具ADT IDE简介,30,寄存器观察窗口,ARM软件开发工具ADT IDE简介,31,函数调用栈窗口,ARM软件开发工具ADT IDE简介,32,变量观察窗口,ARM软件开发工具ADT IDE简介,33,命令窗口,ARM软件开发工具ADT IDE简介,34,单步调试 STEP INTO,ARM软件开发工具ADT IDE简介,35,单步调试 STEP OVE
11、R,ARM软件开发工具ADT IDE简介,36,单步调试 STEP OUT,ARM软件开发工具ADT IDE简介,37,单步调试 RUN TO CURSOR,ARM软件开发工具ADT IDE简介,38,板上寄存器,ARM软件开发工具ADT IDE简介,39,板上寄存器,ARM软件开发工具ADT IDE简介,40,FLASH在线编程器,ARM软件开发工具ADT IDE简介,41,工具菜单,ARM软件开发工具ADT IDE简介,42,在线帮助,ARM软件开发工具ADT IDE简介,43,嵌入式软件开发,无操作系统的软件开发启动代码应用程序基于操作系统的软件开发bootloader操作系统移植BSP
12、板级支持包应用程序开发,ARM软件设计与代码分析,44,启动代码,功能硬件初始化引导C代码特征通常用汇编语言编写程序复位运行入口点代码量非常小,程序流程设置中断、异常入口关中断硬件寄存器初始化(GPIO配置、总线配置、PLL时钟)初始化栈指针数据区初始化C入口函数调用 BL Main,ARM软件设计与代码分析,45,应用程序(无操作系统),功能硬件驱动应用特征通常用C语言或者嵌入式汇编语言编写程序较复杂,代码量较大,ARM软件设计与代码分析,46,bootloader,功能硬件初始化引导操作系统下载程序(串口、网口、USB)烧写flash特征程序复位运行入口点通常用汇编语言+C语言编写代码量较
13、小,ARM软件设计与代码分析,47,嵌入式操作系统移植,LinuxWindows CE uC/OS IIuClinuxNucleus,ARM软件设计与代码分析,48,BSP板级支持包,功能为应用程序提供统一的硬件操作接口特征高度硬件相关高度依赖于具体硬件平台各种操作系统各异,ARM软件设计与代码分析,49,应用程序开发(操作系统),功能GUI图形、人机交互控制算法特征硬件依赖程度小部分可仿真调试各种操作系统各异,ARM软件设计与代码分析,50,嵌入式软件设计和调试流程,编辑创建工程添加文件、编写程序汇编语言加C语言编译配置编译、汇编和连接参数编写连接脚本文件编译,调试连接调试器下载程序运行、调
14、试固化通过仿真器烧写flash专用或通用的编程器通过bootloader烧写flash,ARM软件设计与代码分析,51,交叉编译,GNU交叉编译编译.c arm-elf-gcc汇编.S arm-elf-gas连接.o arm-elf-ld操作文件汇编文件.SC文件.c链接脚本文件ldscript库文件.o.lib.a,生成调试格式文件.elfDWARF-1DWARF-2生成bin文件elf2binarm-elf-objcopy,ARM软件设计与代码分析,52,链接脚本,段Text段rodata段data段bss段符号Image_RO_Limit Image_RW_BaseImage_ZI_Ba
15、seImage_ZI_Limit,GCC库专用调试信息,ARM软件设计与代码分析,53,链接脚本示例,程序在SDRAM中运行,程序在FLASH中运行,ARM软件设计与代码分析,54,GCC库,GCC库标准C函数库lib.a-lc标准数学函数库libm.a-lm标准函数库的支持库libg.a-lgGCC的支持库libgcc.a-lgcc链接排列顺序-lm lc lgcc-lg,ARM软件设计与代码分析,55,JX44B0启动代码分析,ARM软件设计与代码分析,在基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0 x00000000开始执行,因此在这个地址处安排的通常就是系
16、统的启动代码。它通常也是BootLoader程序的一部分,可以在启动代码基础上编写BootLoader。用汇编语言编写。启动代码是在复位后运行其它程序之前运行的一段小程序。通过它,初始化硬件设备、建立内存空间的映射图(JX44B0不需要),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用C函数准备好正确的环境。,56,启动代码的移植和修改,ARM软件设计与代码分析,启动代码除了依赖于 CPU 的体系结构外,实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件
17、资源和配置不一致的话,要想让运行在一块板子上的启动代码也能运行在另一块板子上,也还是需要作一些必要的修改。,57,启动代码流程图,启动代码的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用C函数。注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;,ARM软件设计与代码分析,58,设置中断向量表,该段向量表除了复位异常外,只有位于0地址处有效,也就是必须将该段代码烧写到FLASH中。复位异常直接跳转到ResetHandler处,它是相对跳转,位置无关。其余的异常将跳转到0
18、c000008+向量地址的位置,使用绝对跳转。,ARM软件设计与代码分析,59,复位入口:切换到超级模式,系统复位成功后,将自动进入SVC模式在初始化之前必须关闭中断,以免引起异常,LOCKOUT:0 xc0Bit6,7=1,ARM软件设计与代码分析,60,设置中断模式并禁止中断,设置S3C44B0 INTCON寄存器缺省值为0 x07,可以 不作该工作,ARM软件设计与代码分析,61,关闭看门狗,设置S3C44B0 WTCON寄存器必须设置,ARM软件设计与代码分析,62,系统配置寄存器,使能回写buffer打开Cache,ARM软件设计与代码分析,63,设置非Cache区域,使能回写buf
19、fer打开Cache,00 x0b000000,0c70000000 xc7320000,ARM软件设计与代码分析,64,端口设置,ARM软件设计与代码分析,65,设置外部中断的触发方式,ARM软件设计与代码分析,66,配置总线访问宽度,ARM软件设计与代码分析,67,配置总线访问时序,ARM软件设计与代码分析,68,C代码初始化,ARM软件设计与代码分析,69,堆栈初始化,ARM软件设计与代码分析,70,跳转到C入口函数,ARM软件设计与代码分析,71,JX44B0 BOOTLOADER分析,ARM软件设计与代码分析,BootLoader是在启动代码的基础之上,通常启动代码包含于BootLo
20、ader之中BootLoader常用于引导操作系统或者应用程序BootLoader可以包含一些简单的调试手段,72,BootLoader的基本概念,BootLoader是系统加电后运行的第一段软件代码。嵌入式系统中,整个系统的加载启动任务完全由 BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0 x00000000开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。简单地说,BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图(有
21、的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的 BootLoader 是很困难的。,ARM软件设计与代码分析,73,BootLoader 的移植和修改,BootLoader除了依赖于 CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的
22、硬件资源和配置不一致的话,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,也还是需要作一些必要的修改。,ARM软件设计与代码分析,74,BootLoader 的安装,系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位时都从地址 0 x00000000 取它的第一条指令。嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,
23、而这块起始地址需要采用可引导的固态存储设备如FLASH。,ARM软件设计与代码分析,75,用来控制 BootLoader 的设备或机制,串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader 程序在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。,ARM软件设计与代码分析,76,Boot Loader 的操作模式,启动加载模式:这种模式也称为自主(Autonom
24、ous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被 BootLoader写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系统更新时使用。工作于这种模式下的 BootLoader 通常都会向它的终端用户提供一个简单的命令行接口。在教学系统
25、中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。,ARM软件设计与代码分析,77,BootLoader与主机间文件传输的通信设备及协议,最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmodemymodemzmodem 协议以及在以太网上采用TFTP协议。,ARM软件设计与代码分析,78,BootLoader的主要任务与典型结构框架,从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。大多数BootLoader都分为stage1和stage2两大部分
26、。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。而stage2 则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。,ARM软件设计与代码分析,79,BootLoader的主要任务与典型结构框架,BootLoader的stage1通常包括以下步骤为加载 BootLoader 的 stage2 准备 RAM 空间拷贝 BootLoader 的 stage2 到 RAM 空间中设置好堆栈跳转到 stage2 的 C 入口点BootLoader的stage2通常包括
27、以下步骤初始化本阶段要使用到的硬件设备调用应用程序或启动内核,ARM软件设计与代码分析,80,Stage 1初始化流程图,stage 1的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用Stage 2。注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;,ARM软件设计与代码分析,81,Stage 2流程图,stage 2的功能:初始化串口,显示菜单,通过菜单获取用户输入,并执行相应的操作。,ARM软件设计与代码分析,82,Bootloader更新程序流程图,通过Boot
28、Loader更新程序的流程。注意为了使用Bootloader更新FLASH中的程序,需要首先将Bootloader搬迁到RAM中运行。,ARM软件设计与代码分析,83,嵌入式实时操作系统,ARM软件设计与代码分析,将在后面介绍,84,板级支持包,ARM软件设计与代码分析,BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。,85,板级支持包的特点,ARM软件设计与代码分析,硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和
29、控制具体硬件的方法。操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。,86,板级支持包的功能,ARM软件设计与代码分析,87,板级支持包的功能,ARM软件设计与代码分析,嵌入式系统初始化片级初始化板级初始化系统级初始化硬件相关的设备驱动程序,88,系统级初始化,ARM软件设计与代码分析,这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并
30、将控制转交给应用程序的入口。,89,硬件相关的驱动程序,ARM软件设计与代码分析,与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。,90,JX44B0应用代码设计及中断处理,ARM软件设计与代码分析,连接脚本,91,JX44B0应用代码中断向量,ARM软件设计与代码分析,起始地址0 x0c000008,除复位异常外,其余异常入口地址由FL
31、ASH跳转得到,92,JX44B0中断处理流程,执行0 x18处指令:LDR pc,=0 x0c000020,由Bootloader控制,执行0 x0c000020处指令:HandlerIRQ,ramstart.s,执行HandlerIRQ,ramstart.s,执行HandleIRQ处保存的中断分发例程,ramstart.s中初始化为IsrIRQ,ARM软件设计与代码分析,93,用汇编代码编写的中断分发例程,保护现场IsrIRQ:/*using I_ISPR register.*/sub lr,lr,#4stmfd sp!,lr/*保存中断返回的PC值*/stmfd sp!,r0-r4/*备
32、份寄存器R0-R4*/sub sp,sp,#4/*为PC预留栈空间*/stmfd sp!,r8-r9/*备份寄存器R8-R9*/ldr r9,=I_ISPR/*读取中断状态*/ldr r9,r9,R9中保存中断状态,ARM软件设计与代码分析,94,用汇编代码编写的中断分发例程,寻找中断源cmp r9,#0 x0/*检查中断状态*/beq i2 mov r8,#0 x0/*R8保存中断表的偏移*/i0:/*逐位检查中断状态*/movs r9,r9,lsr#1 bcs i1/*如果该位等于1,则处理这一中断*/add r8,r8,#4/*修改当前的中断偏移*/b i0/*处理下一比特*/,找到中断
33、则跳转到i1,R8保存找到的中断偏移,未找到中断则跳转到i2,ARM软件设计与代码分析,95,用汇编代码编写的中断分发例程,处理中断并返回i1:ldr r9,=HandleADC/*HandleADC位于中断向量表起始位置,我们将该地址用作是中断向量表的基地址*/add r9,r9,r8/*计算入口地址指针:中断基地址加上偏移*/ldr r9,r9/*从地址向量表中获取入口地址*/str r9,sp,#8/*将入口地址保存到堆栈,并移动堆栈指针*/mov lr,pc/*保存当前PC*/ldmfd sp!,r8-r9,pc/*调用中断例程*/ldmfd sp!,r0-r4,pc/*中断返回,并恢
34、复中断前的处理器模式*/i2:ldmfdsp!,r8-r9/*如果当前没有任何中断,直接返回*/add sp,sp,#4/*移动堆栈指针,该空间由第4句指令预留*/ldmfd sp!,r0-r4,pc/*中断返回,并恢复中断前的处理器模式*/,ARM软件设计与代码分析,96,用C代码编写的中断分发例程,函数声明typedef(*ISR_ROUTINE_ENTRY)(void);void IsrIRQ()_attribute_(interrupt(IRQ);,ARM软件设计与代码分析,97,用C代码编写的中断分发例程,函数实现void IsrIRQ()int count=0;unsigned i
35、nt isr_pending;unsigned int isr_mask=0 x00000001;unsigned int isr_mask_set=rINTMSK;/*读取中断掩码*/ISR_ROUTINE_ENTRY isr_routine_entry=(ISR_ROUTINE_ENTRY)0 x0;isr_pending=(rINTPND,ARM软件设计与代码分析,98,中断处理例程,注册例程*(unsigned int*)(HandleEINT0)=(unsigned int)EINT0_Isr;函数实现void EINT0_Isr()rI_ISPC=BIT_EINT0;/*清除中断标志*/,ARM软件设计与代码分析,