加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ARM体系结构与汇编100问(三)

发布时间:2020-12-15 18:46:00 所属栏目:百科 来源:网络整理
导读:第37问: Q:HEX文件.EASY2100配套《ARM微控制器基础与实战》上讲:把项目编译成HEX文件,我不会呀,咋办 A:Target-〉target settings设置Post-linker并且设置Linker-〉fromELF. Q:再问:我用的是光盘里的例子,打开工程项目里是DebugInARM.DebugInFlash.RelInFlash
第37问:
Q:HEX文件.EASY2100配套《ARM微控制器基础与实战》上讲:把项目编译成HEX文件,我不会呀,咋办
A:Target-〉target settings设置Post-linker并且设置Linker-〉fromELF.
Q:再问:我用的是光盘里的例子,打开工程项目里是DebugInARM.DebugInFlash.RelInFlash.不是《ARM微控制器基础与实战》上的DebugRel呀,我都照《ARM微控制器基础与实战》上

设置的,可用ISP下载,提示无法找到HEX文件.
A:光盘上的例子是用专用工程模板建立,已经设置好参数,与默认模板不同.


第38问:
Q:EasyARM2100开发板如何通过JTAG接口下载到Flash我在用EasyARM2100开发板时JTAG接口不能进行Flash中的调试(DebugInFlash),但是可以在RAM中调试(DebugInRAM),且通过ISP

编程可以写入Flash.
通过JTAG接口进行DebugInFlash调试时,总是出现如下提示:
Flash Sector 0 write failed!
Warnning interrupt vectors data is not correct!
Program you downloaded can not run freely!
请问是什么原因 我该如何办
A:仿真器设置选项有一个允许擦除FLASH的选项,选择它.


第39问:
Q:我发现程序在RAM调试时(RO=0X40000000) OK,但是JTAG下载到FLASH(RO=0X00000000),显示如下:
The session file 'c:Documents and Settingsjandefault-1-2-0-0.ses' could not be loaded.
A:这是ADS自身的问题,请不要通过IDE运行AXD,而是通过开始菜单运行,然后Load调试文件调试.


第40问:
Q:我有几个问题想问问大家.
调试主机负责对ARM源程序进行编译链接,最好用什么样的高级语言对ARM源程序进行编译链接使用调试程序(如AXD)进行JTAG调试,AXD是什么调试程序,是否是类似什么软件之类的

到哪能下载AXD的调试程序呢 怎么样进行AXD程序进行JTAG调试
如何通过JTAG仿真器发送到目标机上呢
对于单片机的调试,都用到了什么软件都个有什么作用呢
A:可以使用 ADS1.2,Keil C也支持.AXD是ADS的一个组件.
您可以在本公司网站下载 EasyARM2100开发套件快速入门看一看.


第41问:
Q:EasyARM2100AXD调试时出错,故障现象:
按照光盘上的方法设置好ADS1.2后打开光盘上的expamplesgpiocLedDisp的工程文件(从光盘上拷贝到硬盘,已去处只读属性).
编译通过后,按Debug按键运行调试,进入AXD.按Go按键,EasyARM没有反应.再按Stop按键.AXD弹出两个确认框窗口:
"No disassembly could be read at the requested address".
如果进入AXD直接按Step按键,也是会弹出同样的两个确认框.
软件是光盘上的,没有经过任何改动.光盘上的程序试过4,5个都是这种情况.
AXD的设置是按照光盘上的说明设置的.
EasyARM上的JP8 是断开的.ADS在出现这种问题后重新安装过,故障依旧.
出现这个问题前,可以调试.只是单步的时候感觉比较慢.差不多1-2秒钟才能单步一次.
A:原因找到了,是芯片被加密了,无法写入新的程序,用FLASH ISP清除后解决.加密后JTAG完全不能控制芯片,否则可能被解密.


第42问:
Q:我板上的lpc2214开始可以在线编程,只搞了两三次可以把文件写进去.但我发现P0.14未置低电平时也进入ISP模式,烧入的文件原来可以ISP下载到2014开发板中运行的.最后只能读芯片的一些ID,载文件都不能进行.以下是对整片ERASE时,对串口的捕获,命令返回是19.
Synchronized
Synchronized
OK
11059
OK
U 23130
0
P 0 14
0
E 0 14
11

19 configure tar... -> ARMUL,只能仿真ARM核外设不能仿真.


第48问:
Q:为什么盘中的工程会出错啊
A:文件的只读属性去掉了吗


第49问:
Q:您在2104的《ARM微控制器基础与实战》中提到ucos与应用代码分开编译,在分开编译调试成功之后,最后要将代码统一固化到芯片中.在最后一步需要注意什么统一编译时感觉要改动很多东西,有没有什么最简单的办法 能否详细介绍一下方法 多谢!
A:使用我们的工程模板,可在本公司网站下载.其实不分开编译也可调试.http://www.zlgmcu.com/tools/kaifaban/EasyARM2104.asp的EasyARM2104开发套件快速入门和LPC210...


