在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%的产品的问题是每次上电加载后必现的吗?