ARM嵌入式软件开发50页PPT

合集下载

1ARM和嵌入式系统介绍PPT课件

1ARM和嵌入式系统介绍PPT课件

ARM Cortex
ቤተ መጻሕፍቲ ባይዱ
A应用处理器(Application Processor )系列 R实时控制处理(Real Time Control )系列 M微控制器(Micro Controller )系列
2021
10
1. ARM7微处理器系列
该系列包括ARM7TDMI、ARM7TDMI-S、带有高速 缓存处理器宏单元的ARM720T和扩充了Jazelle的 ARM7EJ-S。该系列处理器提供Thumb 16位压缩指 令集和EmbeddedICE软件调试方式,适用于更大规 模的SoC设计中。
2021
8
1.1.3 ARM微处理器系列
ARM公司开发了很多系列的ARM处理器核,目前最 新的系列是Cortex,而ARM6核以及更早的系列已经很 罕见了。当前应用比较多的ARM处理器核系列有:
V4T版本
V5TE版本
V6版本 V7、V8版本
ARM7
ARM9
ARM9E
ARM10E
ARM11
Cortex
Intel StrongARM
Xscale
T变量代表支持16位Thumb指令集; E变量代表增强型(Enhanced)DSP算法指令。
2021
9
ARM公司在经典处理器ARM11以后的产品改用 Cortex命名,基于ARM V7、V8版本的ARM Cortex系 列产品由A、R、M三个系列组成,具体分类延续了一 直以来ARM面向具体应用设计CPU的思路。
授权,因此既使得ARM技术获得更多的第三方工具、制造、软
件的支持,又使得整个系统成本降低,使产品更容易被消费者
所接受,更具有竞争力。
2021
6
1.1.2 ARM微处理器的应用领域及特点

基于ARM的嵌入式系统硬件结构设计PPT课件

基于ARM的嵌入式系统硬件结构设计PPT课件
SRAM对5号存储块是否使用UB/LB控制位。 0 = 不使用UB/LB (引脚对应nWBE[3:0]); 1 = 使用UB/LB (引脚对应nBE[3:0])。
第22页/共141页
初始值 0
0 0 0
0 0 0
5.1.1 存储器控制器
WS5 DW5 ST4
WS4 DW4 ST3
WS3 DW3
[22] [21:20] [19]
起始 _ffff
_ffff
_ffff
_ffff
_ffff
7号地址
地址 0x3020 起始 _0000
0x3040 _0000
0x3080 _0000
0x3100 _0000
0x3200 _0000
结束 0x303f 0x307f 0x30ff 0x31ff 0x33ff
地址 _ffff
_ffff
_ffff
第1页/共141页
Samsung S3C44B0X
• Samsung S3C44B0X微处理器是三星公司专为手持 设备和一般应用提供的高性价比和高性能的微控制 器解决方案,它使用ARM7TDMI核,工作在66MHZ。
• 芯片还集成了8KB Cache、外部存储器控制器、 LCD控制器、4个DMA通道、2通道UART、1个多主 I2C总线控制器、1个IIS总线控制器,5通道PWM定 时器及一个内部定时器、71个通用I/O口、8个外部 中断源、实时时钟、8通道10位ADC等。
第8页/共141页
AMBA(Advanced Microcontroller Bus Architecture) 可将 RISC处理器集成在其它 IP芯核和外设中,
2.0版AMBA标准定义了 三组总线:AHB(高性能 总线)、ASB(系统总线)、 和APB(AMBA外设总线)。

5.基于ARM的嵌入式程序设计ppt课件

5.基于ARM的嵌入式程序设计ppt课件

#else
#undef 宏标识符
#define 宏标识符 宏体 #define 宏标识符 宏体
#endif
#endif
;.
19
条件编译
条件编译伪指令是写给编译器的, 指示编译器在满足某一条件时仅编 译源文件中与之相应的部分。其格 式如右框中所示:
#if(条件表达式1) …
#elif(条件表达式2) …
它占据32位指令域的高四位,如下图所示
循环的退出。
ቤተ መጻሕፍቲ ባይዱ;.
转移 B BAL BEQ BNE BPL BMI BCC BLO BCS BHS BVC BVS BGT BGE
BLT BLE
BHI BLS
解释 无条件的 总是 相等 不等 正 负 无进位 低于 有进位 高于或相等 无溢出 有溢出 大于 大于或相等
;.
6
举例说明ARM汇编语言源程序的基本结构
AREA EXAMPLE,CODE,READONLY ENTRY start MOV r0,#10 MOV r1,#3 ADD r0,r0,r1 END
本程序的程序体部分实现了一个简单的加法运算。
;.
7
5.2.3 ARM汇编语言编程的重点
ARM数据处理操作 设置条件码 汇编语言子程序调用及返回 跳转表思想 ARM与Thumb之间的状态转换及函数的相调用
;.
21
嵌入式程序设计中的函数及函数库
函数库是为了减少编程工作量,将一些常用的功能的函数放在函数库中供公 共使用。 它包括C的标准库函数,也包括一些用户自己编写非标准库。 例如, 44blib.h 是根据基于S3C44B0X处理器的开发板及其功能模块编写的 一个C语言函数库。它不属于C语言的标准库。

