嵌入式系统教案
This presentation is the property of its rightful owner.
Sponsored Links
1 / 98

嵌入式系统教案 PowerPoint PPT Presentation


  • 133 Views
  • Uploaded on
  • Presentation posted in: General

嵌入式系统教案. 武汉创维特信息技术有限公司. 2014/9/10. 第六章 嵌入式软件系统设计. 提纲. 1. 嵌入式软件开发过程. ARM 软件开发工具- ADT IDE 简介. 2. 3. ARM 软件设计与代码分析. 4. 5. 6. 7. 嵌入式软件开发过程. 嵌入式系统软件开发流程. 软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。. 概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。.

Download Presentation

嵌入式系统教案

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


4193506

嵌入式系统教案

武汉创维特信息技术有限公司

2014/9/10


4193506

第六章 嵌入式软件系统设计

提纲

1

嵌入式软件开发过程

ARM软件开发工具-ADT IDE简介

2

3

ARM软件设计与代码分析

4

5

6

7


4193506

嵌入式软件开发过程

嵌入式系统软件开发流程

  • 软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。

  • 概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。

  • 详细设计:详细描述各个模块的实现方法与过程,模块间接口等问题,以作为编码人员的编码准则。

  • 编码


4193506

嵌入式软件开发过程

嵌入式系统的开发流程

  • 单元调试:编码完成后,对各个模块进行单元调试,以保证模块正常工作。

  • 集成调试


4193506

ARM软件开发工具-ADT IDE简介

ARM主流开发工具

  • Windows操作系统

    • ARM ADS/SDT + 调试器

    • GNU + Cygwin + 调试器

    • ARM SDT + 简易电缆

  • Linux操作系统

    • GNU + GDB


4193506

ARM软件开发工具-ADT IDE简介

常用调试方法

  • 软件仿真

  • 驻留监控程序

    • 硬件要求高,一般在硬件稳定之后进行

    • 需要占用目标板上的一部分资源

    • 不能对程序的全速运行进行完全仿真

  • JTAG仿真器

    • 完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口

    • 仿真效果更加接近于目标硬件

  • 在线仿真器


Adt for arm

ARM软件开发工具-ADT IDE简介

ADT for ARM集成开发系统


Adt 1000 emulator for arm

ARM软件开发工具-ADT IDE简介

ADT 1000 Emulator for ARM


Adt 1000 emulator for arm1

ARM软件开发工具-ADT IDE简介

ADT 1000 Emulator for ARM

  • ADT Emulator for ARM是连接主机核目标机之间的硬件设备,它实现ADT IDE for ARM与目标机之间的连接。

  • 它具有如下特征:

  • 支持ARM核CPU

  • 非插入式调试,无需目标存储器,不占用目标系统的任何端口

  • 2.5V/3.3V/5V兼容电平接口

  • 支持标准的14/20针JTAG接口

  • 运行状态指示

  • 与主机之间通过并口连接

  • 下载速度达到25Kbytes/S


Adt ide for arm

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM


Adt ide for arm1

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 可视化编程环境

  • 支持ARM7、ARM9、SecurCore等。

  • 运行于Windows98 、NT、2000、XP等平台。

  • 中文、英文版本支持

  • 可视化的源码编辑和工程管理功能

  • 界面友好,使用方便:类似MS Visual Studio的用户界面,支持打印功能,支持文件内查找功能和Find in Files功能


Adt ide for arm2

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 可视化编程环境

  • 工程管理器:ADT IDE提供图形化的工程管理工具,实现文件级、文件目录级、工程级的多级编译连接选项管理以及工程级的调试参数管理

  • 源码编辑器:支持标准的文本编辑功能,支持C语言、汇编语言语法高亮显示

  • 辅助编辑工具:提供一系列辅助编辑工具,方便开发人员。包括:多剪贴板工具、代码模板工具、头文件和源文件切换工具、注释工具、符号配对书写工具等多种辅助编辑工具。


