EDA365电子论坛网
标题:
TMS320C6000烧写Flash过程中的中断向量表
[打印本页]
作者:
mytomorrow
时间:
2019-10-15 14:25
标题:
TMS320C6000烧写Flash过程中的中断向量表
TMS320C6000烧写Flash过程中的中断向量表
& E, S+ G. T9 N J0 l; @0 S
3 U7 A/ K3 Z/ F* f
. S* |* u: b, w' U
就前面的烧写方法中,请思考一个问题,程序是从何时何处跳转到main函数执行的?
4 F* V/ ~, O( o0 r: @
`, |' z t, P5 O
如果不烧写Flash,我们都应该知道是在vecs.asm中
2 k3 p; v" c. i& K6 y
' w/ k$ w) x$ L( {9 b Y- J
********************************************************************************
* 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
********************************************************************************
- ~6 G& t1 m9 M( `+ |
5 [. _5 _: T) t3 V* E
5 @! K c9 y; @( @
_vector为中断向量表的首地址标识符,系统复位后默认转入执行复位向量(复位向量始终保存在RAM的0地址处,这也就是为什么之前提到系统硬件复位后从0地址开始执行)。
" B U$ I+ U7 [% \+ Z _
3 x# O1 ]3 b; u" S N
不烧写Flash,只要在cmd文件中将.vectors段设定在0地址处,然后调用c_int00,跳转到main函数执行。
) t. q# d+ Q6 C7 f3 F Z% h. C8 \
5 Y6 }. @& V' T: F! i
使用上面的方法烧写Flash,则是在copy table完成之后调用c_int00。两者跳转到main函数的机理是一样的。
$ V5 ?+ M0 ?6 L5 B7 r1 d
) F* {. t2 J* Z7 O- z$ A
但是在烧写Flash的时候,要注意的一个问题就是:中断向量表存放在哪里?
4 q" {' u) M a
! E: R7 x( h, Z i' e, C! y
前面烧写Flash的时候,其实有一点没有提到:当系统调用(比如定时器中断),如何才能找到(定时器)中断向量的入口函数?
u, f& h+ N) J2 Y: D' t
1 g, t8 B8 M2 _/ X' O/ q
因此,前面烧写Flash的方法在不做修改的情况下是无法执行中断服务程序的。
4 @0 v( E B+ {) x: j- h, K
u- i( n W, l8 o3 @$ x8 |9 f
修改方法有2,且听一一分解。
' X+ P1 V8 G" K# B4 }
2 l* a! v& w9 `* u* v6 v
; `1 D/ M4 H# Q5 L& |6 @
方法一
7 b0 m; c: x6 n0 H$ Q
: B" x4 D& j6 ^5 |) N5 `2 @
在进入main函数之后,重定位中断向量表的位置(关于向量表的重定位参考:
DSP TMS320C6000基础学习七 —— 认识一下Bootloader与VectorTable
. b( \+ ~- c/ E* C) K- C2 S
' Z9 m: D& \ t; Z7 [
中断向量表的重定位必须在使用中断之前。
7 V5 Q o; J' Y) r. |' [' t
+ G. Z. w2 n9 V5 Z1 ?4 l
extern far void vectors(); /* 声明vectors,因为_vectors定义在汇编文件vecs.asm中 */
IRQ_setVecs(vectors); /* 重定位中断向量表 */
$ V5 H7 B+ K( h9 R& z
% B) w2 l" U, K2 G0 {
% s5 s( f5 }# B+ F. r/ w! p Q N
$ N* Q4 J1 S1 {2 u8 c
方法二
1 y) Z- s& _0 M9 j: g E5 B
: E& U2 d+ C% J4 C4 |
修改汇编文件和cmd文件。基本思路是:把中断向量表保存在0地址处,在向量表之后存储二级Bootloader,通过复位中断跳转到二级Bootloader。
& z+ ?& Z: A, F% j: z0 u! W/ p5 ]8 h" ?
% w0 _3 {9 O$ m8 S2 }4 @% w
先修改cmd文件
: s& y3 O* O; S) w, `1 w0 z4 m
& K" K: k% ^( d
-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
}
6 i& k) n, {8 ?& v
}: ]* Q4 Q _
- ]$ z% V6 F- `( G
修改vecs.asm(只给出了修改部分)
- u2 k* |9 ^1 w6 q4 t7 _
9 F% J$ J9 m- S8 h
3 p6 n3 v, Y2 \2 a& I9 h
...
.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
" r5 k4 G, w8 Z9 p7 t! r
, _& \' k% [+ n3 K7 s6 i% t
两种方法都做过测试,都是可行的!
) g3 V6 e3 o5 ~7 ^: u
. O Y; }- u' ]) y2 r0 @5 B) q
- T$ z6 Q3 P U" E' S; l
+ n1 u; X: J9 x0 u/ I: b! P
7 l6 ]& J! |9 d- n5 n! {! K
$ c3 r! a3 n8 b- c" O
& M5 i3 H! _+ U
( a: e; Z7 ~: j$ ]3 }! F
( z; t" P/ F% ]
. ^' T: ?% [& [- q$ u/ p
作者:
wu68aq
时间:
2019-10-16 23:13
TMS320C6000烧写Flash过程中的中断向量表 。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2