搜索
bottom↓
回复: 7

求助,关于GCCAVR扩展中断向量地址问题(已解决)

[复制链接]

出0入0汤圆

发表于 2019-12-8 11:23:40 | 显示全部楼层 |阅读模式
本帖最后由 not_at_all 于 2019-12-9 19:06 编辑

某款兼容AVR的国产芯片,增加了中断向量。   我在iomxxx.h 头文件增加相关定义,但是中断地址还是没有扩展


// 增加中断定义
#define PCI3_vect_num    27
#define PCI3_vect    _VECTOR(27)  /* 引脚电平中断3 */

#define PCI4_vect_num    28
#define PCI4_vect    _VECTOR(28)  /* 引脚电平中断4 */

#define TC3_vect_num    29      
#define TC3_vect    _VECTOR(29)  /* 定时器3中断*/

#define _VECTORS_SIZE  (30 * 4)   // 原来是 _VECTORS_SIZE  (26 * 4)  
--------------------------------

生成汇编
  5c:        0c 94 51 00         jmp        0xa2        ; 0xa2 <__bad_interrupt>
  60:        0c 94 51 00         jmp        0xa2        ; 0xa2 <__bad_interrupt>
  64:        0c 94 51 00         jmp        0xa2        ; 0xa2 <__bad_interrupt>

00000068 <__ctors_end>:
  68:        11 24               eor        r1, r1
  6a:        1f be               out        0x3f, r1        ; 63
  6c:        cf ef               ldi        r28, 0xFF        ; 255
  6e:        d8 e0               ldi        r29, 0x08        ; 8
  70:        de bf               out        0x3e, r29        ; 62
  72:        cd bf               out        0x3d, r28        ; 61


另外  我注释了   _VECTORS_SIZE  (30 * 4)   ,也没有报错,这个没起到保留中断地址的作用    无论怎么改,到了0x0068就执行程序初始化

我对比过其他型号的头文件,没找到头绪。还要修改哪里吗?

-----------------------------------------
8楼有一个简便的解决方案

另外,今天我在国产兼容的芯片供应商开发的用GCC的编译器建立一个工程文件编译(客服没有回复,自己动手),找到另外一个简便的解决方案,如下

建立一个.s文件,文件名随便,加入工程中 (类似于amr编译器的启动文件)

.s文件内容如下:

#ifdef __GNUC__

#ifdef __AVR_MEGA__
  #define XJMP jmp
  #define XCALL call
#else
  #define XJMP rjmp
  #define XCALL rcall
#endif

        .section .vectors, "ax", @progbits
        .weak __vector_26
        ;.set __vector_26, __bad_interrupt
        XJMP  __vector_26
        .weak __vector_27
        ;.set __vector_27, __bad_interrupt
        XJMP  __vector_27
        .weak __vector_28
        ;.set __vector_28, __bad_interrupt
        XJMP  __vector_28
        .weak __vector_29
        ;.set __vector_29, __bad_interrupt
        XJMP  __vector_29
#endif



// 生成如下汇编:

  58:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  5c:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  60:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  64:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
#endif
  //以下为扩展后的中断向量
        .section .vectors, "ax", @progbits
        .weak __vector_26
        ;.set __vector_26, __bad_interrupt
        XJMP  __vector_26
  68:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_27
        ;.set __vector_27, __bad_interrupt
        XJMP  __vector_27
  6c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_28
        ;.set __vector_28, __bad_interrupt
        XJMP  __vector_28
  70:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_29
        ;.set __vector_29, __bad_interrupt
        XJMP  __vector_29
  74:        0c 94 ba 00         jmp        0x174        ; 0x174 <__vector_29>
  //下面是程序初始化
00000078 <__ctors_end>:
  78:        11 24               eor        r1, r1
  7a:        1f be               out        0x3f, r1        ; 63
  7c:        cf ef               ldi        r28, 0xFF        ; 255
  7e:        d8 e0               ldi        r29, 0x08        ; 8
  80:        de bf               out        0x3e, r29        ; 62
  82:        cd bf               out        0x3d, r28        ; 61

