"); //-->
Metrowerks Code Warrior V1.2的"Edit->Debug In ExRAM Settings",然后在"Linker->ARM Linker"的Output页中,选中Scatter选项。在Scatter的编辑框中选择写好的.scf文件。(Scatter-Loading description file).
简单应用时可以不写.scf文件。而在"Output"页中选择"Simple".然后填写"RO Base"和"RW Base"的起始地址。在"Lay Out"页中,填写Object/Symble: Startup.o, Section: Start.编写启动文件:Startup.s.
在"Option"页里的"Image Entry Point"填入起始地址。
--------------------------------------------------------------------------------
Scatter-Load Description File的结构:
".scf"文件中的"+RW"对应".s"源文件中的"READWRITE".
".scf"文件中的"+ZI"对应".s"源文件中的"NOINIT".
".scf"文件中的"+RO"对应".s"源文件中的"READONLY".
在".s"源文件中有:
AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE
END
".scf"的例子:
内容 注解
ROM_LOAD 0x80000000
{ Name of Load Region, Start Address for Load Region and Maximum size of Load Region(省略了)
ROM_EXEC 0x80000000 0x20000
{ 片外存储区,从0x80000000开始,最多0x20000字节。
Startup.o(Vector,+First) Startup模块的Vector段放在最前面。注1
*(+RO) 其他所有模块中的所有代码和只读的数据放在这里。
}
IRAM 0x40000000 0x00004000
{ 片内RAM区,从0x40000000开始,最多0x4000字节
Startup.o(MyStacks,+first) 指定Startup.o中MyStacks放在最前面。
Startup.o(+RW,+ZI) Startup.o中的其他+RW/+ZI段。注1
os_cpu_a.o(+RW,+ZI)
}
STACKS 0x40004000 UNINIT
{ 片内16K RAM的顶端,存放不需要被"C library"初始化的段。
Stack.o(+ZI) 注2
}
ERAM 0x80040000
{
*(+RW,+ZI)
}
HEAP +0 UNINIT
{ "+0"表示接着上一段"ERAM"的结尾,继续安排存储区。
Heap.o(+ZI) 注3
}
}
下面是在scf文件中引用过的源文件示意:
"Startup.s"
code 32
area Vectors,CODE,READONLY
entry
...
end 注1:在"Startup.o"里面会生成名为"Vectors"的段,段的属性为"READONLY"
"Stack.s"
area Stacks, DATA, NOINIT
export StackUsr
StackUsr SPACE 1
end 注2: 在"Stack.o"里面会生成名为"Stacks"的段,段的属性为"NOINIT",该属性对应scf文件中的"+ZI". 该段不需要初始化或者可以被初始化为"0".
"Heap.s"
area Heap,DATA,NOINIT
export bottom_of_heap
bottom_of_heap SPACE 1
end 注3: "Heap.o"里面名为"Heap"的段。
在Scatter文件中最好每一个Region都加一个Maximum参数,这样当编译时如果实际使用的空间大于Maximum Size,会有Error:16220E: Excution region xxx size (xxx bytes) exceeds limit (xx bytes)。如果地址有重复,会有Error: 16221E: Excution region xxx overlaps with excution region xxx。前一个Region的首地址 + Maximum > 后一个Region的首地址时不一定有Error。只有当一分配的内存出现覆盖时才会有Error。
Region的"UNINIT"之类的参数要放在"Maximum size"参数之前。
在一个Region中,RAM的分配不是按照罗列的顺序来的。要想让汇编中使用的变量有固定的位置,可以把所有汇编文件产生的".o"放在同一个Region中。如:
IRAM1 0x40000000
{
startup.o(+RW,+ZI)
ASMSourceCode1.o(+RW,+ZI)
ASMSourceCode2.o(+RW,+ZI)
}
IRAM2 +0
{
CSourceCode1.o(+RW,+ZI)
CSourceCode2.o(+RW,+ZI)
}
这样,所有汇编中定义的变量地址就相对集中了。
如果只有一个汇编文件如startup.s,也可以这样:
IRAM 0x40002000 0x1000
{
startup.o (Mystack,+first)
*(+RW,+ZI)
}
用一个"+first"强行将startup.s中的Mystack放在0x40002000位置。
在"Edit -> DebugRel Settings...->ARM Linker"中选中"Image map"。编译后在Error & Warnings窗口会显示出详细的内存分配情况。如果在"List file name"中指定一个输出文件名,该祥单会直接存在制定文件中以供多次研究。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
有知道的吗?听说北京又要有大型招聘会啦?
富士通半导体 MB95260系列“Easy-Kit”演示
IEEE MagNet挑战赛如何利用人工智能实现功率磁性器件建模?
Mathcad基本功能演示(101 demo)
毕业生凭什么找工作?
贸泽电子再度携手2026“创造未来”全球设计大赛, 创新赋能 点燃科技新动能
Mathcad工程计算示范短片
ON低待机能耗、低成本开关电源控制器NCP1215应用实例
深入理解 I²C 协议
有重低音的有源音箱电路
请教创业金点子
[推荐]一定要看的贴子
打破12V瓶颈:迈向48V供电系统
激光阵列可能简化了共封光学元件
Mathcad在电子和高科技行业的应用
NE5565电子镇流器控制器
是德科技XR8示波器平台:重构测量本质,开启高速测试新纪元
NEXXIM Ansoft 用于射频、模拟和混合信号电路设计的新一代仿真器白皮书
简易无线电子琴电路
25键多功能电子琴电路
拥抱赋能OpenClaw智能生态,此芯科技CIX ClawCore螯芯系列芯片震撼首发
如何发现并修复模拟仿真中隐藏的建模缺陷
Mathcad在6西格玛方面的应用
Bourns 扩展 Multifuse® MF-LSMF 系列 PPTC 可复式保险丝产品线,提供更广泛的保持电流与更高电压型号
单(双)声道高保真有源音箱电路
基于大规模并行GPU光栅化器加速计算光刻技术
求职故事:简历抹不掉惨痛记忆
小型电子琴电路
PCB表面贴装电源器件的散热设计
NCP1200简化的开关电源设计