Board logo

标题: [求助]关于XGATE的几个问题,希望大家讨论一下 [打印本页]

作者: Holyfan    时间: 2007-12-27 15:33     标题: [求助]关于XGATE的几个问题,希望大家讨论一下

首先,我想知道如果想要Xgate处理多个中断时,是否应该这样写:

#define ROUTE_INTERRUPT(vec_adr, cfdata) \
INT_CFADDR= (vec_adr) & 0xF0; \
INT_CFDATA_ARR[((vec_adr) & 0x0F) >> 1]= (cfdata)

#define SOFTWARETRIGGER0_VEC 0x72 /* vector address= 2 * channel id */
#define IRQ_ISR 0xF2
#define PORTH_ISR 0xCC
#define ATD0_ISR 0xD2
#define ATD1_ISR 0xD0
#define MDC_ISR 0xCA

然后SetupXGATE中写:
ROUTE_INTERRUPT(SOFTWARETRIGGER0_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(IRQ_ISR, 0x81);
ROUTE_INTERRUPT(PORTH_ISR, 0x81);
ROUTE_INTERRUPT(ATD0_ISR, 0x81);
ROUTE_INTERRUPT(ATD1_ISR, 0x81);
ROUTE_INTERRUPT(MDC_ISR, 0x81);

另外,_sif()是将中断交给S12X_CPU处理,那么是不是说比如进行SCI中断,那么XGATE 可以处理一部分,用_sif()可以把剩余部分交给CPU中SCI的处理程序继续处理。

能否在CPU处理一部分后,把剩余工作交给XGATE?用什么函数或宏定义来实现。

XGATE中断在处理完中断后,程序是自动转给CPU执行正常操作吗?

好多东西不用不知道,一旦用起来才发现那么多问题,不知道哪位大虾以前做过,希望不吝赐教!
作者: TristoneGao    时间: 2007-12-27 23:45

1) 另外,_sif()是将中断交给S12X_CPU处理,那么是不是说比如进行SCI中断,那么XGATE 可以处理一部分,用_sif()可以把剩余部分交给CPU中SCI的处理程序继续处理。

是的,如果您确实需要主CPU继续处理



2) 能否在CPU处理一部分后,把剩余工作交给XGATE?用什么函数或宏定义来实现。

请参见S12XEP100的寄存器XGSWT:
10.3.1.9 XGATE Software Trigger Register (XGSWT)
该寄存器提供了8个CPU触发XGATE的中断调用
如:XGSWT=0x0101 就是调用XGATE的软件中断0

注意:通过响应的RQST比特位,也可将这8个软件中断中的若干个配置给CPU!



3) XGATE中断在处理完中断后,程序是自动转给CPU执行正常操作吗?
不是。正如您前面提到的,需要用_sif()。
作者: Holyfan    时间: 2007-12-28 12:44

10.3.1.9 XGATE Software Trigger Register (XGSWT)
该寄存器提供了8个CPU触发XGATE的中断调用
如:XGSWT=0x0101 就是调用XGATE的软件中断0
-------------------------------------------------------------

这个我看到过,可是它不是CPU进入XGATE的软件调用吗?

而且如果在TBDML或其他硬件连接方式下好像不大好用,我只在Full Chip Simulation下才能进入XGATE,难道有什么特殊设置吗?
作者: TristoneGao    时间: 2007-12-28 13:29

如果您希望“在CPU处理一部分后,把剩余工作交给XGATE”,那么就在CPU的中断服务程序的最后调用XGSWT的软件中断。没有其它特殊设置。
下面是一个例子,能够在S12XEP100的demo板上正常运行。
您可以试一试。

http://bbs.chinaecnet.com/uploadImages/Xgate_SoftInt.rar
作者: Holyfan    时间: 2007-12-28 16:35

谢谢,你给我的程序是完全由XGATE来执行的吧!
SoftwareTrigger1_Handler中的XGSWT=0x0200;是结束执行了吗?为什么要用这条语句?

另外,想请教一下,下面这两条语句当中,0x81和0x84是表示什么意思,我原来以为默认就是0x81,不需要修改呢!
ROUTE_INTERRUPT(0x72,0x81);

//switch software trigger 1 interrupt to XGATE
ROUTE_INTERRUPT(0x70,0x84);
作者: Holyfan    时间: 2007-12-28 16:40

XGSWT=0x0200清标志后,程序如何跳转呢?
作者: TristoneGao    时间: 2007-12-28 20:02

1) SoftwareTrigger1_Handler中的XGSWT=0x0200;是结束执行了吗?为什么要用这条语句?
将中断1清掉,否则刚出中断又会进中断,形成死循环

2) 0x81和0x84是表示什么意思,我原来以为默认就是0x81,不需要修改呢!
“8”表示将中断提交给XGATE。“1”/"4"表示中断优先级1/4。在S12XE的XGATE中4/5/6/7的优先级可以嵌套1/2/3级。如果您采用的是S12XD系列,则没有此功能。
这里中断1可以嵌套中断0。

3) XGSWT=0x0200清标志后,程序如何跳转呢?
回中断0。本例中中断0中为死循环。
XGATE的所有中断服务程序全部执行完后,XGATE停止运行。没有主程序或循环程序。XGATE就静静等着新的中断。
作者: Holyfan    时间: 2007-12-29 08:57

哦,谢谢!
因为我刚好用的就是XDT256,XD系列只有中断1可以嵌套中断0啊?

那像我这样写
ROUTE_INTERRUPT(IRQ_ISR, 0x81);
ROUTE_INTERRUPT(PORTH_ISR, 0x81);
ROUTE_INTERRUPT(ATD0_ISR, 0x81);
ROUTE_INTERRUPT(ATD1_ISR, 0x81);
ROUTE_INTERRUPT(MDC_ISR, 0x81);
只能是表示大家都是同样优先级喽?没有其他办法了吧?
作者: TristoneGao    时间: 2007-12-29 09:32

是的,很遗憾。没有其它办法。
S12XD中的XGATE为V2版本。S12XE中的XGATE为V3版本。
作者: TristoneGao    时间: 2007-12-29 09:37

XD不支持中断嵌套。XGATE V2不支持中断嵌套。
这个例子是在XGATE V3上运行的。XGATE V3支持一级嵌套。
主CPU支持6级嵌套。
作者: Holyfan    时间: 2007-12-29 11:05

哈哈,原来是这样!

原以为现在的XGATE使用起来一样呢!

谢谢TristoneGao了!
作者: 毛毛虫    时间: 2008-2-2 21:16

顶一下




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0