找回密码
 注册
关于网站域名变更的通知
查看: 285|回复: 1
打印 上一主题 下一主题

TMS320C6000烧写Flash过程中的中断向量表

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-15 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
TMS320C6000烧写Flash过程中的中断向量表
' S3 v; a# k2 S
  L" o$ Z* S1 q0 K9 f6 o8 o
: y6 @& Z$ ~4 r8 B/ n; b就前面的烧写方法中,请思考一个问题,程序是从何时何处跳转到main函数执行的?
+ b8 J& f% C" P" k4 Z4 ]
1 `0 D; n+ {7 F& e0 t如果不烧写Flash,我们都应该知道是在vecs.asm中2 |8 O' Q0 h1 V' Z- v8 A# l" `

, ~# a* Q2 ^. ^3 ^
  • ********************************************************************************
  • *           Copyright (C) 2003 Texas Instruments Incorporated.
  • *                           All Rights Reserved
  • *------------------------------------------------------------------------------
  • * FILENAME...... vecs.asm
  • * DATE CREATED.. 12/06/2000
  • * LAST MODIFIED. 03/05/2003
  • ********************************************************************************
  • *------------------------------------------------------------------------------
  • * Global symbols defined here and exported out of this file
  • *------------------------------------------------------------------------------
  •    .global _vectors
  •    .global _c_int00
  •    .global _vector1
  •    .global _vector2
  •    .global _vector3
  •    .global _vector4
  •    .global _vector5
  •    .global _vector6
  •    .global _vector7
  •    .global _vector8
  •    .global _vector9
  •    .global _vector10
  •    .global _vector11
  •    .global _vector12
  •    .global _vector13
  •    .global _vector14
  •    .global _vector15
  • *------------------------------------------------------------------------------
  • * Global symbols referenced in this file but defined somewhere else.
  • * Remember that your interrupt service routines need to be referenced here.
  • *------------------------------------------------------------------------------
  •    .ref _c_int00
  • *------------------------------------------------------------------------------
  • * This is a macro that instantiates one entry in the interrupt service table.
  • *------------------------------------------------------------------------------
  • VEC_ENTRY .macro addr
  •     STW   B0,*--B15
  •     MVKL  addr,B0
  •     MVKH  addr,B0
  •     B     B0
  •     LDW   *B15++,B0
  •     NOP   2
  •     NOP
  •     NOP
  •    .endm
  • *------------------------------------------------------------------------------
  • * This is a dummy interrupt service routine used to initialize the IST.
  • *------------------------------------------------------------------------------
  • _vec_dummy:
  •   B    B3
  •   NOP  5
  • *------------------------------------------------------------------------------
  • * This is the actual interrupt service table (IST). It is properly aligned and
  • * is located in the subsection .text:vecs. This means if you don't explicitly
  • * specify this section in your linker command file, it will default and link
  • * into the .text section. Remember to set the ISTP register to point to this
  • * table.
  • *------------------------------------------------------------------------------
  • ;.sect ".text:vecs"
  • .sect ".vectors"   ;
  • .align 1024
  • _vectors:
  • _vector0:   VEC_ENTRY _c_int00    ;RESET
  • _vector1:   VEC_ENTRY _vec_dummy  ;NMI
  • _vector2:   VEC_ENTRY _vec_dummy  ;RSVD
  • _vector3:   VEC_ENTRY _vec_dummy
  • _vector4:   VEC_ENTRY _vec_dummy
  • _vector5:   VEC_ENTRY _vec_dummy
  • _vector6:   VEC_ENTRY _vec_dummy
  • _vector7:   VEC_ENTRY _vec_dummy
  • _vector8:   VEC_ENTRY _vec_dummy
  • _vector9:   VEC_ENTRY _vec_dummy
  • _vector10:  VEC_ENTRY _vec_dummy
  • _vector11:  VEC_ENTRY _vec_dummy
  • _vector12:  VEC_ENTRY _vec_dummy
  • _vector13:  VEC_ENTRY _vec_dummy
  • _vector14:  VEC_ENTRY _vec_dummy
  • _vector15:  VEC_ENTRY _vec_dummy
  • *------------------------------------------------------------------------------
  • ********************************************************************************
  • * End of vecs.asm
  • ********************************************************************************+ a% L, J5 H7 c
         