第50问:
Q:请问,我的2104板子,通过EasyJTAG仿真时,在AXD上没有文件,而且出现这样"Error,Flash is protected by user configation!"的提示,这是怎么回事啊 在AXD应该打开什么类型的文件啊谢谢啦!!!!
A:在仿真器的配置窗口设置仿真器允许擦除FALSH.AXD->Options->configure target->configure->erase……


第51问:
Q:关于arm汇编语言跳转指令的特殊用法.有如下两条跳转指令:
beq lablef
beq lableb
其中lable为某段程序的标号,beq lablef 表示向前跳转到与当前指令最接近的标号lable处执行,而beq lableb表示向后跳转到与当前指令最接近的标号lable处执行.在arm汇编中有定义这样的用法吗
A:没有.


第52问:
Q:我将一段程序从flash从复制到了RAM中,但是因为混合编程中不能直接向PC寄存器中赋值来实行跳转,这样我该如何跳转到这个RAM中的地址呢
A:用函数指针.可参考IAP例子.


第53问:
Q:我想详细的了解一下ADS开发工具中的stack.s,heap.s和startup.s中代码的含义,各位高手推荐本书或给解释一下
A:开发套件用户指南的第3.1.3节有说明.
stack.s定义了系统模式堆栈的起始地址.
heap.s为初始化库函数的堆,是按ADS的编译器要求编写的.
startup.s向量表及初始化代码,是根据CPU来编写的.


第54问:
Q:我不知道所选择的C文件到底是用ARM还是THUMB编译的,请大侠指点!
A:看配套《ARM微控制器基础与实战》7.1,7.2,7.3节.


第55问:
Q:我重新建立了一个工程,没有用模板,TEST.C程序在编译的时候提示OS_EVENT没有申明,但是我看了代码,TEST.C中包含了CONFIG_EX.H,而congif_ex.h中又包含了include_ex.h,include_ex.h,这两个头文件又包含了ucos_ii.h,而OS_EVENT是在ucos_ii.h中申明的,不知道为什么会出现这种错误,能不能给我一个比较合理的目录结构
A:请参考我们光盘的目录结构.最好使用我们的工程模板.


第56问:
Q:请问,我现在做2114的产品开发.出现以下问题,特向您请教! 问题:
我们开发的产品要采样,采用周期固定.于是我们采用timer0进行时钟触发,利用触发中断程序每隔10毫秒采样一次并显示波形.这都能很好的进行.但是在中断程序里面对几个全局变量赋值,跳出中断后却不能使用该全局变量.很是头疼!请赐教!!
框架如下:
uint8 a; //全局变量
void __irq funtimer0()
{
...
a=0; //在中断函数里面对全局变量赋值
...
}

void fun1()
{
uint8 i;
i=0;
.......
i=a; // 出错位置,在调试过程中运行到当前位置,鼠标移动到变量a上
// 显示数值是0,但是不能传给i,i的值不会随该命令改变.
......
}

因此,我在中断函数中采集到的数据放到全局数组中.采集完成关中断后在用户模式下的程序中来处理该数组,但是该数组中的数据也不能使用!全局数组变量占1000个字节,IRQ堆栈长度是256.
A:全局变量用volatile声明.


第57问:
Q:在AXD里打开Debuger Internals,在Variable Name里为什么没有PINSEL2,ADDR,ADCR等寄存器 要在哪里设置
A:有些片内外设寄存器是不能读出,《ARM微控制器基础与实战》上的P33页有说明及处理方法(在Memory窗口写入相应寄存器地址).


第58问:
Q:请问不连easyArm板可不可以直接软件调试程序 我是指如果想直接调软件部分,能不能在ads或axd里直接调试
A:这和板子没关系啊,你直接选ARMulate不就行了,注意把等待PLL配置完那条语句屏蔽就可以啦!


第59问:
Q:AXD里面出现 "RDI Warning 00159: Could not open specified device port"谁能告诉我这个是问题啊我一直搞不懂啊,全部是按照《ARM微控制器基础与实战》第4章上配的图做的啊,但是就是不能仿真啊.
A:请先按照光盘的easyarm_drivereadme.txt安装驱动程序.

?

第60问:
Q:1.在《ARM微控制器基础与实战》的2.6.3节有说到"浮点数寄存器(F0-F7...)",2104是否具有这些寄存器
2.如果EasyArm不支持浮点运算,而我的程序需要用到浮点运算,请问可以实现吗
A:1.没有.
2.用C就可以用浮点运算.


第61问:
Q:EASYARM2104的例子程序怎么都是调用C写的程序,汇编那个怎么没用的啊
A:按如下步骤进行处理:
1.在项目管理窗口中删除原来的所有文件;
2.在项目管理窗口中增加汇编文件*.S;
3.编译链接,调试.


第62问:
Q:请问版主:在AXD调试软件中,我单步运行到一定时候,我想让自己编的软件从复位处重新运行,在AXD软件中,EXECUTE栏目中有单步,连续,运行到光标处等功能,但无复位功能,如果要实现此功能,如何操作
A:我也没有发现,目前只能用重新装载的操作实现.


