- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式系统7(ARM下的C编程)解读
volatile 不是ARM C特有的,只是ARM中比较常用 例如对I/O端口寄存器的操作 volatile unsigned int *port = (unsigned int *)0xC000; *port = value; //写端口 value = *port; //读端口 告诉编译器该变量可能在程序之外修改 编译时不能优化对volatile变量的操作 不能对volatile变量使用缓冲技术 西安电子科技大学计算机学院 * { a = 2; b= a; } 西安电子科技大学计算机学院 * { a = 2; b= 2; } { *port = 0x00; *port = 0x01; *port = 0x00; *port = 0x01; } { *port = 0x01; } 编译器可能的优化 编译器可能的优化 4 ARM连接器 ADS中包含了连接器armlink armlink可将编译得到的ELF格式的目标文件以及相关的C运行时库进行连接,最终生成ELF格式的映象文件。 西安电子科技大学计算机学院 * 目标文件的结构 * CODE DATA .text .data .bss 执行代码 常量 有初值的全局变量或静态变量 无初值的全局变量或静态变量 RO RW ZI 高地址 低地址 Linux ARM CPU 连接器的作用 将多个目标文件或库文件按照各文件中的段进行统一编址 生成一个完整的统一的地址映像 嵌入式系统中一般生成一个绝对地址映像 在有MMU(存储器管理器)的系统中可以每个任务单独分配一个地址空间 西安电子科技大学计算机学院 * 连接器的作用(图示) * RAM Based ROM Base code1 data1 const2 data2 bss2 code3 data3 code2 code1 code3 code2 const2 data1 bss3 data2 data3 bss2 bss3 RW RO Link file1.o file2.o file3.o file.out 连接器的配置原则(ARM) 映射本着RO第一、RW第二,ZI最后的原则来进行配置。在同一模块里,代码的配置要优先于数据。然后,链接器按名字字母的顺序来配置输入部分,输入部分的命名根据汇编程序的指令性管理文件来进行。 如要求对代码和数据进行精确的配置,此用户可以不受这些原则约束。通过scatterloading机制实现对代码和数据的完全配置 (具体决定目标文件的各自存放位置)。 * 5.1 加载时域和运行时域 目标文件既要参与程序链接又要参与程序执行 * 5.2 基于ROM的程序执行 * RW RO 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM Load View RW RO Execute View ZI Copy Fill with 0 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM 5.3 基于RAM的程序执行 * RW RO 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM Load View RW RO Execute View ZI Copy Fill with 0 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM 基于RAM的程序执行 * RW RO Load View RW RO Execute View ZI Copy Fill with 0 不连续 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM 0x0200 0000 0x0000 0000 ROM 0xA400 0000 0xA000 0000 RAM 5.4 Remap(地址重映射) * 为什么我们需要REMAP? 系统启动往往是从ROM开始的,所以ROM BOOT的地址必须是0地址(ARM的规定),但是直接进入ROM的速度通常比到RAM的速度慢,另外,在ROM中分配向量表后就不能在运行时对其进行修改。 调试系统初始化的一般过程 * 嵌入式系统软件开发环境图示 * 编译器 汇编器 liber 连接器 编辑 环境 软件设计 交叉开发环境IDE Monitor (调试,跟踪) 转换程序 Emulator 目 标 板 烧结程序 串口,并口,以太网,USB 项目 管理 传统的开发环境 西安电子科技大学计算机学院 * 谢谢! 嵌入式系统 第七讲 ARM下的C编程 西安电子科技大学计算机学院 * 本节内容 ARM中的C/
文档评论(0)