Adt ide for arm3

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 交叉编译功能

  • 支持开发语言:ANSI C;Embedded C++;汇编语言

  • 编译工具:使用著名优秀自由软件GNU的GCC交叉编译工具,并经过优化和严格测试,支持C语言、汇编语言等

  • 编译参数设置:完全图形界面方式的编译参数设置,提供可视化的设置功能。支持工程级、文件目录级、文件级编译参数设置


Adt ide for arm4

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 调试功能

  • 同时提供了图形和命令行两种调试方式

  • 程序的单步执行

  • 程序下载

  • 存储区下载和上载功能。

  • 工程级调试参数管理

  • 支持源程序、反汇编程序和混合窗口显示,支持ARM/THUMB方式显示

  • 具有与MS Visual Studio类似的调试菜单功能:Go,Stop,Reset,Restart,Step into,Step over,Step out,Run to Cursor等

  • 丰富的示例程序


Adt ide for arm5

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 调试功能

  • 断点功能:支持软件断点和硬件断点,实现断点设置、断点屏蔽、断点取消、断点列表等功能

  • 变量监视功能:随程序运行同步更新变量,即时修改变量值,可设置自动/手动刷新方式、十进制/十六进制显示

  • ARM各种模式的寄存器即时查看与修改,当前模式指示,寄存器值修改时红色突显

  • 存储器查看与修改,可设置自动/手动刷新方式、字节/双字节/四字节显示、大/小端方式显示,存储器值修改时红色突显


Adt ide for arm6

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM主要特征 - 调试功能

  • 函数堆栈显示,可设置自动/手动刷新方式、十进制/十六进制显示、参数值显示,参数类型显示

  • 板上寄存器(On Board Register)的查看和修改,可以查看支持CPU的所有板上寄存器的具体意义、当前值、各个位的意义,可设置自动/手动刷新方式、二进制/十进制/十六进制显示、大/小端方式显示,支持十进制/十六进制方式修改寄存器值,寄存器值修改时红色突显。

  • flash在线编程器,支持对多种flash芯片的空白检查、擦除、编程、校验等操作,支持单一操作和自动操作两种操作方式,支持8/16/32位flash访问宽度,支持多片flash同时编程,编程速度达15Kbytes/s。提供统一的flash编程接口,可以方便地添加flash编程方案。


Adt ide for arm7

ARM软件开发工具-ADT IDE简介

ADT IDE for ARM

ADT IDE

(Arm7Lpt、Arm9Lpt、SoftSim、Arm7Simple)

用户手册、编程指南

丰富例程


4193506

ARM7版本

简易仿真版本

软件仿真版本

ARM9版本

ARM软件开发工具-ADT IDE简介

多版本支持


4193506

工程

当前活动工程

ARM软件开发工具-ADT IDE简介

多工程管理


4193506

语法高亮编辑器

编辑菜单

辅助编辑工具条

书签

ARM软件开发工具-ADT IDE简介

可视化编辑器


4193506

编译菜单

编译工具条

编译结果输出

错误定位

ARM软件开发工具-ADT IDE简介

GCC交叉编译


4193506

多参数配置

多配置管理

多工程设管理

ARM软件开发工具-ADT IDE简介

编译器设置


4193506

多参数配置

多配置管理

多工程设管理

ARM软件开发工具-ADT IDE简介

汇编器设置


4193506

多参数配置

多配置管理

多工程设管理

ARM软件开发工具-ADT IDE简介

连接器设置


4193506

调试菜单

调试工具条

命令行调试窗口

ARM软件开发工具-ADT IDE简介

调试功能


4193506

源码模式

混合模式

汇编模式

ARM软件开发工具-ADT IDE简介

多种调试模式


4193506

断点列表

断点

ARM软件开发工具-ADT IDE简介

断点


4193506

半字模式

修改凸显标记