' O% |( T$ t: A) _1 c7 h: ?; d( `% E2 {8 }/ i; Q
_vector为中断向量表的首地址标识符,系统复位后默认转入执行复位向量(复位向量始终保存在RAM的0地址处,这也就是为什么之前提到系统硬件复位后从0地址开始执行)。8 e0 v7 ?( e+ X; T$ K, B

1 h7 N) P: `4 s不烧写Flash,只要在cmd文件中将.vectors段设定在0地址处,然后调用c_int00,跳转到main函数执行。( W7 e- m0 ?# d- H+ c: K( Z

# s/ l1 f3 ?9 f7 Q使用上面的方法烧写Flash,则是在copy table完成之后调用c_int00。两者跳转到main函数的机理是一样的。
1 W* C6 [6 k; Q8 g0 l& Y  H( U( n* C2 m: a' s0 o
但是在烧写Flash的时候,要注意的一个问题就是:中断向量表存放在哪里?
1 }8 q0 q  Z' J0 H& O
7 ]3 j- K  n! M* B5 L前面烧写Flash的时候,其实有一点没有提到:当系统调用(比如定时器中断),如何才能找到(定时器)中断向量的入口函数?7 c$ d' R- m& u5 P/ J
  M1 }1 B* h2 e- Q6 G1 V! E4 E; c
因此,前面烧写Flash的方法在不做修改的情况下是无法执行中断服务程序的。
/ x, i: y; O! N  \9 I3 `+ F+ `) T* R
修改方法有2,且听一一分解。" }1 B1 b& M5 y% m6 c4 s
" v' U/ w# w( A1 h
+ a8 w) b# ]- }. C
方法一) P$ F0 O( s" @
) J/ R3 S3 q3 A; I' b# @1 c" v0 }
在进入main函数之后,重定位中断向量表的位置(关于向量表的重定位参考:DSP TMS320C6000基础学习七 —— 认识一下Bootloader与VectorTable
8 r0 L0 L8 G+ E) W: B3 a
& h8 I* {. l: M$ ~中断向量表的重定位必须在使用中断之前。
; Q. r* ~/ a  ]) s( h6 q9 ~0 X" @) P  N) J' H2 ~* W0 d
  • extern far void vectors();   /* 声明vectors,因为_vectors定义在汇编文件vecs.asm中 */
  • IRQ_setVecs(vectors);   /* 重定位中断向量表 */; I! N. P/ _* }: q" z
" B$ _- j8 }% L, b7 F1 ?
8 a8 S: F, L" T. g9 G  X2 J* g  }. r
1 I: g' h) e9 P. \4 v) G$ R9 O
方法二
& m! Y& D1 b- y0 f. k4 i+ S1 m7 h+ ?% W, m
修改汇编文件和cmd文件。基本思路是:把中断向量表保存在0地址处,在向量表之后存储二级Bootloader,通过复位中断跳转到二级Bootloader。
( E5 c7 `. {' T% w/ {+ n# m  w, x$ p  q2 q
  • 先修改cmd文件
    ' Y+ e# F; ^& J* f

1 `( G7 }! p8 E( d9 w9 o9 ~1 ~
  • -c
  • -x
  • -l rts6700.lib
  • -heap  100h
  • -stack 200h
  • MEMORY
  • {
  •     BOOT_RAM   : o=00000000h,l=00000400h
  •     IRAM       : o=00000400h,l=00040000h
  •     FLASH_BOOT : o=90000000h,l=00000400h
  •     FLASH_REST : o=90000400h,l=000FFB00h
  • }
  • SECTIONS
  • {
  •       .vectors  :> BOOT_RAM    /* 修改在这里,vectors段定义在vecs.asm中,中断向量表放在RAM 0地址处 */
  •       .boot_load:> BOOT_RAM
  •       /* Initialized User code section */
  •       .text     :> IRAM
  •       .cinit    :> IRAM
  •       .vectors  :> IRAM
  •       .bss      :> IRAM
  •       .far      :> IRAM
  •       .stack    :> IRAM
  •       .const    :> IRAM
  •       .switch   :> IRAM
  •       .sysmem   :> IRAM
  •       .cio      :> IRAM
  • }
    3 U) d* J% @' o$ U5 Y

. n6 ^8 m0 ~/ v
' J& x! B8 ?; s3 f" k4 F; t3 D0 y; C4 O% R  
  • 修改vecs.asm(只给出了修改部分)7 C; E$ L8 p0 J2 F1 M+ a) W

& i5 w4 e# E7 H, Q# U
9 R. A  g  S4 h! Y3 W
  • ...
  •    .ref _c_int00
  •    .ref _boot   ; 修改在这里,_boot段为二次引导程序入口,定义在boot_c671x.s62中
  • ...
  • .sect ".vectors"   ;
  • .align 1024
  • _vectors:
  • _vector0:   VEC_ENTRY _boot       ;RESET   修改在这里(将_c_init改成了_boot),复位后跳转到_boot执行二次引导程序
  • _vector1:   VEC_ENTRY _vec_dummy  ;NMI
  • _vector2:   VEC_ENTRY _vec_dummy  ;RSVD
  • _vector3:   VEC_ENTRY _vec_dummy
  • _vector4:   VEC_ENTRY _vec_dummy
  • _vector5:   VEC_ENTRY _vec_dummy
  • _vector6:   VEC_ENTRY _vec_dummy
  • _vector7:   VEC_ENTRY _vec_dummy
  • _vector8:   VEC_ENTRY _vec_dummy
  • _vector9:   VEC_ENTRY _vec_dummy
  • _vector10:  VEC_ENTRY _vec_dummy
  • _vector11:  VEC_ENTRY _vec_dummy
  • _vector12:  VEC_ENTRY _vec_dummy
  • _vector13:  VEC_ENTRY _vec_dummy
  • _vector14:  VEC_ENTRY _vec_dummy
  • _vector15:  VEC_ENTRY _vec_dummy+ _( L' @" F3 j

- m+ a* G; y" Q    两种方法都做过测试,都是可行的!

' J$ w4 N; x( _4 p( ]2 Z! h6 {3 w  t* s5 s# U
" @5 A" i# X, w, \  K# U, v' L6 Z
4 `  d8 U0 u3 Y7 x* I7 p2 H2 o, V
2 |1 x3 y9 {# W& u& i

9 l0 c$ z! y5 g- d2 s+ O
4 j6 Q. @( q% A2 X

4 T! U& G; N- ]) o5 B  G
3 O+ u. r9 h/ q/ g6 E0 H

/ G* ?1 g7 m) p

该用户从未签到

2#
发表于 2019-10-16 23:13 | 只看该作者
TMS320C6000烧写Flash过程中的中断向量表 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:22 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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