ADS调试问题集
继续coding...
建立工程,编辑源文件,把文件加入工程,设置工程属性、编译与链接选项,make!
1、典型错误
Error : A1163E: Unknown opcode
解决方案:
Error : A1163E: Unknown opcode
vector.s line 14
14 00000020 Reset_Addr DCD Reset_Handler
认真检查了代码的编辑,确实没错。也对Reset_Addr DCD Reset_Handler这条伪操作语句前面的Tab符号 。可参见错误3
2、大小写错误
首先要先搞懂ADS的基本设置。ADS的armassembler/compiler/linker很重要。
看看这条代码:
MCR P15, 0, R1, C1, C0, 0
有错不?非常简单的写协处理器CP15寄存器1的指令,语法和拼写完全没错误!要是ADS对你报错了,你疯不?它还真报错了!
Error :A1151E: Bad register name symbol
boot.s line 107
还好我心理承受能力强,在我疯之前找出了这个用肉眼看不到的错误:将P15,C1,C0全部用小写字母表示就对了!
MCR p15, 0, R1, c1, c0, 0 ;correct now
3、汇编代码的TAB键与空格
一些伪操作语句前面不要TAB,而又有一些伪操作(directive)前还必须要Tab符号或空格~!不信?
把AREA还有与之配套的END语句顶格写试试?!ADS跟你报错没商量~!EXPORT/IMPORT前面也一样必须有Tab符号或空格!
嵌入式汇编时常用的IMPORT。IMPORT,AREA,END等前面须空格;
4、注释
注释是以;开头,而不是@开头
5、标记
标记顶格写不要空格,且后面不要冒号(:)
例:
IMPORT main
AREA Init,CODE,READONLY
ENTRY
_start
ldr r0, =0x53000000
mov r1, #0x0
str r1, [r0]
ldr sp, =1024*4
bl main
halt_loop
b halt_loop;
END
补充:
汇编语言和c语言之间的相互调用,分以下四中情况讨论:
1,在c语言中调用汇编的子程序fun1:在汇编文件中声明fun1可以供外部使用,即EXPORT fun1.在c语言文件中声明引用外部函数fun1即exttern fun1()可以像调用c函数一样方便地调用fun1。如果需要参数传递,则c语言的参数从左到右依次传给了r0,r1,r2,r3.如果超过四个参数,就要使用堆栈传递。
2,在汇编中调用c语言的子程序fun2:在汇编文件中声明fun2是从外部调用的文件,即IMPORT fun2 ,执行调用的语句是bl fun2 。如果有参数传递,按照1所说规则对应。13581929725
3,在c语言中引用汇编的变量a,在汇编文件中声明a可以供外部使用,即EXPORT a,在c文件中声明extern int a.
4,在汇编中引用c语言的变量b,在汇编文件中声明引用了变量b ,即IMPORT b.