如果是无效中断,GCC的方案是跳转到某个位置,再复位;而用这种方案,它是直接复位的
000000b2 <__bad_interrupt>:
  b2:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2019-12-9 05:35:11 | 显示全部楼层
>某款兼容AVR的国产芯片

What it is? LGT?

出0入1119汤圆

发表于 2019-12-9 06:45:58 | 显示全部楼层
本帖最后由 Himem 于 2019-12-9 06:49 编辑

gcc最后处理时应该是会根据芯片型号去选一个crtXXXXX.o的模板去link,从这里入手看看,应该是这里没有对应扩展向量的symbol

出0入0汤圆

 楼主| 发表于 2019-12-9 06:48:52 | 显示全部楼层
funnynypd 发表于 2019-12-9 05:35
>某款兼容AVR的国产芯片

What it is? LGT?

不必拘泥于哪个芯片  这里只讨论技术问题

出0入0汤圆

 楼主| 发表于 2019-12-9 06:51:47 | 显示全部楼层
Himem 发表于 2019-12-9 06:45
gcc最后处理时应该是会根据芯片型号去选一个crtXXXXX.o的模板去link,从这里入手看看,应该是这里没有对应 ...

是一个存在的文件吗? 我找找看

出0入1119汤圆

发表于 2019-12-9 07:03:17 | 显示全部楼层
本帖最后由 Himem 于 2019-12-9 07:48 编辑
not_at_all 发表于 2019-12-9 06:51
是一个存在的文件吗? 我找找看


以gcc为相对路径.\bin\avr-gcc-5.4.0.exe
的.\avr\lib\crt*.o

