ARM 的分散加载
在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 >如果实际使用的空间大于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"中指定一个输出文件名,该祥单会直接存在制定文件中以供多次研究。
--------------------------------------------------------------------------------
关于JTAG接口:
P1.20/TRACESYNC应该加上拉电阻以禁止TRACE功能。PINSEL2一定要在程序开始时初始化一下。LPC2210
JTAG
注
1,2/VDD3.3V
P1.31/nTRST, input 3/nTRST, output EasyJTAG中有上拉电阻。
P1.28/TDI, input 5/TDI, output EasyJTAG中有上拉电阻。
P1.30/TMS, input 7/TMS,output EasyJTAG中有上拉电阻。
P1.29/TCK, input/output 9/TCK, input/output EasyJTAG中有上拉电阻。
P1.26/RTCK, input 11/RTCK, output P1.26外接下拉电阻。
P1.26有内部上拉电阻,故测量时该引脚会呈现高电平。但是在复位时,它的上拉电阻不起作用,只有外部的下拉电阻起作用,P1.26 = 0V,所以上电后PINSEL2的D3~D0会是0x04(B0100),JTAG有效。
若将P1.26接到3.3V再复位,此时PINSEL2的D3~D0将会是0x00,JTAG无效。
P1.27/TDO, output 13/TDO, input EasyJTAG中有上拉电阻。
nRESET, input 15/nRST, output EasyJTAG中有上拉电阻。
4,6,8,10,12,14,16,18,20/GND
17,19/NC
G18控制板采用LPC2114,每次运行Axd都不会正确调入程序。原因如下:
有一次是因为已经有一个Axd在运行了,打开第二个Axd,当然不会正确调入程序。
还有一次是重新编译了一下,就好了。
以上两次都不奇怪,奇怪的是下面几次:
在"Config Target -> Config -> Easy JTag Setup"随便点两下"Halt Mode"中的选项,然后一路点击"OK",会出现"Reload the last Image?",点击"Yes"。有时会有正确的程序被调入,但有时候不成功。要检验是不是已经成功调入了,只要按下"Ctrl-D"显示Disassembly窗口,即可看到芯片中的程序是否正确。
在"Option -> Config Interface -> Session File -> Session file Options"中选择"Reload Images",之后每次启动Axd都会提示"The processor ARM_1 already has image(s) loaded. Continue the operation will replace the currently loaded images(s).... Do you wish to continue?"选择"Yes",有时候也可以成功调入程序。
当然,在"Easy JTag Setup -> Aux Option"中要选中"Erase Flash when need".
固化的程序中有禁止JTag调试端口的语句(操作PINSEL2的语句),连不上时用LPC2000 Flash Utility擦除了Flash。偶尔可行。
注意使用LPC2000 Flash Utility时要先将电路复位,再点"OK".
当然最根本的解决办法是将计算机并口设置为"EPP"模式。其他地方都按照"Default"就可以了。
--------------------------------------------------------------------------------
有效用户代码:
ARM把“向量表所有32位数据累加和为0”作为有效用户代码的条件,只适用于使用片内程序存储器的时候,片外程序存储器无此限制。
C语言程序通常需要一段用于初始化的汇编代码,通常存储为"Startup.s",它实现的任务通常是:
1、做好中断向量表
2、初始化外部总线控制器/堆栈/目标板基本模块。
3、给库函数使用的"__user_inital_stackheap"。
4、除数为零时的死循环"__rt_div0: B __rt_div0"。
5、支持加密功能的语句。
6、定义堆栈空间:AREA MyStacks, DATA,NOINIT,ALIGN = 2
要定义栈的起始地址:IrqStackSpace SPACE
ARM分散加 相关文章:
- ARM的分散加载文件(scatter)介绍(11-09)
- ARM分散加载文件(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)