C程序的详细执行过程.docVIP

  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文档。上传文档
查看更多
嵌入式C语言程序的运行 2011-08-16 15:05 我们做C语言中这么多年,都知道这样一句话,C语言代码形成可执行程序,需要经过编译-汇编-链接三个阶段。背都背熟了,但是到底啥意思,每一步都会产生一些什么东西,很多人都不是太了解。今天就详细的来说说这个问题: 先看下图,在这个图中,我详细的描述了,整个过程及中间的一些步骤: 代码段,只读数据段,读写数据段,未初始化数据段属于静态区域。栈和堆属于动态区域。代码段,只读数据段和读写数据段将在连接之后产生,未初始化数据段将在程序初始化的时候开辟,而堆和栈将在程序的运行中分配和释放。 C语言程序分为映像和运行两种状态。在编译连接后形成的映像中,将只包含代码段,只读数据段和读写数据段。在程序运行之前,将动态生成未初始化数据段,在程序的运行时还将动态形成堆和栈区域。 在嵌入式系统中,程序最终是要放置在内存中运行的, 程序的几个段,最终会转化为内存中的几个区域。C语言可执行程序的内存布局如图13-5所示。 图13-5 C语言可执行程序的内存布局 在内存中,从低地址到高地址,依次是只读段、读写段、未初始化数据段、堆段、栈段。 映像文件中将包含代码段(Code)、只读数据段(RO Data)以及读写数据段(RW Data),未初始化数据段(BSS)将在程序的初始化阶段中开辟,堆栈在程序运行时动态开辟。 只读区(RO)包括了代码和只读数据,在内存区域中,代码段(Code)和只读数据段(Ro Data)的存放形式上基本没有区别。 对于程序运行时的内存使用,堆和栈一般是相向扩展的。堆的分配由程序决定,栈由编译器管理。 在以上概念中,只是一种内存分布,并没有考虑实际系统的情况。在实际的系统中,程序有载入和运行两个概念。嵌 入式系统由两种内存,一种是可以固化只读的内存(如:ROM,Nor Flash),另一种是易失的可读写的内存(如:SRAM和SDRAM)。程序中的各个段也有需要固化和需要读写的。程序中的各段必须载入到内存的恰当位 置,程序才可以运行。C语言各部分的需要固化和可写的情况如表13-2所示。 表13-2 C语言各部分的需要支持固化和可写的情况 段 需要固化 需要可写 代码(Code) 是 否 只读数据(RO data) 是 否 读写数据(RW data) 是 是 未初始化数据(BSS) 否 是 堆(heap) 否 是 栈(stack) 否 是 在嵌入式系统中,经过编译的C语言程序可以通过操作系统运行,也可 以在没有操作系统的情况下运行。程序存放的位置和运行的位置通常是不一样的。 一般情况下,经过编译后的程序存储在Flash或者硬盘中,在运行时需要将程序加载到RAM中。嵌入式系统的 Nor Flash和硬盘还有一定的差别,在硬盘的程序必须加载到RAM中才可以运行,但是在Nor Flash中的程序可以通过XIP(eXcutive In Place)的方式运行。 在嵌入式系统中,C语言程序的运行包括3种类型:第 一种是调试阶段的程序运行,这个阶段程序存放的位置和运行的位置是相同的;第二种是程序直接在Flash中运行(XIP);第三种是将Flash或者硬盘 中的程序完全加载到RAM中运行。 在C语言程序的运行中,存在着两个基本的内存空间, 一个是程序的存储空间,另一个是程序的运行空间。程序的存储空间必须包括代码段、只读数据段和读写数据段,程序的加载区域必须包括读写数据段和未初始化数 据段如表13-3所示。 表13-3 C语言各部分使用的存储空间 段 代码 只读数据 读写数据 未初始化数据 程序的存储空间(ROM) 需要 不需要 程序的加载空间(RAM) 不需要 需要 由于程序放入系统后,必须包括所有需要的信息,代码表示要运行的机 器代码,只读数据和读写数据包含程序中预先设置好的数据值,这些都是需要固化存储的,但是未初始化数据没有初值,因此只需要标示它的大小,而不需要存储区 域。 在程序运行的初始化阶段,将进行加载动作,其中读写 数据和未初始化数据都是要在程序中进行“写”操作,因此不可能放在只读的区域内,必须放入RAM中。当然,程序也可以将代码和只读数据放入RAM。 在程序运行后,堆和栈将在程序运行过程中动态地分配 和释放。 13.4.1 RAM调试运行 本节介绍程序的一种特殊的运行方式,即在程序的调试 阶段将主机的映像文件直接放置到目标系统的RAM中。在这种应用中,RAM既是程序的存储空间,也是程序的运行空间。 在嵌入式系统中,这是一种常用的调试方式,而不是通常的运行方式。在通常的运行方式下,程序运行的起始地址一 般不可能是RAM。RAM在掉电之后内容会丢失,因此系统上电的时候,RAM中一般不会有有效的程序。但是在程序的调试阶段,可以将程序直接载入RAM

文档评论(0)

中华书局 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档