第63问:
Q:在AXD调试中,通过从jtag接口,连接上lpc2106,出现如下信息:
TKSimulator for ADS,V1.2,2003/08
Software Supplied by: ZLGMCU
ARM7TDMI-S,Little Endian
在从file|load imgage...文件,出现两种情况:
1.正常,完全能调试;
2.出现问题,如下:RDI Warning 00254: Unimplemented RDI message请问,这是错在哪里如何解决 谢谢!
A:可能是电源或其他接插件接触不良引起.


第64问:
Q:请教几个问题:
1.移植中底层接口里的__swi关键字在SDT中能用吗
2.为什么在勘误文档中时钟节拍服务子程序里去掉了开中断及关中断的宏
3.时钟节拍中断的优先级应该设为最高吗
A:1.不知,请自己看一看软件自带文档.
2.因为中断服务程序中肯定是关中断的.
3.不必.


第65问:
Q:arm汇编中的中括号是什么意思 比如下面的例子中括号是什么作用呀
[ PLLONSTART
ldr r0,=PLLCON
ldr r1,=((0xe8<<12)+(0x4<<4)+0x2)
str r1,[r0]
]
A:等效于:
IF PLLONSTART
ldr r0,=((0xe8<<12)+(0x4<上电->启动AXD.现象:数码管能显示不断变化的数字0--F,但是AXD的连接失败,提示"DBE Warning 00041: ....".重复试了几遍,现象相同.请教原因以及对策.
A:刚才把我机器的Win2K系统的用户属性从"PowerUser"修改为"Administrator"就没问题了.可能是ADS/AXD安装的时候用了Administrator权限,在"PowerUser"下工作有问题吧.
如果哪位老兄有类似问题,不妨试一下这个方法.


第67问:
Q:在Init.s中有这样一段:
Reset
BL InitStack ;初始化堆栈
BL TargetResetInit ;目标板基本初始化
B __main ;跳转到c语言入口
谁知道__main()函数的具体内容
假如我不需要调用库函数的话,是否可以改为B main
A:看调试是汇编代码里有__main(),组成成分与一些链接选项有关.
可以.但是全局变量初始化不了.


第68问:
Q:我在C中嵌入这样一条语句
__asm
{
MRS R4,CPSR;
STMFD SP!,{R4};
ORR R4,R4,0x80;
MSR CPSR_cxsf,R4
}
会出新报错"illegal write to sp"版主和各位大侠有什么办法解决阿
A:嵌入汇编不能使用SP.


第69问:
Q:请问 ADS如下的编译错误是什么意思L6221E:Execution region ER_RO overlays with Execution region ER_ZI
A:程序段内存分配可能有问题,RO(只读),ZI(0初始化)


第70问:
Q:在axd中有没有运行程序的时间计算器 keil中就有那样的东西.
A:有的,不过不是时间而是执行周期,可以换算成时间.在debugger internals中,具体可以参考帮助文档.


第71问:
Q:我最初的init.s中没有加入heap的分配和__user_initial_stackheap函数,结果程序跳到SWI中死循环.我把他们加入后就好了.或者不加入他们,把B __main改为B main也可以.请问何解 另外,就算目标板会陷入死循环,但是用软件仿真却可以正常运行.何解
A:堆的位置没有分配到有效的RAM中.


第72问:
Q:在ARM汇编语言中,对立即数的有要求,我记得原来没有这样一说了.现在反而糊涂了,用立即数时候,很小心很忌讳,不回象51下随心所欲的使用了,有对立即数熟悉的朋友站出来给大家释疑.
A:如使用"非法数据可以使用lrd送到寄存器"的方法.首先在存储器中定义一个常量,再ldr进去,编译器是这样弄的.可以看下面语句反汇编的区别;
int z=0x101;
int z=0Xff;


第73问:
Q:请教各位:我在AXD中单步运行一段程序后,想回到程序的开始重新运行,除了重新加载,还有其他方法或按键
A:你的程序有多大 程序在Flash运行点击Reload Current Image也不需要1秒吧~或在代码窗口Set PC=0


第74问:
Q:在《ARM微控制器基础与实战》程序清单6.22的376页的OSIntCtxSW_1中:
LDR R4,[R6]
ADD SP,#68
LDR LR,[SP,#-8]
MSR CPSR_c,#(NoInt | SVC32Mode)
MOV SP,R4

LDMFD SP!,{R4,R5}
LDR R3,=OsEnterSum
STR R4,[R3]
MSR SPSR_cxsf,R5
LDMFD SP!,{R0-R12,LR,PC }^
请问高手:LDMFD SP!,PC }^是不是恢复新任务工作寄存器和工作模式,LR寄存器一并得到恢复,那么ADD指令后面的 LDR LR,#-8] 指令是不是可以去掉
A:两者恢复的是两个不同处理器模式的LR.

第75问: Q:既然option页中的Image entry Point填入的是调试入口地址,那么在实际的程序运行当中它是不会覆盖代码中的ENTRY入口声明的,对吗 仅仅是为了调试的方便. A:Image entry Point优先.其实代码中的ENTRY是为了确保代码不被优化掉.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读