字模式

字节模式

ARM软件开发工具-ADT IDE简介

存储器窗口


4193506

存储区上载

存储区下载

ARM软件开发工具-ADT IDE简介

存储区上载下载功能


4193506

多模式寄存器显示

修改凸显标记

ARM软件开发工具-ADT IDE简介

寄存器观察窗口


4193506

函数调用栈

ARM软件开发工具-ADT IDE简介

函数调用栈窗口


4193506

局部变量

全局变量

多个观察窗口

ARM软件开发工具-ADT IDE简介

变量观察窗口


4193506

ARM软件开发工具-ADT IDE简介

命令窗口


Step into

ARM软件开发工具-ADT IDE简介

单步调试 - STEP INTO


Step over

ARM软件开发工具-ADT IDE简介

单步调试 - STEP OVER


Step out

ARM软件开发工具-ADT IDE简介

单步调试 - STEP OUT


Run to cursor

ARM软件开发工具-ADT IDE简介

单步调试 - RUN TO CURSOR


4193506

寄存器组

寄存器

寄存器位域

热点描述信息

修改凸显标记

ARM软件开发工具-ADT IDE简介

板上寄存器


4193506

ARM软件开发工具-ADT IDE简介

板上寄存器


Flash

ARM软件开发工具-ADT IDE简介

FLASH在线编程器


4193506

可自定制

ARM软件开发工具-ADT IDE简介

工具菜单


4193506

ARM软件开发工具-ADT IDE简介

在线帮助


4193506

ARM软件设计与代码分析

嵌入式软件开发

  • 无操作系统的软件开发

    • 启动代码

    • 应用程序

  • 基于操作系统的软件开发

    • bootloader

    • 操作系统移植

    • BSP板级支持包

    • 应用程序开发


4193506

ARM软件设计与代码分析

启动代码

  • 程序流程

    • 设置中断、异常入口

    • 关中断

    • 硬件寄存器初始化(GPIO配置、总线配置、PLL时钟)

    • 初始化栈指针

    • 数据区初始化

    • C入口函数调用 BL Main

  • 功能

    • 硬件初始化

    • 引导C代码

  • 特征

    • 通常用汇编语言编写

    • 程序复位运行入口点

    • 代码量非常小


4193506

ARM软件设计与代码分析

应用程序(无操作系统)

  • 功能

    • 硬件驱动

    • 应用

  • 特征

    • 通常用C语言或者嵌入式汇编语言编写

    • 程序较复杂,代码量较大


Bootloader

ARM软件设计与代码分析

bootloader

  • 功能

    • 硬件初始化

    • 引导操作系统

    • 下载程序(串口、网口、USB)

    • 烧写flash

  • 特征

    • 程序复位运行入口点

    • 通常用汇编语言+C语言编写

    • 代码量较小


4193506

ARM软件设计与代码分析

嵌入式操作系统移植

  • Linux

  • Windows CE

  • uC/OS II

  • uClinux

  • Nucleus


4193506

ARM软件设计与代码分析

BSP板级支持包

  • 功能

    • 为应用程序提供统一的硬件操作接口

  • 特征

    • 高度硬件相关

    • 高度依赖于具体硬件平台

    • 各种操作系统各异


4193506

ARM软件设计与代码分析

应用程序开发(操作系统)

  • 功能

    • GUI图形、人机交互

    • 控制

    • 算法

  • 特征

    • 硬件依赖程度小

    • 部分可仿真调试

    • 各种操作系统各异


4193506

ARM软件设计与代码分析

嵌入式软件设计和调试流程

  • 调试

    • 连接调试器

    • 下载程序

    • 运行、调试

  • 固化

    • 通过仿真器烧写flash

    • 专用或通用的编程器

    • 通过bootloader烧写flash

  • 编辑

    • 创建工程

    • 添加文件、编写程序

    • 汇编语言加C语言

  • 编译

    • 配置编译、汇编和连接参数

    • 编写连接脚本文件

    • 编译


