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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 11:31 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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