原创 (转)ARM经典300问--2

2008-11-23 22:48 3215 9 4 分类: MCU/ 嵌入式

第 40 问:  


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


如何通过 JTAG 仿真器发送到目标机上呢


对于单片机的调试,都用到了什么软件


都个有什么作用呢


A:可以使用  ADS1.2,Keil C 也支持.AXD 是 ADS 的一个组件.  


您可以在本公司网站下载  EasyARM2100 开发套件快速入门看一看.  


第 41 问:  


Q:EasyARM2100AXD 调试时出错,故障现象:  


按照光盘上的方法设置好 ADS1.2 后打开光盘上的 expamples\gpio\c\LedDisp 的工程文


件(从光盘上拷贝到硬盘,已去处只读属性).  


编译通过后,按 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_drive\readme.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,=PLLCON  


ldr r1,=((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, R4, #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!, {R0-R12, LR, PC }^是不是恢复新任务工作寄存器和工作模式, LR 寄存器一并得到恢复,那么 ADD 指令后面的  LDR LR, [SP, #-8]  指令是不是可以去掉A:两者恢复的是两个不同处理器模式的 LR.  


 第 75 问:  


Q:既然 option 页中的 Image entry Point 填入的是调试入口地址,那么在实际的程序运行


当中它是不会 覆盖代码中的 ENTRY 入口声明的,对吗   仅仅是为了调试的方便.  


A:Image entry Point 优先.其实代码中的 ENTRY 是为了确保代码不被优化掉.    


第 76 问:  


Q:我想使用标准 C 语言的库函数,比如 memset  在 string.h 中有定义,可是我直接包含


#include ,  但是编译没错误,运行确有错误,应当怎么设置


A:请使用最新的工程模板


 第 77 问:  


Q:软件中断是不是必须由 SWI 指令触发


A:可以直接用你定义成软中断的函数名啊.比如:  


__SWI(0x12) void myswi(void); //  声明函数


 __asm //  调用方式 1  


{  


swi 0x12  


}  


 myswi(); //  调用方式 2  


 第 78 问:  


Q:《ARM 微控制器基础与实战》程序清单 6.9 的程序是在哪里被调用的


_user_initial_stackheap  


LDR r0,=bottom_of_heap   


MOV pc,lr    


A:__main.千万别删哟,  否则出大事的.  


  


第 79 问:  


Q:"LDR R0, =PINSEL0"  中"="是什么意思   这语句是取地址还是取地址中的内容呢


A:这是 LDR 伪指令,可用来加载 32 位立即数或地址,LDR R0,=PINSEL0 是将 PINSEL0 的地址加载到 R0 中.  


第 80 问:  


Q:我不明白"SWI 0"和"SWI 0X123456"这两条指令中的 0 和 0X123456 中有何用.   


有没有应用 SWI 的具体例子让我看看

A:那是特定的中断入口地址,见 ADS_DeveloperGuide_D.pdf 下的 swi.
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条