随便objdump了一个型号,感觉应该有关系



  1. H:\arduino-1.8.8\hardware\tools\avr\avr\lib\avr5\crtatmega168p.o:     file format elf32-avr
  2. H:\arduino-1.8.8\hardware\tools\avr\avr\lib\avr5\crtatmega168p.o
  3. architecture: avr:5, flags 0x00000011:
  4. HAS_RELOC, HAS_SYMS
  5. start address 0x00000000

  6. Sections:
  7. Idx Name          Size      VMA       LMA       File off  Algn
  8.   0 .text         00000004  00000000  00000000  00000034  2**0
  9.                   CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  10.   1 .data         00000000  00000000  00000000  00000038  2**0
  11.                   CONTENTS, ALLOC, LOAD, DATA
  12.   2 .bss          00000000  00000000  00000000  00000038  2**0
  13.                   ALLOC
  14.   3 .debug_abbrev 000005a2  00000000  00000000  00000038  2**0
  15.                   CONTENTS, READONLY, DEBUGGING
  16.   4 .debug_info   000005f4  00000000  00000000  000005da  2**0
  17.                   CONTENTS, RELOC, READONLY, DEBUGGING
  18.   5 .debug_line   0000001a  00000000  00000000  00000bce  2**0
  19.                   CONTENTS, READONLY, DEBUGGING
  20.   6 .debug_str    00000208  00000000  00000000  00000be8  2**0
  21.                   CONTENTS, READONLY, DEBUGGING
  22.   7 .vectors      00000068  00000000  00000000  00000df0  2**0
  23.                   CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  24.   8 .init0        00000000  00000000  00000000  00000e58  2**0
  25.                   CONTENTS, ALLOC, LOAD, READONLY, CODE
  26.   9 .init2        0000000c  00000000  00000000  00000e58  2**0
  27.                   CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  28. 10 .init9        00000008  00000000  00000000  00000e64  2**0
  29.                   CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  30. 11 .note.gnu.avr.deviceinfo 00000040  00000000  00000000  00000e6c  2**2
  31.                   CONTENTS, READONLY
  32. SYMBOL TABLE:
  33. 00000000 l    d  .text        00000000 .text
  34. 00000000 l    d  .data        00000000 .data
  35. 00000000 l    d  .bss        00000000 .bss
  36. 00000000 l    d  .debug_abbrev        00000000 .debug_abbrev
  37. 00000000 l    d  .debug_info        00000000 .debug_info
  38. 00000000 l    d  .debug_line        00000000 .debug_line
  39. 00000000 l    d  .debug_str        00000000 .debug_str
  40. 00000000 l    d  .vectors        00000000 .vectors
  41. 00000000 l    d  .init0        00000000 .init0
  42. 00000000 l    d  .init2        00000000 .init2
  43. 00000000 l    d  .init9        00000000 .init9
  44. 00000000 l    d  .note.gnu.avr.deviceinfo        00000000 .note.gnu.avr.deviceinfo
  45. 00000000 g       .vectors        00000000 __vectors
  46. 00000000  w      .init0        00000000 __init
  47. 00000000  w      .text        00000000 __vector_1
  48. 00000000 g       .text        00000000 __bad_interrupt
  49. 00000000  w      .text        00000000 __vector_2
  50. 00000000  w      .text        00000000 __vector_3
  51. 00000000  w      .text        00000000 __vector_4
  52. 00000000  w      .text        00000000 __vector_5
  53. 00000000  w      .text        00000000 __vector_6
  54. 00000000  w      .text        00000000 __vector_7
  55. 00000000  w      .text        00000000 __vector_8
  56. 00000000  w      .text        00000000 __vector_9
  57. 00000000  w      .text        00000000 __vector_10
  58. 00000000  w      .text        00000000 __vector_11
  59. 00000000  w      .text        00000000 __vector_12
  60. 00000000  w      .text        00000000 __vector_13
  61. 00000000  w      .text        00000000 __vector_14
  62. 00000000  w      .text        00000000 __vector_15
  63. 00000000  w      .text        00000000 __vector_16
  64. 00000000  w      .text        00000000 __vector_17
  65. 00000000  w      .text        00000000 __vector_18
  66. 00000000  w      .text        00000000 __vector_19
  67. 00000000  w      .text        00000000 __vector_20
  68. 00000000  w      .text        00000000 __vector_21
  69. 00000000  w      .text        00000000 __vector_22
  70. 00000000  w      .text        00000000 __vector_23
  71. 00000000  w      .text        00000000 __vector_24
  72. 00000000  w      .text        00000000 __vector_25
  73. 00000000  w      .vectors        00000000 __vector_default
  74. 000004ff  w      *ABS*        00000000 __stack
  75. 00000000  w      *ABS*        00000000 __heap_end
  76. 00000000         *UND*        00000000 main
  77. 00000000         *UND*        00000000 exit
  78. 00000003  w      *ABS*        00000000 __FUSE_REGION_LENGTH__



  79. Disassembly of section .text:

  80. 00000000 <__bad_interrupt>:
  81.    0:        0c 94 00 00         jmp        0        ; 0x0 <__bad_interrupt>
  82.                         0: R_AVR_CALL        __vector_default

  83. Disassembly of section .vectors:

  84. 00000000 <__vectors>:
  85.    0:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  86.                         0: R_AVR_CALL        __init
  87.    4:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  88.                         4: R_AVR_CALL        __vector_1
  89.    8:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  90.                         8: R_AVR_CALL        __vector_2
  91.    c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  92.                         c: R_AVR_CALL        __vector_3
  93.   10:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  94.                         10: R_AVR_CALL        __vector_4
  95.   14:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  96.                         14: R_AVR_CALL        __vector_5
  97.   18:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  98.                         18: R_AVR_CALL        __vector_6
  99.   1c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  100.                         1c: R_AVR_CALL        __vector_7
  101.   20:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  102.                         20: R_AVR_CALL        __vector_8
  103.   24:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  104.                         24: R_AVR_CALL        __vector_9
  105.   28:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  106.                         28: R_AVR_CALL        __vector_10
  107.   2c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  108.                         2c: R_AVR_CALL        __vector_11
  109.   30:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  110.                         30: R_AVR_CALL        __vector_12
  111.   34:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  112.                         34: R_AVR_CALL        __vector_13
  113.   38:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  114.                         38: R_AVR_CALL        __vector_14
  115.   3c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  116.                         3c: R_AVR_CALL        __vector_15
  117.   40:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  118.                         40: R_AVR_CALL        __vector_16
  119.   44:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  120.                         44: R_AVR_CALL        __vector_17
  121.   48:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  122.                         48: R_AVR_CALL        __vector_18
  123.   4c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  124.                         4c: R_AVR_CALL        __vector_19
  125.   50:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  126.                         50: R_AVR_CALL        __vector_20
  127.   54:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  128.                         54: R_AVR_CALL        __vector_21
  129.   58:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  130.                         58: R_AVR_CALL        __vector_22
  131.   5c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  132.                         5c: R_AVR_CALL        __vector_23
  133.   60:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  134.                         60: R_AVR_CALL        __vector_24
  135.   64:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
  136.                         64: R_AVR_CALL        __vector_25

  137. Disassembly of section .init2:

  138. 00000000 <.init2>:
  139.    0:        11 24               eor        r1, r1
  140.    2:        1f be               out        0x3f, r1        ; 63
  141.    4:        c0 e0               ldi        r28, 0x00        ; 0
  142.                         4: R_AVR_LO8_LDI        __stack
  143.    6:        d0 e0               ldi        r29, 0x00        ; 0
  144.                         6: R_AVR_HI8_LDI        __stack
  145.    8:        de bf               out        0x3e, r29        ; 62
  146.    a:        cd bf               out        0x3d, r28        ; 61

  147. Disassembly of section .init9:

  148. 00000000 <.init9>:
  149.    0:        0e 94 00 00         call        0        ; 0x0 <.init9>
  150.                         0: R_AVR_CALL        main
  151.    4:        0c 94 00 00         jmp        0        ; 0x0 <.init9>
  152.                         4: R_AVR_CALL        exit
