|
|
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# U9 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+ O4 j6 Q. @( q% A2 X
4 T! U& G; N- ]) o5 B G3 O+ u. r9 h/ q/ g6 E0 H
/ G* ?1 g7 m) p |
|