ARM和嵌入式技术_培训课件_第5章.ppt

ARM和嵌入式技术_培训课件_第5章.ppt

应用示例(源程序):
编译后的反汇编代码:
...
ADRL R0,Delay
...
Delay
MOV
R0,r14
...
使用伪指令将程序标号 Delay的地址存入R0
... 0x20 ADD 0x24 ADD
... 0x68 MOV
...
r1,pc,#40 r1,r1,#0
r0,r14
地址
程序代码
• ARM伪指令——中等范围的地址读取ADRL
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编 译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能 用两条指令实现,则产生错误,编译失败。
应用示例(源程序):
第5章 ARM汇编语言程序设计
5.1 ARM伪指令
▪ 概述
ARM伪指令不属于ARM指令集中的指令,是为 了编程方便而定义的。伪指令可以像其它ARM指令 一样使用,但在编译时这些指令将被等效的ARM指 令代替。ARM伪指令有四条,分别为ADR伪指令、 ADRL伪指令、LDR伪指令、NOP伪指令。
• ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址 值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替 换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该 ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
应用示例(源程序):
...
ADRL R0,Delay
应用示例(源程序):
...
ADRL R0,Delay

ARM嵌入式LINUX应用程序设计PPT课件

ARM嵌入式LINUX应用程序设计PPT课件
内存分配与释放的数据结构2030linuxkfree它们用于分配和释放连续的内存空间blocksizepagedescriptorsizeskfree分配和释放内存block为单位进行的可以分配的空闲块的大小记录在blocksize表中它是一个静态数组linux设置了sizes数组对页面块进行描述数组元素是sizedescriptor结构体blocksizesizes元素数目相同它们一一对应sizes管理的各个页面块中每个块的头blockheader数控冲床冲压件数控冲床落料后再数控折弯件普通冲床开模冲压件剪板机落料及其它加工方式成形的钣金件点焊氩弧焊组焊件拉铆组件等其它方式加工而成的金属零件或组件
嵌入式软件测试中经常用到的测试工具: ➢ 内存分析工具 ➢ 性能分析工具 ➢ 覆盖分析工具 ➢ 缺陷跟踪工具
2021/3/18
15
嵌入式Linux面临的挑战
1
2
3
Linux的实时 扩充性
改变Linux内核 体系结构
完善Linux的集 成开发环境
Solution
➢ 扩展 Linux 的实时 性能
向外扩展 向上扩展
页式存储管理机制 页表
硬件无关部分
进程的映射和逻辑内存的对换
硬件相关部分
为内存管理硬件提供了虚拟接口
每个进程保留一张页表,用于将本进程 空间中 的虚拟地址变换成物理地址。
2021/3/18
20
进程调度
当需要选择下一个进程运行时,由调度程序选择最值得运行的进程,依 据每个进程的task_struct结构
交叉开 发环境
开放类型
GNU工具链
➢ 常用的交叉开发环
境主要有开放和商
业两种类型。开放 Metrowerks CodeWarrior

第3章 基于ARM的嵌入式软件开发基础.ppt

