ARM嵌入式软件开发50页PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TM
1
1
PC软件的构造 定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE
TM
议程
2
2
ADS默认的标准C库
C Library
ANSI C
input/ output
error handling
stack & heap setup
TM
ANSI C
input/ output
User Code
Target Hardware
7
7
重定向C库函数(2)
要重定向C库函数,简单的办法是使用你自己的可执行的semihosting SWIs来代 替原来的C库函数,从而来满足你的系统要求 比如说, the printf()系列函数(sprintf()除外) 都会调用fputc(). 在默认情况 下fputc()的执行使用了semihosting SWI. 用下面的语句来代替:
__main
copy code and data zero uninitialized data
__rt_entry
set up application stack and heap initialize library functions call top-level constructors (C++)
file (peripherals.ami)
RW
default = 0x08000000
Multi-ICE => from debugger
internal variable $top_of_memory
RO
default = 0x80000
链接时确定 0x8000
TM
4
4
程序入口点
C Library
other
应用程序调用的C库 函数 eg: fputc()
设备驱动层 使用semihosting SWI’s eg: _sys_write()
Debug Agent
Semihosting Support
调试工具环境
C库函数功能是支持PC软件的,而目标板上的可执行软件则依赖相关的硬件资源; 在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。
Exit from application
应用程序启动
User Code
main( )
causes the linker to pull in library initialization code
TM
5
5
一个PC软件的构造 定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE
TM
8
8
消除C库函数中的semi hosting
为了确保在连接时没有函数使用了semi hosting SWIs ,你可以在程序中加入 下面的句子:
#pragma import(__use_no_semihosting_swi)
如果在程序中仍然使用了semihosting ,编译时将会报错:
Error: Symbol __semihosting_swi_guard multiply defined
修改: 如果使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后: 提供你自己可运行的功能函数。
在ADS 1.2 编译器和库函数手册, 表4-2给出了所有使用了semihosting的C库函 数。
注意: 连接器在用户自己的应用代码中不会出现任何有关 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 的吗?…...
TM
Agenda
6
6
重定向C库函数 (1)
你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动。 Eg: printf( ) 可打印到LCD上,而不是打印控制台上
C Library
ANSI C
input/ output
Debug Agent
Semihosting Support
Retarget
在一个实际应用当中,你可能并不想在0x8000处开始运行。 大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交 叉出现的。 分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法 分散加载定义了两种类型的存储器区域。 Load 区: - 在reset/load时保留了应用程序的代码和数据 (典型应用为 ROM). Execution 区 – 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。
TM
3
3
ADS默认的存储器映射
在默认的情况下,我们链接、定位、 运行在0x8000
Stack
heap 被直接放置在数据区的上面
由调试环境提 供
Heap(malloc,alloc)
堆栈的基地址是通过调试环境从C库
函数的Startup Code 里读取出来的。
ZI
ARMulator => from configuration
嵌入式开发过程
hello world
“PC软件”
独立的嵌入式应用
当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于 “HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他 移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:
硬件环境中所使用的C库函数 目标板上的存储器资源 应用程序的初始化