TI中文支持网
TI专业的中文技术问题搜集分享网站

关于TMS320C6416T 中断向量表vectors.asm中堆栈保护的问题!

    在TMS320C6416T 开发过程中在有大约%10产品(90%是正常的)在vectors.asm中执行入口地址跳转时导致PCI异常(产品采用PCI加载方式,确认DSP代码已正常完整加载到6416T中),根据调试情况可以确定与堆栈保护指令有关!跟踪调试发现出现问题的原因时在执行_c_int00跳转时首先运行指令STW B0,*–B15(该指令在6416T地址0位置),而这里的B15即是堆栈指针SP,此时SP的值为0x410f0121或者0x410b0021等值(该值所在地址区域根据手册显示为保留区域),在正常板卡上SP指针的值是 0xd7fefef6(也是保留空间)。vectors.asm文件内容附后,现有以下问题:

1、为什么采用堆栈保护会导致PCI异常?

2、在程序最开始时,堆栈指针SP时如何分配的?同是保留空间,为何分配在0x40000000区域时会异常而分配在0Xd0000000区域时,又正常!

3、这种现象只出现在小部分产品上,是什么原因呢?

具体的vectors.asm内容如下

*Vectors_poll.asm Vector file for polling
.global _vectors
.global _c_int00
.global _vector0
.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

.ref _c_int00 ;entry address

VEC_ENTRY .macro addr
STW B0,*–B15
MVKL addr,B0
MVKH addr,B0
B B0
LDW *B15++,B0
NOP 2
NOPNOP.endm

_vec_dummy:
B B3
NOP 5

.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

Shine:

请问出现问题的板子在仿真器模式下能正常跑这个程序吗?还是只有通过PCIE加载后才会出现这个问题?

Tony Tang:

li wang8跟踪调试发现出现问题的原因时在执行_c_int00跳转时首先运行指令STW B0,*–B15(该指令在6416T地址0位置)

应该将_c_int00放在0地址,而不是中断向量表放在0地址。

li wang8:

回复 Shine:

在DEBUG时可以正常跑这个程序,而且90%产品不会出现这个问题!

li wang8:

回复 Tony Tang:

cinit是在0地址啊,只是进入cinit后第一条语句就是堆栈保护STW B0,*–B15这条语句!你的意思是在程序如果地址跳转时不能进行堆栈保护么?为什么呢?

Tony Tang:

回复 li wang8:

_c_int00是一个独立的函数(在RTS库里),用来初始化C环境。

你上面的是一个中断向量表,跳转到到_c_int00,而不是_c_int00本身。

 

Tony Tang:

回复 li wang8:

li wang8在DEBUG时可以正常跑这个程序,而且90%产品不会出现这个问题!

在Debug时是什么意思?

li wang8:

回复 Tony Tang:

感谢Tony Tang的回答,就我使用的中断向量表而言,在程序加载完成后,PC指针就指向了0地址了,而这个0地址所在的语句就是STW B0,*–B15,您给我的这个回复我可以理解为0地址应该放_c_int00的相关语句 而不是堆栈保护的语句么?

debug时 是指使用仿真器在线调试!

Tony Tang:

回复 li wang8:

li wang8我可以理解为0地址应该放_c_int00的相关语句 而不是堆栈保护的语句么?

是的,因为在程序开始运行时,并不存在保护堆栈指针这一说,而是要初始化堆栈等一系列C语言运行环境,这些是在RTS库的_c_int00里实现的,如果有兴趣,你可以看其源码,在编译器相关的目录下的rtssrc.zip里。

C:\ti\ccsv6\tools\compiler\c6000_7.4.18\lib\src\boot.c

 

li wang8debug时 是指使用仿真器在线调试!

仿真器下载后,自动从_c_int00开始运行,然后跳转到main 。

li wang8:

回复 Tony Tang:

谢谢Tony Tang的回答,我理解到您意思了,但是解释不了为什么90%产品不会出现这个现象而其他10%的产品会出现这个现象呢?

Tony Tang:

回复 li wang8:

这10%的产品的问题是每次上电加载后必现的吗?

赞(0)
未经允许不得转载:TI中文支持网 » 关于TMS320C6416T 中断向量表vectors.asm中堆栈保护的问题!
分享到: 更多 (0)