【问题标题】:why the number of vector of INT0 is 1 not 2 as datasheet?为什么数据表中 INT0 的向量数是 1 而不是 2?
【发布时间】:2019-02-28 06:17:49
【问题描述】:

我正在使用 ATmega32 进行中断 当我尝试做外部中断 0 的驱动程序时,遇到了一个问题

ATmega32 中的中断向量表

ISR(vector) 中的中断向量代码

在 iom32.h 代码中,我们看到 ((INT0_vect "_VECTOR(1) ")) 它是数字 1,但在数据表中我们看到数字是 2,为什么?

【问题讨论】:

  • 从零开始编号还是从​​一开始编号? _VECTOR(1) 可能指的是 ISR 中的 second 元素,它是一个零基编号的数组。
  • VECROR(1) ,它的代码是#define _VECTOR(N) __vector ## N
  • 生成的二进制文件的反汇编或十六进制转储显示什么?表没有正确构建吗?
  • 请发布构建结果。

标签: embedded interrupt avr avr-gcc avr32


【解决方案1】:

数据表从复位向量开始编号。但是不需要对复位向量进行显式定义(如 RESET_vect),因为它不会与 ISR() 一起使用。所以在 header/AVRGCC 实现中它被省略了。

如果你编译这个

ISR(INT0_vect) {  }

并查看中断向量表

00000000 <__vectors>:
0:  0c 94 46 00     jmp 0x8c    ; 0x8c <__ctors_end>
4:  0c 94 5f 00     jmp 0xbe    ; 0xbe <__vector_1>

你可以看到__vector_1被放置在字节地址4,对应数据手册中的字地址2。

【讨论】:

  • 当然重置向量被用作ISR目标,否则程序将无法启动。如果代码不是向量表的一部分,如何将代码放在重置 ISR 中?
  • @Lundin:我想指出的是,重置向量不需要显式定义(如 RESET_vect)。我可能第一句话的措辞不太好,英语不是我的母语。
  • 为什么不呢?这就是在各种不同的 MCU 工具链上通常采用的方式。
  • @Lundin:我们说的是同一件事吗?你是指编程方式跳转到reset向量吗?
  • 不,我指的是实现重置 ISR 内容的编程方式,这意味着链接器必须以某种方式知道它。
猜你喜欢
  • 2011-05-12
  • 2013-01-09
  • 1970-01-01
  • 2019-09-14
  • 2017-07-10
  • 1970-01-01
  • 2018-06-29
  • 2012-04-01
  • 2019-04-01
相关资源
最近更新 更多