4193506

ARM软件设计与代码分析

交叉编译

  • GNU交叉编译

    • 编译.c arm-elf-gcc

    • 汇编.S arm-elf-gas

    • 连接.o arm-elf-ld

  • 操作文件

    • 汇编文件.S

    • C文件.c

    • 链接脚本文件ldscript

    • 库文件.o .lib .a

  • 生成调试格式文件.elf

    • DWARF-1

    • DWARF-2

  • 生成bin文件

    • elf2bin

    • arm-elf-objcopy


4193506

ARM软件设计与代码分析

链接脚本

  • GCC库专用

  • 调试信息

    • Text段

    • rodata段

    • data段

    • bss段

  • 符号

    • Image_RO_Limit 

    • Image_RW_Base

    • Image_ZI_Base

    • Image_ZI_Limit


4193506

ARM软件设计与代码分析

链接脚本示例

  • 程序在SDRAM中运行

  • 程序在FLASH中运行


4193506

ARM软件设计与代码分析

GCC库

  • GCC库

    • 标准C函数库lib.a -lc

    • 标准数学函数库libm.a -lm

    • 标准函数库的支持库libg.a -lg

    • GCC的支持库libgcc.a -lgcc

  • 链接排列顺序

    • -lm –lc –lgcc -lg


Jx44b0

ARM软件设计与代码分析

JX44B0启动代码分析

  • 在基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行,因此在这个地址处安排的通常就是系统的启动代码。

  • 它通常也是BootLoader程序的一部分,可以在启动代码基础上编写BootLoader。

  • 用汇编语言编写。

  • 启动代码是在复位后运行其它程序之前运行的一段小程序。通过它,初始化硬件设备、建立内存空间的映射图(JX44B0不需要),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用C函数准备好正确的环境。


4193506

ARM软件设计与代码分析

启动代码的移植和修改

  • 启动代码除了依赖于 CPU 的体系结构外,实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。

  • 对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的启动代码也能运行在另一块板子上,也还是需要作一些必要的修改。


4193506

ARM软件设计与代码分析

启动代码流程图

  • 启动代码的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用C函数。

  • 注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;


4193506

ARM软件设计与代码分析

设置中断向量表

  • 该段向量表除了复位异常外,只有位于0地址处有效,也就是必须将该段代码烧写到FLASH中。

  • 复位异常直接跳转到ResetHandler处,它是相对跳转,位置无关。

  • 其余的异常将跳转到0c000008+向量地址的位置,使用绝对跳转。


4193506

MODE_MASK:0x1f

SUP_MODE:0x13

ARM软件设计与代码分析

复位入口:切换到超级模式

  • 系统复位成功后,将自动进入SVC模式

  • 在初始化之前必须关闭中断,以免引起异常

LOCKOUT:0xc0

Bit6,7 = 1


4193506

0x01e00000

0x01e00000

ARM软件设计与代码分析

设置中断模式并禁止中断

  • 设置S3C44B0 INTCON寄存器

  • 缺省值为0x07,可以 不作该工作


4193506

0x01e00000

0x01d30000

ARM软件设计与代码分析

关闭看门狗

  • 设置S3C44B0 WTCON寄存器

  • 必须设置


4193506

0x01e00000

0x01c00000

ARM软件设计与代码分析

系统配置寄存器

  • 使能回写buffer

  • 打开Cache


Cache

ARM软件设计与代码分析

设置非Cache区域

0-0x0b000000

  • 使能回写buffer

  • 打开Cache

0c7000000-0xc7320000


4193506

ARM软件设计与代码分析

端口设置


4193506

0x01e00000

0x01d20050

ARM软件设计与代码分析

设置外部中断的触发方式


4193506

ARM软件设计与代码分析

配置总线访问宽度


4193506

ARM软件设计与代码分析

