微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM 的分散加载

ARM 的分散加载

时间:11-09 来源:互联网 点击:

在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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top