1、基于基于ARMARM核的嵌入式核的嵌入式 软件开发环境与技术介绍软件开发环境与技术介绍主要内容一、开发环境一、开发环境二、开发流程二、开发流程三、工程的建立与配置三、工程的建立与配置四、编写软件源文件四、编写软件源文件五、软件工程的编译链接五、软件工程的编译链接六、软件调试六、软件调试七、可执行文件固化七、可执行文件固化一、开发环境一、开发环境Embest IDEARM 开发板Embest 仿真器Embest IDE开发环境开发环境的组成开发环境的组成PC开发环境的连接开发环境的连接Embest IDEEmbest IDE界面界面工程管理区代码编辑区寄存器窗口信息提示区存储器区变量窗口数据观察
2、区函数栈窗口Embest IDEEmbest IDEEmbest IDE特征特征支持所有ARM7,ARM9系列处理器;支持开发语言:C和汇编;支持Windows 98、XP、NT及2000等操作系统;源码编辑器:支持标准的文本编辑功能,支持语法分色显示。图形化的工程管理与设置,图形化设置编译连接选项。调试功能:可进行程序下载、断点设置、单步执行、异常处理等,可查看修改存储区、寄存器、外围寄存器、变量,可查看函数栈,显示反汇编指令及源文件交叉显示。丰富的例程:提供Atmel、Samsung、OKI、Cirrus Logic等多家公司ARM处理器的调试程序示例和使用说明。配合Embest Powe
3、rICE仿真器,速度达120KBytes/秒。增强型仿真器PowerICE120KByte/S标准型仿真器Emulator25KByte/SEmbest Embest 仿真器仿真器二、开发流程二、开发流程开发流程开发流程工程建立 源文件 编译链接 调试 固化vC语言程序*.c v汇编源程序*.s v链接脚本文件*.ldv命令脚本文件*.CSv存储区映像文件*.map源文件在源文件中,除应用程序外,用户需要做的最主要工作是编写启动程序,包括汇编启动程序*.s和C语言启动程序*.C,它主要是完成一些和硬件相关的初始化的工作,为应用程序作准备。在程序编译时需要增加一个链接脚本文件,该文件描述代码链接
4、定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。源文件在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*.CS配合程序的调试。存储区映像文件*.map可以防止在软件调试过程中访问非法存储区时产生异常中断;命令脚本文件*.CS则是通过一组命令序列来让集成环境自动完成一些特定的功能。三、工程的建立与配置三、工程的建立与配置开发流程之一:工程的建立与配置步骤工程的建立与配置步骤建立软件工程配置处理器配置调试设备建立软件工程创建新工程 选择File菜单项中的建立新工程选项 输入工程名和要保存工程的路径名 用户可以在工作区内自由添加各种
5、文件处理器配置配置ARM7ARM9配置芯片厂家配置具体芯片型号配置调试设备配置Jtagarm7Jtagarm9PowerICEARM7PowerICEARM9SimArmPC和仿真器通讯设置四、编写软件源文件四、编写软件源文件开发流程之二:软件源文件的形式(语言)标准C语言文件汇编语言文件n 汇编代码文件*.sn 汇编包含文件*.macn C代码文件*.cn C包含文件*.h软件源文件的形式(功能)应用程序文件启动程序文件n 系统复位后开始执行的程序部分n 启动程序执行完后开始执行的部分n 汇编代码200行,执行空间1KBn C源代码1000050000行,100KB 500KB启动代码说明启
6、动代码是用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点n 功能n 特征电路初始化电路初始化 为高级语言编写的软件运行做准备为高级语言编写的软件运行做准备 汇编语言汇编语言 程序复位运行入口点程序复位运行入口点启动流程设置中断、异常向量设置中断、异常向量系统寄存器配置系统寄存器配置看门狗及外围电路初始化看门狗及外围电路初始化存储区电路初始化存储区电路初始化变量初始化变量初始化数据区准备数据区准备高级语言入口函数调用高级语言入口函数调用初始化栈指针初始化栈指针典型启动流程设置中断、异常向量设置中断、异常向量变量初始化、数据区准备变量初
7、始化、数据区准备高级语言入口函数调用高级语言入口函数调用初始化栈指针初始化栈指针NoRW:LDR r1,=ZI_Limit MOV r2,#0LoopZI:CMP r3,r1STRCC r2,r3,#4beq LoopZI#IRQ modeMOV R0,#Mode_IRQ MSR CPSR_c,R0LDR R13,=IRQ_Stack#SVC modeMOV R0,#Mode_SVCMSR CPSR_c,R0LDR R13,=SVC_Stack配置存储区配置存储区B Reset_HandlerB Undefined_HandlerB SWI_HandlerB Prefetch_HandlerB
8、 Abort_HandlerNOPB IRQ_HandlerB FIQ_Handler.extern mainBL main LDRr0,=0 x78100000LDRr1,=0 x2A8STRr1,r0LDRr0,=0 x78100008LDRr1,=0 x1STRr1,r0五、软件工程的编译链接五、软件工程的编译链接开发流程之三:工程编译工程文件源代码文件链接文件函数库文件调试信息文件工程编译相关文件工程文件(*.ews、*.pjf)n 工作区文件*.ews 工程文件*.pjfn 工程创建与配置自动生成,禁止用户修改链接脚本文件(*.ld)n 遵照脚本文件格式,用户复制示例或手工输入n 编
9、写根据用户软件设计和电路存储区安排函数库文件(*.lib、*.a)n Embest IDE附带的标准嵌入式C函数库n 用户自己编写的函数库文件类型文件类型在系统级别的嵌入式开发中需要使用链接定位文件,该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位,该文件称为链接脚本文件(*.ld)SECTIONS.=0 x0C000000;Image_RO_Base=.;.text:*(.text);Image_RO_Limit=.;Image_RW_Base=.;.data:*(.data);.rodata:*(.rodata);Image_
10、ZI_Base=.;.bss:*(.bss);Image_ZI_Limit=.;Image_RW_Limit=.;_bss_start_=.;_bss_end_=.;_EH_FRAME_BEGIN_=.;_EH_FRAME_END_=.;PROVIDE(_stack=.);end=.;_end=.;.debug_info0:*(.debug_info).debug_line0:*(.debug_line).debug_abbrev0:*(.debug_abbrev).debug_frame0:*(.debug_frame)赋当前地址,可能为RAM或Flash的访问地址只读区域基地址,启动程序中
11、使用的符号代码段,在这里标识开始放置程序代码只读区域长度,启动程序中使用的符号读写区域基地址,启动程序中使用的符号数据段,程序中已初始化的全局变量放在该段只读数据段,程序中静态全局变量等固定值放在该段清零区域基地址,启动程序中使用的符号包含未初始化的全局可用数据,如未初始化全局变量清零区域长度,启动程序中使用的符号读写区域基长度,启动程序中使用的符号调调试试信信息息gcc库库专专用用链接脚本文件及示例int A1;int A2=5;const int A3=10;void main()int A4;register int A5;A4=A3;.text:*(.text);代码段,在这里标识从代
12、码段,在这里标识从0开始放置程序代码开始放置程序代码.rodata:*(.rodata);只读数据段,程序中静态全局变量等固定值放在该段只读数据段,程序中静态全局变量等固定值放在该段.data:*(.data);数据段数据段,程序中已初始化的全局变量放在该段程序中已初始化的全局变量放在该段.bss:*(.bss);包含未初始化的全局可用数据包含未初始化的全局可用数据,如未初始化全局变量如未初始化全局变量变量A1作为未初始化的变量将保存在.bss 段中变量A2 作为已初始化的变量将保存在.data 段中常量A3保存在只读数据断.rodata 段中main函数对应的代码保存在.text 段中寄存器
13、变量A5直接保存在ARM的一个寄存器中局部变量A4当程序执行到main函数时存放在main函数对应的函数栈中链接脚本与程序的对应链接标准函数库链接排列顺序为-lm-lc-lgcc -lgEmbest IDE附带的GNU标准函数库标准标准C函数库函数库 libc.a -lc标准数学函数库标准数学函数库 libm.a-lm标准函数库的支持库标准函数库的支持库libg.a-lgGCC的支持库的支持库libgcc.a-lgcc函数库的支持模式ARM Little-EndianARM Little-Endian InterworkARM Big-EndianARM Big-Endian Interwor
14、kThumb Little-EndianThumb Little-Endian InterworkThumb Big-EndianThumb Big-Endian Interwork编译器配置包含文件目录编译目标文件输出目录编译器预定义设置使用ARM指令、THUMB指令或交互方式设置编译的字节顺序汇编器配置汇编器配置包含文件目录;汇编输出文件目录汇编预定义ARM/THUMB指令或交互工作方式编码字节顺序链接器配置链接器配置设置使用的链接脚本文件设置输出的调试信息文件设置入口文件设置链接的用户函数库或标准函数库六、软件调试六、软件调试开发流程之四:调试准备存储区映像文件命令脚本文件调试步骤调试步
15、骤 调试配置连接和下载控制执行调试信息观察在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,而提供的一种用于描述各个存储区性质的文件叫存储区映像文件(*.map)文件格式存储区映像文件用户一般不用关注以下选项用户一般不用关注以下选项总线宽度、访问尺寸、读等待、写等待、高速访问等待总线宽度、访问尺寸、读等待、写等待、高速访问等待名称起始地址长度属性存储区映像文件示例存储区映像文件示例调试命令列表调试命令列表BKPTCLEAR 清除断点BKPTDATA 设置数据断点BKPTINST
16、 设置指令断点BKPTLIST 断点列表DISASM 反汇编DOWNLOAD 文件下载GO 执行程序HELP 显示帮助信息MEMREAD 存储区读MEMWRITE 存储区写REFRESH 刷新窗口REGLIST 寄存器列表REGREAD 寄存器读REGWRITE 寄存器写RESET 复位目标设备SCRIPT 执行脚本文件STEP 单步执行程序STOP 停止执行程序SYMBOL 载入符号文件MEMWRITE 存储区写存储区写语语 法:法:memwrite e 地址 数值 说说 明:明:向存储区指定地址写入数值 地址 要写入数值的存储区地址 数值 待写数值 选选 项:项:-e 大端方式写入 示例:
17、memwrite 0 x1000 0 x5A 向地址0 x1000处写入数值0 x5A memwrite-e 0 x2000000 0 x22334455 等效于memwrite 0 x2000000 0 x55443322控制台调试命令控制台调试命令命令脚本文件命令脚本文件在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(*.cs)命令脚本的执行方法命令脚本的执行方法方法一方法一 在工程设置对话框调试选项中
18、在“连接后行为”中指定连接后执行命令脚本文件 方法二方法二 在集成环境连接目标板后,在调试命令窗口里执行 Script 命令脚本文件名命令脚本文件名 命令脚本文件示例调试配置调试配置设置连接后执行的命令脚本设置调试信息文件设置下载文件设置下载到RAM区地址复位运行停止重新运行单步进入函数单步执行单步跳出函数执行到光标设置断点禁止断点控制程序执行控制程序执行观察调试信息存储区窗函数栈窗观察窗变量窗寄存器窗外围寄存器窗寄存器窗口值已修改寄存器窗外围寄存器寄存器树值已修改值已修改寄存器名值已修改寄存器组七、可执行文件固化七、可执行文件固化开发流程之五:生成可执行文件源文件*.Elf*.Bin(编译编
19、译)(Elf to Bin)(Elf to Bin)程序固化命令中断和退出执行Flash操作命令时,本按钮提供中断命令功能,其他情况时为关闭应用程序数据上载读 取 整 个FLASH芯片数据或芯片部分扇区数据,并保存为BIN格式文件,文件名由用户在编程子对话框中指定。芯片保护对整个FLASH芯片或芯片部分扇区执行保护操作。效验和读 取 整 个FLASH芯片数据或芯片部分扇区数据,计算并显示所有数据的效验和(字节和基于2的补码)。文件校验读取FLASH芯片数据,与选择的编程数据文件进行比较,如果遇到不同的数据,软件停止校验操作,并显示不同单元的地址。编程 对整个FLASH或部分 扇 区 进 行编
20、程,用 户可 以 设 置 编程 前 自 动 擦除 以 及 编 程过 程 中 自 动校验。芯片擦除 根 据 用 户 设置 擦 除 整 个FLASH芯片数 据 或 擦 除芯 片 部 分 扇区数据。全空检查检查Flash是否处于空白状态,当遇到非空单元时,软件退出检查,并显示非空单元的地址和数据。选择要编程的Bin文件选择上载的Bin文件保存路径和名称程序固化CPU设置CPU编码方式设置读取目标板上所有写入寄存器列表中的寄存器数据,并显示在数值(Value)栏显示当前选择处理器的内部功能寄存器名称、初始缺省值,写入数值,并可以修改。设置需要写入的存储区地址、数据以及宽度。选择CPU的型号复位电路;测试寄存器;测试存储区;测试RAM;读取FLASH标识程序固化FLASH设置选择FLASH的型号选择使用的FLASH芯片数目:1、2或4片。选择数据访问宽度:8、16或32位。设置FLASH烧写地址按顺序显示该芯片包含的扇区编号、大小以及每个扇区的起始地址。选择FLASH要编程的扇区范围