|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
TMS320C6000烧写Flash过程中的中断向量表
" M/ h/ K/ ~1 T8 b1 t/ D0 m$ b" m) J- O" T
0 r$ c e& B/ S' |; W, ?( {* }
就前面的烧写方法中,请思考一个问题,程序是从何时何处跳转到main函数执行的?
+ U' k) j. A5 M' |9 v3 c
+ W/ q3 x E: U& I" `& D& p如果不烧写Flash,我们都应该知道是在vecs.asm中/ A' v2 Q# D0 Z3 J
4 N; L- P! Q! j3 \! h2 S. r
- ********************************************************************************
- * 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
- ********************************************************************************
' X f% s3 n4 e5 v( A5 \' |
4 C; ^. ]1 a7 `) S, @) y$ B& x8 J0 i0 |6 S
_vector为中断向量表的首地址标识符,系统复位后默认转入执行复位向量(复位向量始终保存在RAM的0地址处,这也就是为什么之前提到系统硬件复位后从0地址开始执行)。
* ~; }! D/ J* U2 _8 [: p" a* s( ~5 R+ R1 z6 O$ v7 M2 m. @; L
不烧写Flash,只要在cmd文件中将.vectors段设定在0地址处,然后调用c_int00,跳转到main函数执行。
% R7 \& d: K5 y Y2 ^8 Y2 h9 c
' |; j2 s# c/ B0 f使用上面的方法烧写Flash,则是在copy table完成之后调用c_int00。两者跳转到main函数的机理是一样的。
" E( b# X) ]# w/ q+ a8 O0 _
: c- G8 n% C8 N9 G- ` X, J3 Y但是在烧写Flash的时候,要注意的一个问题就是:中断向量表存放在哪里?8 p; R3 x/ d& R# t; s' [( g
6 S- |8 }! V9 i, g% P7 X前面烧写Flash的时候,其实有一点没有提到:当系统调用(比如定时器中断),如何才能找到(定时器)中断向量的入口函数?
4 p1 F+ U" H9 X3 ?. F
' X" q S' d1 j" G因此,前面烧写Flash的方法在不做修改的情况下是无法执行中断服务程序的。- P: |! `% i$ N, g
" ^/ [0 q6 t& q( L/ M
修改方法有2,且听一一分解。6 \( Q3 q. l9 H- P9 V; z5 E
1 C0 }) s Z. A4 h0 R: e; A
, n" s4 A- N8 z5 C$ Q1 E' V3 |
方法一1 z" G0 l0 b7 {1 V
1 V7 i* A& v$ T1 m" k6 O2 w8 H2 B# l
在进入main函数之后,重定位中断向量表的位置(关于向量表的重定位参考:DSP TMS320C6000基础学习七 —— 认识一下Bootloader与VectorTable
$ F+ G% b$ x/ E" }' s1 z
2 s2 |! c; R7 {中断向量表的重定位必须在使用中断之前。; b0 Q: e4 p' [
4 o) i" ]6 M5 c- E) Z# k- extern far void vectors(); /* 声明vectors,因为_vectors定义在汇编文件vecs.asm中 */
- IRQ_setVecs(vectors); /* 重定位中断向量表 */ c$ w! l$ C0 p6 [' g, V# | L
0 H2 _6 R6 f$ W0 v! h
2 F! F6 B1 q; o& Q' R1 g+ v ]! x: ]' W2 H3 a9 [) D5 c+ Q- R9 q
方法二
6 j3 E8 p: T- v
* K: T2 L# }" _3 \$ \% C7 t修改汇编文件和cmd文件。基本思路是:把中断向量表保存在0地址处,在向量表之后存储二级Bootloader,通过复位中断跳转到二级Bootloader。% k5 }- [$ U2 g9 I1 E
& b$ C3 B/ G3 E: z! m$ J+ {* q5 C4 d- 先修改cmd文件5 x* N2 s1 w5 N7 C0 K
. O1 i9 M" p3 `* B1 r! ~" b3 U
- -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
- }$ }& ]* U; d' F- H
! L7 S' Q. y7 l. n
N8 n. a6 h6 t0 b( G
- 修改vecs.asm(只给出了修改部分), Q- O) ]4 z, v0 F# l5 U5 E
" K" w. ~8 P; ?( m y/ ?& R) d( V/ m; V1 N( y% ^" J w8 q/ `% W- P
- ...
- .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
: K* M' z# i4 N: V! [. x
4 @: p8 @- ^, ^' s3 A) ? 两种方法都做过测试,都是可行的!+ |- s% R+ {/ C) m# q' s- }
8 x* E6 m; z6 }* b1 [& k* ^: |
+ u& f, j4 B c1 o/ u
T, P P Z) g. ?7 d
; T8 Z+ o' \0 D/ O1 ]9 R& F, z
3 w0 p3 [. O6 S1 L/ t
+ {1 g! ~) |- o: w. ?, r& u8 }' P3 R/ x: T) M* Z9 N: b
) d2 \# n' A* u3 H
5 [% Q5 w1 r/ ]3 i |
|