Part Number:TMS320C6678
SRIO例程
SRIO_Interrupt_Map interrupt_map[]=
{
/*interrupt_event*/ /*INTDST_number*/
{DOORBELL0_0_INT, INTDST_16}, /*route to core 0*/
{DOORBELL0_1_INT, INTDST_16}, /*route to core 0*/
{DOORBELL0_2_INT, INTDST_16}, /*route to core 0*/
{DOORBELL0_3_INT, INTDST_16}, /*route to core 0*/
{DOORBELL0_4_INT, INTDST_16} /*route to core 0*/
{DOORBELL1_0_INT, INTDST_17},
};
1.我想问下是不是只有在这个map进行映射的中断事件才会响应?
执行srio_doorbell_latency_test(0,SRIO_DOORBELL_MSG_LATENCY_TEST);
执行srio_doorbell_latency_test(0,0×27);
debug:两次中断均触发
2.我将doorbell包里的doorbellinfo设置为0x27,那么应该是会映射到DOORBELL1_7_INT中断事件,但是我并没有在map中映射这个事件,那么请问这是正常现象吗?对于这种没有进行映射的中断事件是否会响应?如果会响应的话,那么它默认映射至哪个INTDST?
执行srio_doorbell_latency_test(0,0×20);
debug:未进入中断服务程序
3.随后,我在这个map中加入了{DOORBELL1_0,INTDST17},doorbell包里的doorbellinfo设置为0x20,0核没有响应。
Shine:
请参考下面的帖子https://e2echina.ti.com/support/processors/f/processors-forum/21579/srio
,
Zahir Wang:
您提供的这个帖子里关于中断的内容我都明白,我也知道中断的路径。但是就是在调试的时候,想进行验证的时候遇到了上面这两个问题。明明没有进行映射,却能够响应中断服务程序。
执行srio_doorbell_latency_test(0,SRIO_DOORBELL_MSG_LATENCY_TEST);执行srio_doorbell_latency_test(0,0×27);
debug:两次中断均触发
2.我将doorbell包里的doorbellinfo设置为0x27,那么应该是会映射到DOORBELL1_7_INT中断事件,但是我并没有在map中映射这个事件,那么请问这是正常现象吗?对于这种没有进行映射的中断事件为什么会响应?
,
Zahir Wang:
另外我想问下,SRIO_vectors.asm文件如果我想移植到其他工程里,除了把文件复制过去,然后根据需要修改中断向量表之外,还需不需要其他操作?比如#include或者调用之类的操作?
在SRIO例程中.不清楚SRIO_vectors.asm的调用过程?
,
Zahir Wang:
已清楚关于SRIO_vectors.asm文件的使用.
如果想使用该中断向量表共有三部分操作.
1.在中断初始化程序中,进行中断映射等步骤,如下图所示.
2.修改SRIO_vectors.asm文件,将自定义中断程序与中断向量进行捆绑,如下图所示.
3.修改.cmd文件,
在MEMORY里添加如下语句
VECTORS: o = 0x00800000 l = 0x00000200
在SECTIONS里添加如下语句
vecs > VECTORS
完成这三步操作应该就可以待中断产生时,响应中断跳入中断服务程序.
,
Shine:
srio_doorbell_latency_test函数只有一个参数Uint32 uiPortNum,您调用的时候传了两个参数。volatile Uint32 uiDoorbell_TSC= 0; //timestamp when doorbell interrupt happensvoid srio_doorbell_latency_test(Uint32 uiPortNum){ Uint32 cycles;
cycles= TSCL; KeyStone_SRIO_DoorBell(uiPortNum, uiPortNum, DSP0_SRIO_BASE_ID+uiPortNum, SRIO_DOORBELL_MSG_LATENCY_TEST);
if(0==uiDoorbell_TSC) asm(" IDLE"); //waiting for doorbell interupt cycles= ((unsigned int)((0xFFFFFFFFl+uiDoorbell_TSC)- (unsigned long long)cycles)+ 1);
printf("doorbell latency is %4d cycles\n\n", cycles);}可以看一下KeyStone_1_SRIO_STK_User's_Guide.doc里的3.3 Doorbell latency,中断是接收到doorbell触发的。
,
Zahir Wang:
我传的第二个参数就是doorbellinfo,为了可视化,我就把它加进了形参里。
中断确实是发送doorbell包产生的,并且我也清楚doorbell里的info位和interrupt event以及INTDST_NUM是相互关联的,是在interrupt map中进行映射的。
因此,我想验证一下这映射关系,进行了两个实验。
1.将doorbellinfo位值设置为interrupt map里并没进行映射的事件,如0x27(对应于DOORBELL1_7_INT),实验结果是0核响应了这个doorbell包。按道理没有进行映射,不是不应该响应嘛,所以我就产生了疑问。
2.将某一事件映射至INTDST17,然后发对应的doorbell包,结果是0核并没有产生中断,应该是符合逻辑的。
,
Shine:
如果不修改例程,也会产生中断吗?发生中断的话,应该是进行中断映射和使能了。