配置总线访问时序


4193506

ARM软件设计与代码分析

C代码初始化


4193506

ARM软件设计与代码分析

堆栈初始化


4193506

ARM软件设计与代码分析

跳转到C入口函数


Jx44b0 bootloader

ARM软件设计与代码分析

JX44B0 BOOTLOADER分析

  • BootLoader是在启动代码的基础之上,通常启动代码包含于BootLoader之中

  • BootLoader常用于引导操作系统或者应用程序

  • BootLoader可以包含一些简单的调试手段


Bootloader1

ARM软件设计与代码分析

BootLoader的基本概念

  • BootLoader是系统加电后运行的第一段软件代码。

  • 嵌入式系统中,整个系统的加载启动任务完全由 BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

  • 简单地说,BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。

  • 通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的 BootLoader 是很困难的。


Bootloader2

ARM软件设计与代码分析

BootLoader 的移植和修改

  • BootLoader除了依赖于 CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。

  • 对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,也还是需要作一些必要的修改。


Bootloader3

ARM软件设计与代码分析

BootLoader 的安装

  • 系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位时都从地址 0x00000000 取它的第一条指令。

  • 嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。

  • 也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如FLASH。


Bootloader4

ARM软件设计与代码分析

用来控制 BootLoader 的设备或机制

  • 串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader 程序在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。


Boot loader

ARM软件设计与代码分析