复制代码

出0入1119汤圆

发表于 2019-12-9 07:47:43 | 显示全部楼层
本帖最后由 Himem 于 2019-12-9 07:53 编辑

大致搞明白了,要下载avr-libc的源码,
修改iomXXX.h中_VECTORS_SIZE定义(在gcrt1.S引用)后重新编译并安装avr-libc即可,或者编译后只替换对应的crtXXXX.o

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-12-9 18:38:46 | 显示全部楼层
本帖最后由 not_at_all 于 2019-12-9 18:57 编辑
Himem 发表于 2019-12-9 07:47
大致搞明白了,要下载avr-libc的源码,
修改iomXXX.h中_VECTORS_SIZE定义(在gcrt1.S引用)后重新编译并安装a ...


谢谢!

另外,今天我在国产兼容的芯片供应商开发的用GCC的编译器建立一个工程文件编译(客服没有回复,自己动手),找到另外一个简便的解决方案,如下

建立一个.s文件,文件名随便,加入工程中 (类似于amr编译器的启动文件)

.s文件内容如下:

#ifdef __GNUC__

#ifdef __AVR_MEGA__
  #define XJMP jmp
  #define XCALL call
#else
  #define XJMP rjmp
  #define XCALL rcall
#endif

        .section .vectors, "ax", @progbits
        .weak __vector_26
        ;.set __vector_26, __bad_interrupt
        XJMP  __vector_26
        .weak __vector_27
        ;.set __vector_27, __bad_interrupt
        XJMP  __vector_27
        .weak __vector_28
        ;.set __vector_28, __bad_interrupt
        XJMP  __vector_28
        .weak __vector_29
        ;.set __vector_29, __bad_interrupt
        XJMP  __vector_29
