没有合适的资源?快使用搜索试试~ 我知道了~
周立功NXP_LPC21xx22xx_系列ARM启动代码和分散加载程序分解
3星 · 超过75%的资源 需积分: 33 12 下载量 152 浏览量
2013-12-27
14:15:40
上传
评论
收藏 68KB DOCX 举报
温馨提示
试读
36页
周立功NXP_LPC21xx22xx_系列ARM启动代码和分散加载程序分解
资源推荐
资源详情
资源评论
周立功 系列 芯片的启动程序分解
关于 启动程序分散加载描述文件的叙述
在 的启动模板中有一个 文件夹,其中有 、、这
个文件,这 个文件是 的
分散加载机制,其目的是将代码段和数据段分别定位到指定地址上。可以在 中选择加载路径。
分散装载技术概述:
分散装载技术可以把用户的应用程序分割成多个 只读!运行域和 " 可读写!运行域 一个存储区域块!,
并且给它们制定不同的
地址。一个嵌入式系统中,#$%、&位 、位 都可以存在于系统中,所以,将不同功能的
代码定位在特定的位置会大大地提
高系统的运行效率。下面是最为常用的 种情况:
、位的 运行速度很快,因此就把中断服务程序作为一个单独的运行域,放在 位的 ,
使它的响应时间达到最快。
、程序在 中运行,其效率要远远高于在 中运行,所以将启动代码 '(()$(*!以外的所有
代码都复制在 中运行,
可以提高运行效率。
分散装载技术主要完成了 个基本的功能:
如何分散。就是如何将输入段组成输出段和域。
如何装载。就是确定装载域和运行域在存储空间里的地址是多少。
域可以分为装载域和运行域
装载域描述运行前输出段和域在 里的分布状态,运行域描述了运行时输出段和域
在 里的分布状态。大多数情况下,
映像文件在执行前把它装载到 里,而当运行时,域里的有些输出段 比如 "类型的输出段!必须复
制到 里,程序才能正常运行,
所以,在装载和运行时,"类的输出段处在不同的位置 地址空间!。
))+$分散加载文件:
在 ))+$中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,)$)(*,
的存储区块可以分成二种类
型:
装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个
执行块。
映像中所有的代码和数据都有一个装载地址和运行地址 二者可能相同也可能不同,视具体情况而定!。
))文件语法
))文件是一个简单的文本文件,包含一些简单的语法。
-,(;我的名字 -,(起始地址 属性
.
/)%())(,(这个域的范围
0
标题
每个块由一个头标题开始定义,头中至少包含块的名字和起始地址1如 !,另外还有最大长度等其
他一些属性选项 注2这些属性
是可选的1如 !。
内容
块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
、 一个加载块必须至少含有一个执行块;实践中通常有多个执行块。
、 一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;
通配符号3可以匹配指定属性项中所有没有在文件中定义的余下部分。
有以下几种属性:
:只读的代码段和常量
":可以读写的全局变量和静态变量
45:"段中要被初始化为零的变量。
))+$中的定义要按照系统冲定向后的存储器分布情况进行,在引导程序完成初始化任务后,应该
把主程序转移到 中运行以
加快系统的运行速度。
的分散加载文件分析:
6 !
.
776 !
.))89( :)(1;#)! !
3 ;!0 <!
5< =!
.))89( -)!0 &!
>?'>>;@55> A!
.))89( )'())(!0 6!
>?<<@55> B!
.))89( )!0 !
76< !
.3 ;"1;45!0 !
C7;@55> !
.))89( C9!0 <!
C7'>>66@55> =!
.))89( C9>(9!0 &!
0
#C6 A!
.#C776 6!
.( ;!0 B!
0
!加载时域描述,名称位 它的地址为 6;
6为 片外 地址,即将以下的加载的段和域都在 中。
!第一个运行时域描述。
77描述了执行区的地址,放在第一块定义,其起始地址、空间大小域加载区起始地址、空间大
小要一样。
!D <!从起始地址开始放置向量表。))89(是 ))89的目标文件。E)(为中断向量表。模
块 ))89位于该加载域的开
头 ;#)!1:)(作为入口点,包含全部的 代码。在芯片复位之后,系统进入管理模式、
状态, =!寄存器的值
为 1所以必须保证用户的向量表代码定位在 处,或者映射到
处 例如向量表代码在 6
处,通过存储器映射,访问 就是访问(6)。
=!D &!第二运行时域描述。将 -)堆栈段装载到片内静态 中。
A!D 6!将栈底放入堆栈的后面 ;!不进行初始化 @55>!1栈底为 ))89中的 )'())(。
B!D !将栈放入地址为 <<并且不进行初始化 @55>!。
!D 将所有的 "和 45段放入外部存储器中以 6<为开头的地址中。并且全部清零
;45!外部 中指定的区域。
!D <!在 "45段后放入堆底 ))89( C9!!并且不进行初始化。
=!D &!将堆定放入外部 中 66!。
A!D B!自己添加的加载代码,把 的目标文件加载到片外 #$%中并且占用了 的大小。
/3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333
/33#$2
6 加载
.
776 执行(起始地址)程序 6外部存储区
.))89( :)(1;#)!))89( 文件(向量,程序入口)
3 ;!0只读
5<5***()%(*1索引随机存取方法 <
.))89( -)!0))89(堆栈)装载到片内 中
>?'>>;@55>堆栈栈底,将栈底放入堆栈的后面 ;!,不初始化
.))89( )'())(!0将栈放入地址为 <<并且不进行初始化 @55>!
>?<<@55>堆栈 <<& 的 片内存储区
.))89( )!0))89( 文件(堆栈)
76将所有的 " 和 45 段放入外部存储器中 6 为开头的地址中
.3 ;"1;45!0并且全部清零 ;45!外部 中指定的区域读写(无输入 45)
C7;@55>在 "45 段后放入堆底 ))89( C9!!并且不进行初始化
.))89( C9!0))89( 文件(堆栈)
C7'>>66@55>将堆定放入外部 中 66
.))89( C9>(9!0))89( 文件(堆栈栈顶)
0
/3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333
/33#$2
6
.
776
.))89( :)(1;#)!
3 ;!0
5<
.))89( -)!0
>?'>>;@55>
.))89( )'())(!0
>?<<@55>
.))89( )!0
76<
.3 ;"1;45!0
C7;@55>
.))89( C9!0
C7'>>66@55>
.))89( C9>(9!0
0
/3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333
/33#$2
.
77
.))89( :)(1;#)!
3 ;!0
5<
.))89( -)!0
>?'>>;@55>
.))89( )'())(!0
>?<<@55>
.))89( )!0
76
.3 ;"1;45!0
C7;@55>
.))89( C9!0
C7'>>66@55>
.))89( C9>(9!0
0
/
33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
333333333333
加载文件的更多分解说明,网上了解资料。只作参考
有如下分散加载文件:
程序起始点(程序在 #$% 中) ,)(()((* (*
#$%!
.
77起始程序执行 ,)(()(78),
.))89( :)(1;#)!
3 ;!0
5<<内部 起始点 ,)(()(5)$
.))89( -)!0<F<#(E)(
>?'>>;@55>
.))89( )'())(!0
>?<<@55>7*()(5)$
.))89( )!0
76外部 起始点 ,)(()(7)$
.3 ;"1;45!0
C7;@55>
.))89( C9!0
C7'>>66@55>外部 结束点 7*()(7)$
.))89( C9>(9!0
0
其中, 为加载区的名称,其后面的 表示加载区的起始地址(存放程序代码的
起始地址),也可以在后面添加
其空间大小,如“G表示加载区起始地址为 ,大小为
6? 字节;77 描述了执行区的地
址,放在第一块位置定义,其起始地址、空间大小与加载区起始地址、空间大小要一致。从起始地址开始
放置向量表(即 ))89(
(:)(,;#)),其中 ))89( 为 ))89 的目标文件),接着放置其他代码(即映像文件)
(即3());变量区 5 的起始地
址为 <<,放置 ))89((-));变量区 7 的起始地址为 6,
放置出 ))89( 文件之外的其他文件的变量
(即3(;",;45));紧靠 7 变量区之后的是系统堆空间(C7),放置描述为
))89((C9);堆栈区 >? 使用片内 ,由于
的堆栈一般采用满递减堆栈,所以堆栈区的起始地址设置为 <<,放置描述为
))89(())
.使用地址不连续的内存(&6)
9&6 一共有 =&? 的 ,其中通用 ?,地址为 <F<AH;6?' 的 @'
专用 ,地址 A*FA*HH;
&?'7)%) 专用 ,地址为 AFAH;以上的 @' 和 7)%) 专用 也
可用做通用 ,需要做如下设置:()
),) 中将 @' 和 7)%) 功能打开,需要设置 寄存器,详见 )%)。()设置分
散加载文件,分配这两段内存。
在 8,5 模式下,有如下分散加载文件:
<
.
77<加载映像文件(通用 首地址)
.))89( :)(1;#)!
3 ;!0
5<A用户堆栈
.))89( -)!0
>?<6@55>系统堆栈
.))89( )!0
7A3变量,放置与 7)%) 专用 首地址3
.3 ;"1;45!0
C7;@55>
剩余35页未读,继续阅读
资源评论
- zyl3602014-03-29好有用,多谢
- 张1的记录本2019-04-21txt格式的,打开好像都不能阅读。。。。
xiaozheng_wu
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功