Boot Loader 的操作模式

  • 启动加载模式:这种模式也称为"自主"(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。

  • 下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被 BootLoader写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系统更新时使用。工作于这种模式下的 BootLoader 通常都会向它的终端用户提供一个简单的命令行接口。

  • 在教学系统中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。


Bootloader5

ARM软件设计与代码分析

BootLoader与主机间文件传输的通信设备及协议

  • 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmodem/ymodem/zmodem 协议以及

  • 在以太网上采用TFTP协议。


Bootloader6

ARM软件设计与代码分析

BootLoader的主要任务与典型结构框架

  • 从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。

  • 大多数BootLoader都分为stage1和stage2两大部分。

  • 依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。

  • 而stage2 则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。


Bootloader7

ARM软件设计与代码分析

BootLoader的主要任务与典型结构框架

  • BootLoader的stage1通常包括以下步骤

    • 为加载 BootLoader 的 stage2 准备 RAM 空间

    • 拷贝 BootLoader 的 stage2 到 RAM 空间中

    • 设置好堆栈

    • 跳转到 stage2 的 C 入口点

  • BootLoader的stage2通常包括以下步骤

    • 初始化本阶段要使用到的硬件设备

    • 调用应用程序或启动内核


Stage 1

ARM软件设计与代码分析

Stage 1初始化流程图

  • stage 1的功能: RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用Stage 2。

  • 注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;


Stage 2

ARM软件设计与代码分析

Stage 2流程图

  • stage 2的功能:初始化串口,显示菜单,通过菜单获取用户输入,并执行相应的操作。


Bootloader8

ARM软件设计与代码分析

Bootloader更新程序流程图

  • 通过BootLoader更新程序的流程。注意为了使用Bootloader更新FLASH中的程序,需要首先将Bootloader搬迁到RAM中运行。


4193506

ARM软件设计与代码分析

嵌入式实时操作系统

  • 将在后面介绍


4193506

ARM软件设计与代码分析

板级支持包

  • BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。


4193506

ARM软件设计与代码分析

板级支持包的特点

  • 硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。

  • 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。


4193506

ARM软件设计与代码分析

板级支持包的功能


4193506

和BootLoader存在一定的重叠

ARM软件设计与代码分析

板级支持包的功能

  • 嵌入式系统初始化

    • 片级初始化

    • 板级初始化

    • 系统级初始化

  • 硬件相关的设备驱动程序


4193506

ARM软件设计与代码分析

系统级初始化

  • 这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口。


4193506

ARM软件设计与代码分析

硬件相关的驱动程序

  • 与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。

  • 尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。


Jx44b01

ARM软件设计与代码分析

JX44B0应用代码设计及中断处理

  • 连接脚本


Jx44b02

ARM软件设计与代码分析

JX44B0应用代码中断向量

  • 起始地址0x0c000008

  • 除复位异常外,其余异常入口地址由FLASH跳转得到


Jx44b03

ARM软件设计与代码分析

JX44B0中断处理流程

  • 执行0x18处指令:LDR pc, = 0x0c000020,由Bootloader控制

  • 执行0x0c000020处指令:HandlerIRQ,ramstart.s

  • 执行HandlerIRQ,ramstart.s

  • 执行HandleIRQ处保存的中断分发例程,ramstart.s中初始化为IsrIRQ


4193506

ARM软件设计与代码分析

用汇编代码编写的中断分发例程

  • 保护现场

    IsrIRQ:/*using I_ISPR register.*/

    sub lr,lr,#4

    stmfd sp!,{lr} /* 保存中断返回的PC值 */

    stmfd sp!,{r0-r4} /* 备份寄存器R0-R4 */

    sub sp,sp,#4 /* 为PC预留栈空间 */

    stmfd sp!,{r8-r9} /* 备份寄存器R8-R9 */

    ldr r9,=I_ISPR /* 读取中断状态 */

    ldr r9,[r9]

  • R9中保存中断状态


4193506

ARM软件设计与代码分析

用汇编代码编写的中断分发例程

  • 寻找中断源

    cmp r9, #0x0 /* 检查中断状态 */

    beq i2

    mov r8,#0x0 /* R8保存中断表的偏移 */

    i0: /* 逐位检查中断状态 */

    movs r9,r9,lsr #1

    bcs i1/* 如果该位等于1,则处理这一中断 */

    add r8,r8,#4/* 修改当前的中断偏移 */

    b i0 /* 处理下一比特 */

  • 找到中断则跳转到i1,R8保存找到的中断偏移

  • 未找到中断则跳转到i2


4193506

ARM软件设计与代码分析

用汇编代码编写的中断分发例程

  • 处理中断并返回

    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}^/* 中断返回,并恢复中断前的处理器模式*/

    i2:

    ldmfdsp!,{r8-r9} /* 如果当前没有任何中断,直接返回 */

    add sp,sp,#4 /* 移动堆栈指针,该空间由第4句指令预留 */

    ldmfd sp!,{r0-r4, pc}^/* 中断返回,并恢复中断前的处理器模式*/


4193506

ARM软件设计与代码分析

用C代码编写的中断分发例程

  • 函数声明

    typedef (*ISR_ROUTINE_ENTRY)(void);

    void IsrIRQ() __attribute__ ((interrupt("IRQ")));


4193506

ARM软件设计与代码分析

用C代码编写的中断分发例程

  • 函数实现

    void IsrIRQ(){

    int count = 0;

    unsigned int isr_pending;

    unsigned int isr_mask = 0x00000001;

    unsigned int isr_mask_set = rINTMSK;/* 读取中断掩码 */

    ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;

    isr_pending = (rINTPND & ~isr_mask_set);/* 读取中断状态 */

    /* 查表 */

    while(isr_mask)

    {

    if(isr_pending&isr_mask)

    {

    /* 找到中断源,获取中断例程入口地址 */

    isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));

    break;

    }

    count+=4;

    isr_mask <<= 1;

    }

    /* 调用中断服务例程 */

    if(isr_routine_entry) (*isr_routine_entry)();

    }


4193506

ARM软件设计与代码分析

中断处理例程

  • 注册例程

    *(unsigned int*)(HandleEINT0) = (unsigned int) EINT0_Isr;

  • 函数实现

    void EINT0_Isr()

    {

    rI_ISPC=BIT_EINT0;/* 清除中断标志 */

    ……

    }


  • Login