使用ads12进行嵌入式软件开发(下).pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

158****6415 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档