第3章 基于ARM的嵌入式软件开发基础.ppt
语句段1 ELSE
语句段2 ENDIF IF、ELSE、ENDIF伪指令是条件分支伪指令,能根据条件的成立与
否决定是否执行某个语句。伪指令IF可以对条件进行判断;伪指令 ELSE产生分支;伪指令ENDIF定义分支结束。
当IF后面的逻辑表达式为真,则执行语句段1,否则执行语句段2。其 中,ELSE及语句段2可以没有,此时,当IF后面的逻辑表达式为真, 则执行指令序列1,否则继续执行后面的指令。
LCLA(LCLL或LCLS) 局部变量名 LCLA、LCLL和LCLS伪指令是声明局部变量伪指令,用于定义一个 ARM程序中的局部变量,并将其初始化。 其中: LCLA用于声明一个局部的数字变量,并初始化为0; LCLL用于声明一个局部的逻辑变量,并初始化为F(假); LCLS用于声明一个局部的字符串变量,并初始化为空。对于局部 变量来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个 变量的宏指令程序段内。
其中,表达式可以为程序标号或数字表达式。DCD也可用 “&”代替。
伪指令DCD用来为字分配一段对准的内存单元,并用 指定的数值或标号初始化;伪指令DCDU用来为字分配一 段可以非对准的内存单元,并用指定的数值或标号初始化。
指令示例: DATA1 DCD 4,5,6 ;分配一片连续的字存储单元并初始化。 DATA2 DCDU LOOP ;为LOOP标号的地址值分配一个内存单元。
局变量来说,变量名在源程序中必须是唯一的。
指令示例: GBLA DATE1
;声明一个全局数字变量DATE1 GBLL DATE1
;声明一个全局逻辑变量DATE2 GBLS DATA3
;声明一个全局的字符串变量DATE3 DATE3 SETS “Testing”

《嵌入式软件开发》课件

《嵌入式软件开发》课件
VxWorks
VxWorks是一种实时操作系统,广泛应用于航空航天、军事等领域。 它具有高度的可靠性和实时性,能够满足严苛的实时任务需求。
03
Android
Android是一种基于Linux的开源操作系统,主要用于移动设备。由于
其开放性和丰富的应用生态,Android也被广泛应用于嵌入式领域,如
智能家居、物联网设备等。
数据加密、数据备份与恢复
数据安全与隐私保护问题是嵌入式软 件开发中不可忽视的问题之一。由于 嵌入式系统通常涉及到敏感数据和隐 私信息,如果程序中存在数据泄露或 数据损坏问题,会导致严重的信息安 全和隐私侵犯问题。
解决方案: 对敏感数据进行加密处理 ,使用数据备份与恢复机制,确保数 据的完整性和安全性。同时加强用户 隐私保护意识,避免敏感信息的泄露 和滥用。
时钟管理问题
时钟不准确、时钟同步
时钟管理问题也是嵌入式软件开发中常见的问题之一。由于嵌入式系统 的时钟资源有限,如果程序中存在时钟不准确或时钟同步问题,会导致
系统时间错误或数据采集错误。
解决方案: 使用高精度时钟源,优化时钟配置,实现时钟同步和校准, 确保系统时间的准确性。
多任务并发问题
01
任务优先级、任务同步
外设接口
用于连接外部设备,扩展嵌入 式系统的功能。
嵌入式系统的软件架构
操作系统
负责资源管理和任务调度,提供系统服务。
驱动程序
用于管理硬件设备,实现与操作系统的通信 。
应用程序
实现特定功能的软件,直接与硬件交互。
嵌入式中间件
提供跨平台的通信和数据交换服务。
嵌入式软件开发工具与环境
IDE(集成开发环境)
《嵌入式软件开发》PPT课 件

ARM嵌入式开发实例解析PPT教学课件

ARM嵌入式开发实例解析PPT教学课件

