- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IAR中cortex-m4启动流程分析
??软件环境:windows7旗舰版,IAR V6105(EWARM-EV-WEB-6105)
ARM芯片:飞思卡尔K60N512VMD100 (cortex-m4核心)示例程序:飞思卡尔官方的 KINETIS512_SC======================
最近分析了一下飞思卡尔官方提供的k60系列demo程序在IAR上的启动流程,现写一下笔记,以备以后参考。先看一下K60N512VMD100内部存储器的分布情况,飞思卡尔K60N512VMD100有512K的flash和128k的SRAM.其中:Flash地址空间: 0-0共512kSRAM地址空间: SRAM1 0x1FFF0000--064kSRAM2 0-064k
总共的SRAM大小是128k我要在RAM中调试代码,下面以代码的执行过程为顺序分析一下启动流程。首先看一下源文件中提供的128KB_Ram.icf文件。*.icf文件是IAR中的分散描述文件,相当于ADS中的*.src文件或keil中的*.sct文件或GNU中的*.lds链接脚本文件。这个文件中前面部分是各个变量的定义,关键看后面部分:/*128KB_Ram.icf后面部分*/
***********
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__code_start__ { readonly section .noinit };
place in RAM_region { readonly, block CodeRelocate };
place in RAM_region { readwrite, block CodeRelocateRam,
block CSTACK, block HEAP };
************
①place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }
? 这段代码表示要把.intvec代码段中的只读部分放在存储空间(mem,前面已定义的名称)中__ICFEDIT_intvec_start__ 地址上,前面部分已经定义__ICFEDIT_intvec_start__=0x1fff0000,是SRAM的起始地址。也就是先把向量表放到内存中的最前面。?.intvec 这个段是在vectors.c文件中出现的,/*vectors.c片段*/
typedef void?(*vector_entry)(void);
? ? #pragma?location?=?.intvec
????const?vector_entry __vector_table[]?=?//@?.intvec?=
{
???VECTOR_000,?/*?Initial SP?*/
???VECTOR_001,?/*?Initial PC?*/
???VECTOR_002,
???VECTOR_003,
? ?......(中间省略)
???VECTOR_254,
???VECTOR_255,
???CONFIG_1,
???CONFIG_2,
???CONFIG_3,
???CONFIG_4,
};
从源文件中可以看到这里定义了一个向量表__vector_table(前面的const 很重要不能省,这样才能保证向量表是只读的),向量表中的每一项都是一个指向函数的指针,这里总共有256+4=260个指针,所以占据空间为260*4=1040=0x410.所以SRAM空间的前0x410的空间已经被向量表占据。即占据了0x1fff0000--0x1fff0410.②place at address mem:__code_start__ { readonly section .noinit }
这段代码表示要把 .noinit段中的只读部分放到地址空间?__code_start__ 开始的地址上,前面有定义?__code_start__= 0x1fff0410 ,也就是把 .noinit段放到0x1fff0410开始的地址上。所以在内存中代码就连续了,先是向量表,接着的是.noinitd 段。.noinit 段在crt0.s汇编文件中出现:SECTION .noinit : CODE
EXPORT __startup
__startup
MOV r0,#0 ; Initialize the GPRs
MOV r1,#0
MOV r2,#0
MOV r3,#0
MOV r4,#
您可能关注的文档
- how to protect our environment 保护环境.pptx
- How to write a literature review-学术英语写作.ppt
- How to protect the environment(环境保护).ppt
- How_to_Paraphrase如何进行改写.pptx
- HP Smart Storage Administrator - 配置阵列的方法.docx
- How_do_you_make_a_banana_milk_shake_全单元课件.ppt
- HPLC最终方法.doc
- HPC高性能计算 hp.ppt
- HPMV调试指导-ZLG2.doc
- HP服务器RAID配置说明书.doc
原创力文档


文档评论(0)