详解:这段代码为什么不进中断?

根据韦东山老师的教材编写一段中断的代码,基本功能希望这样,不中断的时候,主函数走跑马灯,中断的时候,所有灯一起亮起,我在ADS中编译代码,达到预期实验目的,但是在linux中用makefile编译运行,只能实现主函数的跑马灯,而外部中断触发,按键按下,跑马灯不跑了,但是也不出现所有灯一起亮的中断现象,王灵芝老师指点我分析产生的反汇编代码,我查看反汇编后恍然大悟,第一句代码根本不是从0x00000000开始运行,当然找不到中断向量表了,原因就是连接的时候地址不对,只要把makefile中的 arm-linux-ld -text2.lds -o int_elf $^  改成 arm-linux-ld  -Ttext 0x0000000   -o int_elf $^ ,再反汇编,就发现复位首地址就是0,烧写到开发板,成功!
      我们来水煮一下这个程序:先把错误的代码做个反汇编(
arm-linux-objdump -D -m arm int_elf > int.dis ),我们来看一下代码怎么走的:
图片
     通过上图我们发现,原来_start的运行地址居然是00008074,关键问题就在这里,如果首地址不是0,当系统发生中断的时候,执行了b     HandleIRQ,而这句话是以首地址为基准地址00008074+24(就是0x00000018),这样当然找不到中断入口向量表的位置(0x00000018)了,最终导致中断进不去,好,我们既然知道不能进中断的原因,就能修改,现在把 makefile中的 arm-linux-ld -text2.lds -o int_elf $^  改成 arm-linux-ld  -Ttext 0x0000000   -o int_elf $^ ,再反汇编,我们再看一下:

图片
很好,终于把中断向量表的入口首地址改对了,OK,烧入开发板,运行成功。 


(1)原来版本的Makefile:
objs := head.o init.o interrupt.o main.o
int.bin: $(objs)
arm-linux-ld -text2.lds -o int_elf $^ 
arm-linux-objcopy -O binary -S int_elf int.bin
arm-linux-objdump -D -m arm int_elf > int.dis
%.o:%.c 
arm-linux-gcc -nostdlib -g -c -o $@ $<

%.o:%.S
arm-linux-gcc -nostdlib -g -c -o $@ $<

clean:
rm -f int.bin int_elf int.dis *.o

(2)test2.lds
SECTIONS
{ . = 0x00000000; //指明了程序的开始运行地址
.text : {
head.o//指明第一个要运行的文件
* (.text)
}
.data : { * (.data) }
.bss : { * (.bss) }
 

(3)更正版本的Makefile

objs := head.o init.o interrupt.o main.o
int.bin: $(objs)
arm-linux-ld -Ttext 0x00000000 -o int_elf $^ 
arm-linux-objcopy -O binary -S int_elf int.bin
arm-linux-objdump -D -m arm int_elf > int.dis
%.o:%.c 
arm-linux-gcc -nostdlib -g -c -o $@ $<

%.o:%.S
arm-linux-gcc -nostdlib -g -c -o $@ $<

clean:
rm -f int.bin int_elf int.dis *.o

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值