- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用 ADS1.2 进行嵌入式软件开发 (下)
上期主要介绍了基于 ARM 的嵌入式系统软件开发中,怎样来对必要的C 库函数
进行移植和重定向,以及如何根据不同的目标存储器系统进行程序编译和连接
设置。本期介绍程序中的存储器分配和如何根据设置正确初始化系统。
放置堆栈和 heap
Scatterloading 机制提供了一种指定代码和静态数据布局的方法。下面介绍如
何放置应用程序的堆栈和 heap。
* _user_initial_stackheap 重定向
应用程序的堆栈和 heap 是在 C 库函数初始化过程中建立起来的。可以通过重定
向对应的子程序来改变堆栈和heap 的位置,在ADS 的库函数中,即
_user_initial_stackheap()函数。
_user_initial_stackheap()可以用 C 或汇编来实现,它必须返回如下参数:
r0:heap 基地址;
r1:堆栈基地址;
r2:heap 长度限制值 (需要的话);
r3:堆栈长度限制值。
当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),否
则连接器会报错:
Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from
sys_stackheap.o)
*存储器模型
ADS 提供了两种实时存储器模型。缺省时为 one-region,应用程序的堆栈和
heap 位于同一个存储器区块,使用的时候相向生长,当在 heap 区分配一块存
储器空间时需要检查堆栈指针。另一种情况是堆栈和 heap 使用两块独立的存储
器区域。对于速度特别快的 RAM,可选择只用来作堆栈使用。为了使用这种
two-region 模型,用户需要导入符号 use_two_region_memory,heap 使用需要
检查 heap 的长度限制值。
对这两种模型来说,缺省情况下对堆栈的生长都不进行检查。用户可以在程序
编译时使用 -apcs/swst 编译器选项来进行软件堆栈检查。如果使用 two-
region 模型,必须得在执行_user_initial_stackheap 时指定一个堆栈限制
值。
图9 重定向_user_initial_stackheap()
图 10 基本初始化过程
图 11 ROM/RAM 重定向和映射
表 1
系统复位和初始化
目前情况,一般假设程序从C 库函数的初始化入口_main 开始执行。实际上,
所有的嵌入式程序在启动时都要执行一些系统级的初始化操作。在此讨论这方
面的内容。
初始化过程
图 10 中显示了一个基于ARM 的嵌入式系统的基本初始化过程。可以看到,在
_main 之前加入了一个复位处理模块 reset handler,它在系统上电复位时立即
启动。标识为$sub$$main 的新代码块在进入主程序之前执行。
复位处理模块 reset handler 通常是一小段汇编代码,在系统复位时执行。它
至少完成应用程序中使用到的所有处理器模式的堆栈初始化工作。对于含有本
地存储器系统的内核 (比如含cache 的ARM 内核),配置工作也必须在这一段初
始化过程中完成。当完成系统初始化之后,通常程序会跳向_main,开始C 库函
数的初始化过程。
系统初始化过程一般还包括另外一些内容,中断使能等,这些大多安排在 C 库
函数的初始化完成之后执行。$sub$$main()完成这部分功能。
向量表(vector table)
所有的 ARM 系统都有一张中断向量表当出现异常需要处理时,必须调用向量
表。向量表一般要位于 0 地址处。
表 2
表 3
表 4
表 5
表 6
表 7
表 8
表 9
表 10
存储器配置
*ROM/RAM 重定向
当系统启动的时候,为了保证 0 地址处有正确的启动代码存在,需要非易失性
的存储器。
一种简单的方法,就是把系统 0x0000 开始的一块地址分配给 ROM。其缺点是,
由于ROM 的访问速度比RAM 慢很多,当执行中断响应需要从中断向量表跳转
时,会给系统性能带来损失;同时,在 ROM 中的向量表内容也不能被用户程序
动态修改。
另外一种可行的方案如图 11 所示。ROM 位于地址 0x1000 开始的地方,但是在
系统复位时又被存储器控制器映射到 0x0000 地址处。这样当系统启动之后,在
地址 0x0000 看到的是 ROM,系统执行这块ROM 中的启动代码,启动代码跳转到
真正的 ROM 的地址,并让存储器控制器移除对ROM 的地址
文档评论(0)