名公司Keil(现已并入
ARM公司)开发嵌入式
微控制器软件开发平台,
也是目前ARM嵌入式单片
机开发的主流工具。在该
软件平台中,uVision的
界面与微软VC++的界面类
似,具有友好的人机交互
环境,启动界面如右图所
示。
第18页/共28页
18
RealView MDK用户操作界面
• 在uVision开发工具链中 包含了指令模拟器,用户 可以通过使用该功能来模 拟“纯粹”的ARM嵌入式 代码,即用户不需要外部 硬件平台的支持也可以在 软件平台中模拟代码的运 行,基本的界面框架如右 图所示。
嵌入式系统开发要点
它分散在有通信连接的宿主机与目标机环境之中:
• 宿主机(Host)是一台通用计算机,一般是PC机。它通过串口或网 络连接与目标机通信。
• 目标机(Target) 可以是嵌入式应用软件的实际运行环境(可以是 能替代实际环境的仿真系统)
典型的开发环境
源程序 目标文件
第9页/共28页
可执行文件
• 优点:简单方便,不需要目标板,成本低 • 缺点:功能非常有限,无法实时调试 大多数调试工具都提供Simulator功能
第12页/共28页
• 软件调试(Debugger)(监控器方式)
主机和目标板通过某种接口(通常是串口)连接,主机 上提供调试界面,待调试软件下载到目标板上运行。
这 种 方 式 的 先 决 条 件 是 要 在 H o s t 和 Ta r g e t 之 间 建 立 起 通信联系(目标板上称为监控程序Monitor)
• 优点:纯软件,价格较低,简单,软件调试能力较强
• 缺点:需要事先烧制Monitor(往往需多次试验才能

ARM嵌入式软件开发--程序员联合开发网课件 (二)

ARM嵌入式软件开发--程序员联合开发网课件 (二)

ARM嵌入式软件开发--程序员联合开发网课件 (二)ARM嵌入式软件开发--程序员联合开发网课件- ARM嵌入式软件开发的基础知识ARM处理器是一种32位RISC处理器,具有高效的指令集和低功耗特性,广泛应用于嵌入式系统中。

在ARM嵌入式软件开发中,需要掌握C语言、汇编语言、操作系统和硬件知识等基础知识。

- ARM Cortex-M系列处理器ARM Cortex-M系列处理器是一种低功耗、高性能的32位RISC处理器,广泛应用于嵌入式系统中。

在ARM Cortex-M系列处理器的开发中,需要掌握寄存器、中断、时钟、GPIO等基础知识。

- ARM嵌入式软件开发的开发工具在ARM嵌入式软件开发中,需要使用到各种开发工具,如编译器、调试器、仿真器、烧录器等。

常用的ARM嵌入式软件开发工具有Keil、IAR、GCC等。

- ARM嵌入式软件开发的调试技巧在ARM嵌入式软件开发中,调试是一个非常重要的环节。

常用的调试技巧有断点调试、printf调试、仿真器调试等。

- ARM嵌入式软件开发中的RTOSRTOS是实时操作系统的缩写,是一种专门针对嵌入式系统设计的操作系统。

在ARM嵌入式软件开发中,常用的RTOS有FreeRTOS、ucOS等。

- ARM嵌入式软件开发中的驱动程序驱动程序是连接硬件和软件的桥梁,在ARM嵌入式软件开发中非常重要。

常用的驱动程序有GPIO驱动、UART驱动、SPI驱动等。

- ARM嵌入式软件开发中的应用案例ARM嵌入式软件开发应用广泛,涉及到各种领域,如智能家居、智能医疗、智能交通等。

在ARM嵌入式软件开发中,需要结合实际应用场景,进行系统设计和开发。

- ARM嵌入式软件开发的未来发展随着物联网和人工智能等技术的发展,ARM嵌入式软件开发将有更广阔的应用前景。

未来ARM嵌入式软件开发将更加注重低功耗、高性能、高可靠性等方面的发展。

嵌入式系统基础 第6章--ARM程序设计ppt课件

嵌入式系统基础 第6章--ARM程序设计ppt课件

可编辑课件PPT
23
可编辑课件PPT
24
下面是一段从ARM指令程序段跳转到 Thumb指令程序的状态切换例程。
;ARM指令程序 CODE32
….. ADD R0,Into_Thumb +1 BX R0 …..
;Thumb指令程序 CODE16 Into_Thumb …….
可编辑课件PPT
25
下面是一段从Thumb 指令程序段跳转 到ARM指令程序的状态切换例程。
Back_to_ARM
; Thumb 指令程序 CODE16
….. ADD R5,Back_to_ARM BX R0
….. ; ARM指令程序
CODE32 …….
可编辑课件PPT
26
6.2.3 循环程序设计
当条件满足时,需要重复执行同一个 程序段做同样工作的程序叫做循环程序。
被重复执行的程序段叫做循环体,需 要满足的条件叫做循环条件。
跳转
硬件初始化的汇编语 言程序(特权模式) B main
完成用户任务的 C/C++程序(用户模式)
可编辑课件PPT
39
6.3.1 初始化程序部分
由于在用于完成初始化任务的汇编语 言程序中需要在特权模式下做一些诸如修 改CPSR等特权操作,所以不能过早地进入 用户模式。
通常,初始化过程大致会经历如下所 示的一些模式变化。
可编辑课件PPT
3
汇编语言 源文件 汇编器 目标文件
可编辑课件PPT
C/C++语言 源文件 编译器
目标文件
连接器
可执行文件
4
头文件 C/C++库文件
ARM提供的开发工具Code Warrior for ARM中包含的编译器如下:

最新ARM嵌入式软件开发课件PPT

最新ARM嵌入式软件开发课件PPT
如果在程序中仍然使用了semihosting ,编译时将会报错:
Error: Symbol __semihosting_swi_guard multiply defined
修改: 如果使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后: 提供你自己可运行的功能函数。
66v06 Embedded Software Development
TM
9
9
消除C库函数中的semi hosting
为了确保在连接时没有函数使用了semi hosting SWIs ,你可以在程序中加入 下面的句子:
#pragma import(__use_no_semihosting_swi)
Semihosting Support
66v06 Embedded Software Development
Retarget
TM
ANSI C
input/ output
User Code
Target Hardware
8
8
重定向C库函数(2)
要重定向C库函数,简单的办法是使用你自己的可执行的semihosting SWIs来代 替原来的C库函数,从而来满足你的系统要求 比如说, the printf()系列函数(sprintf()除外) 都会调用fputc(). 在默认情况 下fputc()的执行使用了semihosting SWI. 用下面的语句来代替:
在ADS 1.2 编译器和库函数手册, 表4-2给出了所有使用了semihosting的C库函 数。

【课件】用ARM标准C库进行嵌入式应用程序开发PPT

【课件】用ARM标准C库进行嵌入式应用程序开发PPT
◇调用_rt_stackheap_init()建立堆和栈; ◇调用_rt_lib_init()初始化引用的库函数;如果需要,建立main() 函数的参数argc和argv等; ◇调用main()函数,执行应用程序,可以应用库函数; ◇用main()函数的返回值作参数调用exit()。
_rt_entry并不是C函数,它是用arm C库编程的起始点。 _rt_entry不能用C语言宴现,因为这时候堆栈还没有建立,堆栈 由_ rt_stackheap_init()来建立。
1#43;+标准库,本文仅讨论ANSI C库,该 库包含下面几个部分: ◇IS0 C库标准所定义的函数; ◇在semlhosted环境下用来实现C库函数与目标相关的函数; ◇C和C++编译器要使用的heIper函数。
该库提供的诸如文件输入输出之类的设备,使用了标准的ARM semihosted执行环境(semihosting是针对ARM目标机的一种机 制,它能够根据应用程序代码的输入/输出请求,与运行有调度功 能的主机通信,这种技术允许主机为通常没有输入和输出功能的 目标硬件提供主机资源)。ARMulator、Angel和Multi-lCE都支持 这个环境,可以使用ADs中提供的开发工具开发应用程序,然后 在armulator或者是开发板上运行和调试该程序。如果要使应用系 统独立于这个环境,则必须重新实现C库中依赖于这个环境的相关 函数,根据用户系统的运行环境对C库进行适当的裁减。
上面简单介绍了C程序使用库函数时的调用过程,由_rt— stackheap_init()建立C库使用的内存模型--堆和栈。因为 arm库是建立在semihosted执行环境的,它实现的内存模型是 基于这个环境的,所以必须修改这个内存模型建立机制。表1列 出了需要重新实现的函数,实现了这些函数,应用程序就可以 脱离宿主机环境独立运行了。其中,必须重新实现的是_user initial_stackheap(),因为默认的实现是基于semihosted执行 环境的,该函数被_n_stackheap_init()调用创建内存模型, 其他两个函数没有默认的实现。

第五章基于ARM的嵌入式程序设计PPT优秀课件

第五章基于ARM的嵌入式程序设计PPT优秀课件
第五章 基于ARM的嵌入式程序设计
嵌入式系统程序设计是嵌入式系统开 发的重点,本章将主要介绍如何运用 ARM指令并结合高级语言来进嵌入式程 序设计。
2021/6/3
1
第五章基于ARM的嵌入式程序设计
5.1 ARM汇编语言的伪操作、宏指令与伪指令 5.2 ARM汇编语言程序设计 5.3 嵌入式C语言程序设计基础 5.4 嵌入式C语言程序设计实例 5.5 嵌入式C语言程序设计技巧 5.6 C与汇编语言混合编程
分配一段字内存单元。 分配一段字对齐的字内存单元。 为双精度的浮点数分配字对齐的内存单元。 为单精度的浮点数分配字对齐的内存单元。 在ARM代码中分配一段字对齐的内存单元; 在Thumb代 码中,分配一段半字对齐的半字内存单元。
DCQ/ DCQU
{label} DCQ{U}{﹣} 分配一段以双字(8个字节)为单位的内存 literal{,{﹣}literal}…
2021/6/3
2
5.1 ARM汇编语言的伪操作、宏指令与伪指令
ARM汇编语言源程序中的语句由指 令、伪操作、伪指令和宏指令组成。
第3章中已经具体介绍了ARM指令,本节 将针对伪操作和伪指令展开讨论。
伪指令与伪操作一样,也是ARM汇 编语言程序里的特殊指令助记符。伪指 令要实现指令操作,需在汇编过程中通 过合适的机器指令替换成ARM指令。
CP
name CP expr
为一个协处理器定义名称。
DN/SN
name DN/SN expr
DN/SN为一个双精度/单精度的VFP寄存器定义名称。
FN 2021/6/3name FN expr
为一个FPA浮点寄存器定义名称。
8
数据定义伪操作
伪操作
语法格式
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意: 连接器在用户自己的应用代码中不会出现任何有关 semihosting SWI使 用的报告。
TM
9
9
一个PC软件的构造 定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE
TM
Agenda
10
10
分散加载(Scatterloading)
extern void sendchar(char *ch);
int fputc(int ch, FILE *f) { /* e.g. write a character to an LCD */
char tempch = ch; sendchar(&tempch); return ch; }
可查看在ADS Embedded example目录下的retarget.c,可看到更多的重定向例子 你可以确定有不在连接时使用semihosting SWI 的吗?…...
other
应用程序调用的C库 函数 eg: fputc()
设备驱动层 使用semihosting SWI’s eg: _sys_write()
Debug Agent
Semihosting Support
调试工具环境
C库函数功能是支持PC软件的,而目标板上的可执行软件则依赖相关的硬件资源; 在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。
TM
1
1
PC软件的构造 定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE
TM
议程
2
2
ADS默认的标准C库
C Library
ANSI C
input/ output
error handling
stack & heap setup
TM
3
3
ADS默认的存储器映射
在默认的情况下,我们链接、定位、 运行在0x8000
Stack
heap 被直接放置在数据区的上面
由调试环境提 供
Heap(malloc,alloc)
堆栈的基地址是通过调试环境从C库
函数的Startup Code 里读取出来的。
ZI
ARMulator => from configuration
file (pe= 0x08000000
Multi-ICE => from debugger
internal variable $top_of_memory
RO
default = 0x80000
链接时确定 0x8000
TM
4
4
程序入口点
C Library
TM
Agenda
6
6
重定向C库函数 (1)
你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动。 Eg: printf( ) 可打印到LCD上,而不是打印控制台上
C Library
ANSI C
input/ output
Debug Agent
Semihosting Support
Retarget
TM
8
8
消除C库函数中的semi hosting
为了确保在连接时没有函数使用了semi hosting SWIs ,你可以在程序中加入 下面的句子:
#pragma import(__use_no_semihosting_swi)
如果在程序中仍然使用了semihosting ,编译时将会报错:
Error: Symbol __semihosting_swi_guard multiply defined
Exit from application
应用程序启动
User Code
main( )
causes the linker to pull in library initialization code
TM
5
5
一个PC软件的构造 定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE
__main
copy code and data zero uninitialized data
__rt_entry
set up application stack and heap initialize library functions call top-level constructors (C++)
修改: 如果使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后: 提供你自己可运行的功能函数。
在ADS 1.2 编译器和库函数手册, 表4-2给出了所有使用了semihosting的C库函 数。
TM
ANSI C
input/ output
User Code
Target Hardware
7
7
重定向C库函数(2)
要重定向C库函数,简单的办法是使用你自己的可执行的semihosting SWIs来代 替原来的C库函数,从而来满足你的系统要求 比如说, the printf()系列函数(sprintf()除外) 都会调用fputc(). 在默认情况 下fputc()的执行使用了semihosting SWI. 用下面的语句来代替:
在一个实际应用当中,你可能并不想在0x8000处开始运行。 大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交 叉出现的。 分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法 分散加载定义了两种类型的存储器区域。 Load 区: - 在reset/load时保留了应用程序的代码和数据 (典型应用为 ROM). Execution 区 – 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。
嵌入式开发过程
hello world
“PC软件”
独立的嵌入式应用
当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于 “HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他 移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:
硬件环境中所使用的C库函数 目标板上的存储器资源 应用程序的初始化
相关文档
最新文档