#endif



// 生成如下汇编:

  58:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  5c:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  60:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
  64:        0c 94 59 00         jmp        0xb2        ; 0xb2 <__bad_interrupt>
#endif
  //以下为扩展后的中断向量
        .section .vectors, "ax", @progbits
        .weak __vector_26
        ;.set __vector_26, __bad_interrupt
        XJMP  __vector_26
  68:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_27
        ;.set __vector_27, __bad_interrupt
        XJMP  __vector_27
  6c:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_28
        ;.set __vector_28, __bad_interrupt
        XJMP  __vector_28
  70:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>
        .weak __vector_29
        ;.set __vector_29, __bad_interrupt
        XJMP  __vector_29
  74:        0c 94 ba 00         jmp        0x174        ; 0x174 <__vector_29>
  //下面是程序初始化
00000078 <__ctors_end>:
  78:        11 24               eor        r1, r1
  7a:        1f be               out        0x3f, r1        ; 63
  7c:        cf ef               ldi        r28, 0xFF        ; 255
  7e:        d8 e0               ldi        r29, 0x08        ; 8
  80:        de bf               out        0x3e, r29        ; 62
  82:        cd bf               out        0x3d, r28        ; 61

如果是无效中断,GCC的方案是跳转到某个位置,再复位;而用这种方案,它是直接复位的
000000b2 <__bad_interrupt>:
  b2:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>


以后大家遇到类似问题可以考虑这种方案

-------------------------
题外话,如果改用汇编,GCC就要修改 .inc文件的相关定义
; ***** INTERRUPT VECTORS ***************************
.equ        INT0addr        = 0x0002        ; External Interrupt Request 0
.equ        INT1addr        = 0x0004        ; External Interrupt Request 1
.equ        PCI0addr        = 0x0006        ; Pin Change Interrupt Request 0
.equ        PCI1addr        = 0x0008        ; Pin Change Interrupt Request 0
.equ        PCI2addr        = 0x000a        ; Pin Change Interrupt Request 1
.equ        WDTaddr        = 0x000c        ; Watchdog Time-out Interrupt
.equ        OC2Aaddr        = 0x000e        ; Timer/Counter2 Compare Match A
.equ        OC2Baddr        = 0x0010        ; Timer/Counter2 Compare Match A
.equ        OVF2addr        = 0x0012        ; Timer/Counter2 Overflow
.equ        ICP1addr        = 0x0014        ; Timer/Counter1 Capture Event
.equ        OC1Aaddr        = 0x0016        ; Timer/Counter1 Compare Match A
.equ        OC1Baddr        = 0x0018        ; Timer/Counter1 Compare Match B
.equ        OVF1addr        = 0x001a        ; Timer/Counter1 Overflow
.equ        OC0Aaddr        = 0x001c        ; TimerCounter0 Compare Match A
.equ        OC0Baddr        = 0x001e        ; TimerCounter0 Compare Match B
.equ        OVF0addr        = 0x0020        ; Timer/Couner0 Overflow
.equ        SPIaddr        = 0x0022        ; SPI Serial Transfer Complete
.equ        URXCaddr        = 0x0024        ; USART Rx Complete
.equ        UDREaddr        = 0x0026        ; USART, Data Register Empty
.equ        UTXCaddr        = 0x0028        ; USART Tx Complete
.equ        ADCCaddr        = 0x002a        ; ADC Conversion Complete
.equ        ERDYaddr        = 0x002c        ; EEPROM Ready
.equ        ACIaddr        = 0x002e        ; Analog Comparator
.equ        TWIaddr        = 0x0030        ; Two-wire Serial Interface
.equ        SPMRaddr        = 0x0032        ; Store Program Memory Read

.equ        INT_VECTORS_SIZE        = 52        ; size in words



回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表