Chinaunix首页 | 论坛 | 博客
  • 博客访问: 511973
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-04-07 21:53:22

使用ADS(实际是AXD)调试一个简单的程序:
AREA TEST, CODE, READONLY
ENTRY
START LDR R0, =0XFF
END
的时候,发生未定义指令错误。搜了一下,一开始确实是看到了一个网页时这样解释的:

小弟是ARM的新手。。按照书上的例子写了几个例子,但都出现一样的错误。

错误描述:
make通过后运行,运行完自己写的程序后出现错误提示:未定义的指令.如下:
    Processor ARM7TDMI raised an exception.
    Cause: Undefined instruction


这个实例项目只包含两个文件:一个是汇编用于初始化,一个是C语言。。
编译器是使用ADS1.2的,PC没接任何外部设备

汇编文件的源码:

IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT Main
AREA Start,CODE,READONLY
ENTRY
CODE32
Reset LDR SP,=0x40003f00
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1
BEQ LOOP1
LOOP0 CMP R1,R3
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
BCC LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2 CMP R3,R1
STRCC R2,[R3],#4
BCC LOOP2
B Main
MOV R2,#0
END


C文件的源码:

#define uint8 unsigned char
#define uint32 unsigned int
#define dd unsigned int
#define N 100
uint32 sum;
void Main(void)
{
uint32 i;dd da;
sum=0;
for(i=0;i <=N;i++)
{
sum+=i;
}
//while(1);

//da=1;
return;


main()   不应当返回

它应该是一个循环
void   Main(void)
{
uint32   i;dd   da;
sum=0;
for(i=0;i <=N;i++)
{
sum+=i;
}
while(1);     /*   停在这里好了   */

//da=1;
//return;     /*   不应跑到这里   */


谢谢Great_Bug

我刚学ARM,是新手。。我一直都写计算机软件的,所以不太了解其中的原由

不知能否给小弟解释一下为什么要死循环呢??还是没有死循环出现的那个错误怎么解决呢???

呵呵,楼主看来是从软件转来的,你原来设计软件都是开发工具给你做了默认的循环程序,比如vc的winmain,如果没有循环,程序结束后,程序计数器只会接着往下运行,程序之外的是无定义指令,自然会出错。

通常,在嵌入式产品中,你的程序总是做一个或多个循环,或者在等待用户的输入,
或者在等待和处理传感器或通信模块的数据,等等,用户关闭了电源才停止运行,
这和在Windows下写程序是大不相同的。

将程序改为:

AREA TEST, CODE, READONLY
    ENTRY
START    LDR R0, =0XFF00
    B    START
END

就可以了。
PS:犯了一个大错误,明明有些东西是融汇贯通的,却认为不是汇编,一开始都不试试,唉,浪费了很多时间。愚蠢!!!!!
PS: 觉得这样的错误存在,实在是...
嵌入式汇编的关键词是__arm, 而不是_arm(前面两个_)
阅读(1992) | 评论(0) | 转发(0) |
0

上一篇:开篇

下一篇:基本同步原理

给主人留下些什么吧!~~