在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
NOP
NOP
.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