《基于ARM的嵌入式系统》由会员分享,可在线阅读,更多相关《基于ARM的嵌入式系统(74页珍藏版)》请在金锄头文库上搜索。
1、基于ARM的嵌入式系统软件设计北京微芯力科技有限公司主要内容 嵌入式软件开发关键技术 “ARM”软件设计基础 “ARM”软件调试与运行 嵌入式软件的启动代码嵌入式软件开发关键技术 嵌入式实时操作系统 程序的链接定位 软件调试技术启动代码说明启动代码是用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言 是任何处理器上电复位时的程序运行入口点 功能初始化电路为高级语言编写的软件运行做准备 特征汇编语言处理器上电复位的程序运行入口点启动代码常见形式 实时操作系统的板基支持包 BSP 计算机主板的 BIOS启动代码最小流程全局寄存器初始化存储区配置初始化堆栈高级语言入口函数调用Ma
2、in( )Rtos_Init( )MyRoot( )启动代码典型流程中断向量设置看门狗设置 外围电路初始化初始化堆栈 数据区清零高级语言入口函数调用全局寄存器初始化中断禁止存储区设置 自检允许中断程序的链接定位 链接定位是系统级软件开发过程中必不可少的一部分 嵌入式软件开发均属于系统级开发 链接定位过程一般由链接器根据链接定位文件完成 比较简单的系统可以通过设置链接器开关选项取代链接定位文件 链接定位的关键是链接定位文件的编写常见链接程序段 text : 代码段 所有代码块部分以下程序段存在于各个目标文件中 *.obj *.o链接定位后按段的类别收集在一起 同时指定在存储区中的位置 rodat
3、a : 已初始化的全局只读数据 data : 已初始化的全局数据 bss : 未初始化的全局变量简单链接定位文件SECTIONS.= 0x10000.text:*(.text).= 0x8000000.data:*(.data).bss:*(.bss)典型链接定位文件SECTIONS. = 0x02000000;.text : *(.text) Image_RO_Limit = .;Image_RW_Base = .;.data : *(.data) .rodata : *(.rodata) .bss : *(.bss) PROVIDE (_stack = .);end = .;_end =
4、.;.debug_info 0 : *(.debug_info) .debug_line 0 : *(.debug_line) .debug_abbrev 0 : *(.debug_abbrev).debug_frame 0 : *(.debug_frame) 调试技术在应用程序的编辑 编译工作完成后 开发人员需要借助一些调试设备或调试模块 对应用程序进行调试 发现程序设计中的缺陷 常用的调试设备或调试模块有以下几种 指令集模拟器 驻留监控软件 JTAG仿真器 在线仿真器指令集模拟器PC 而且 运行速度 调试 驻留监控软件驻留监控软件 Resident Monitors 是一段运行在目标板上的
5、程序 集成开发环境中的调试模块 通过以太网口 并行端口或者串行端口等通讯端口与驻留监控软件进行交互 由调试模块发送命令通知驻留监控软件 控制程序的执行 读写存储器 读写寄存器 设置断点等驻留监控软件是一种比较低廉有效的调试方式 不需要任何其他的硬件调试和仿真设备 ARM公司的 Angel就是该类软件 大部分嵌入式实时操作系统也是采用该类软件进行调试 不同的是在嵌入式实时操作系统中 驻留监控软件是作为操作系统的一个任务存在的驻留监控软件的不便之处在于它对硬件设备的要求比较高 一般在硬件稳定之后才能进行应用软件的开发 同时它占用目标板上的一部分资源 而且不能对程序的全速运行进行完全仿真 所以对一些
6、要求严格的情况不是很适合JTAG仿真器JTAG仿真器也称为 JTAG调试器 是通过 ARM芯片的 JTAG边界扫描口进行调试的设备JTAG仿真器比较便宜 连接比较方便 通过现有的 JTAG边界扫描口与 ARM CPU 核通信 属于完全非插入式 (即不使用片上资源 )调试 它无需目标存储器 不占用目标系统的任何端口 而这些是驻留监控软件所必需的另外 由于 JTAG调试的目标程序是在目标板上执行 仿真更接近于目标硬件 因此 许多接口问题 如高频操作限制 AC和DC参数不匹配 电线长度的限制等被最小化了使用集成开发环境配合 JTAG仿真器进行开发是目前采用最多的一种调试方式在线仿真器在线仿真器使用仿
7、真头 完全取代目标板上的 CPU 可以完全仿真 ARM芯片的行为 提供更加深入的调试功能 但这类仿真器为了能够全速仿真时钟速度高于 100MHz的处理器 通常必须采用极其复杂的设计和工艺 因而其价格比较昂贵在线仿真器通常用在 ARM的硬件开发中 在软件的开发中较少使用 其价格高昂 也是在线仿真器难以普及的因素实时操作系统(RTOS) RTOS选择的原则 EmbestIDE与RTOS的配合 常见的几种RTOS介绍RTOS特点 基于优先级的任务调度保证优先任务得到优先执行 任务间的通信 互斥机制实现任务间同步和通讯 实时时钟管理保证任务在确定时间内执行完成RTOS基础知识RTOS选择 真的需要 R
8、TOS 主程序是不是很冗长 程序的执行是不是需要判断很多条件参数或资源是否得到 是否发现花费很多时间盘算怎样使一段代码在该执行的时候执行 是否花费太多时间在中断子程序上 需要编出所有代码处理中断事件 处理器控制的时间和方式和预想的一样吗RTOS选择原则 RTOS性能 包括任务最长切换时间 中断最长延迟时间 可调度的任务数和优先级数等 软件组件和设备驱动程序是否齐全 开发工具和调试工具是否易用 标准兼容性 是否支持 POSIX标准 RTOS发送形式 是源代码还是二进制代码 是否需要许可证以及能否提供及时的技术支持EmbestIDE和RTOS的配合 EmbestIDE完全支持源代码方式提供的 RT
9、OS 只需要将 RTOS的源代码纳入 EmbestIDE的工程管理目录中和应用程序一起编译 即可调试 RTOS及应用程序 EmbestIDE支持二进制码方式提供的 RTOS 条件是RTOS的二进制码是使用 GNU工具链编译的 将该二进制码文件作为库链接进 EmbestIDE应用工程 即可调试RTOS及应用程序uCOS操作系统 简单 高效 易用 完全免费使用 提供全部源代码 支持 64个任务 支持多种 CPU 提供邮箱 信号量以及消息队列三种任务间通讯方式 无设备驱动程序 缺乏足够多的应用模块 如 TCP/IP协议以及 GUI模块等等 无技术支持eCOS操作系统 从 linux移植而来 复杂但完
10、全功能 完全免费使用 提供全部源代码 支持多种 CPU 使用 GNU工具链开发 有完备的设备驱动程序和应用模块 可从 linux中移植 技术支持需付费 支持 POSIX标准 需要较多的系统资源uCLinux操作系统 从 linux移植而来 复杂但完全功能 完全免费使用 提供全部源代码 支持多种 CPU 使用 GNU工具链开发 提供通用的 linux API 有完备的设备驱动程序和应用模块 可从 linux中移植 使用直接物理内存访问方式 完整的 TCP/IP协议栈 需要较多的系统资源 内核 , , , dest = (op_1 * op_2) + op_3MLA 的行为同于 MUL 但它把操作
11、数 3 的值加到结果上 这在求总和时有用MUL : 乘法 (Multiplication)MUL条件 S , , dest = op_1 * op_2MUL 提供 32 位整数乘法 如果操作数是有符号的 可以假定结果也是有符号的比较指令举例CMN R0, #1 ; 把 R0 与 -1 进行比较TST R0, #%1 ; 测试在 R0 中是否设置了位 0分支指令B : 分支 (Branch)指令 处理器 PC立即跳转到给定的地址B条件 BL : 带连接的分支 (Branch with Link)指令 在分支之前在寄存器 14 中装载上 R15 的内容BL条件 伪指令伪指令 它们不是处理器实际上能
12、理解的指令 但可以转换成它能理解的某种东西 它们的存在能使你的程序更加简单 ADR ADRL LDR ALIGN DCx EQUx OPTARM 的 Exception Handler Reset Undefined instructionSWI Prefetch abort Data abort ReservedFIQIRQ异常向量RESET 正常情况下 系统 reset后进入的入口ENTRY主入口 驻留于存储系统的 0x0地址 占 4Byte,机器码通常为 EA0000XX 通常在进入时将系统 CPSR设为监控模式退出时改为用户模式 所有必须的 BSP必须在此入口内完成 使用汇编语言编写
13、可控制 C代码入口Undefined Instruction 未定义指令 当程序员使用未定义指令时 系统出错处理的入口 驻留于存储空间的 0x4,4bytes 处理程序通常做法是首先进行现场保护 然后 Do nothing 当出现此错误时 主因大致是仿真器跳入错误地址SWI 软中断 驻留于 0x8, 4Bytes monitor程序的入口 包含有丰富的指令寄存器 适用于 ARM和 ThumbAbort Perfect abort 预取失败错误 驻留于 0x0c,4bytes Data abort 取数据失败错误 驻留于 0x10,4bytes 通常是保护现场 然后 do nothing 出错主
14、因 程序跳飞 查程序FIQ和 IRQFIQ快速中断请求 驻留于 0x18,4bytesIRQ中断请求 驻留于 0x1c,4bytesFIQ和 IRQ处理原理相同 所有的硬件中断源共用一个通道来进行 IRQ或 FIQ 中断处理支持中断嵌套编程实例 1.数码管显示程序功能 显示 0 1 2Flcddemo.cIsr.csnds.hledDemo.hsegment.h板卡 ROM编程本章包含如下部分 : 关于写 ROM代码 内存映射的考虑 系统的初始化调用地址 0处的 ROM镜像内存映射的考虑内存映射的考虑ROM at 0x0RAM at 0x0RAM at 0x0系统的初始化 系统的初始化 执行环境的初始化 入口点的识别 设置向量表 内存系统的初始化 堆栈指针的初始化 任何关键的 I/O设备的初始化 通过中断系统初始化 RAM变量 中断的使能 改变处理器模式 改变处理器状态应用的初始化应用的初始化根据 C代码的要求初始化内存使用主函数调用地址 0处的 ROM镜像调用地址 0处的 ROM镜像To build the example from the CodeWarrior IDE1.