首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]关于XGATE的几个问题,希望大家讨论一下

[求助]关于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执行正常操作吗?

好多东西不用不知道,一旦用起来才发现那么多问题,不知道哪位大虾以前做过,希望不吝赐教!
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()。
10.3.1.9 XGATE Software Trigger Register (XGSWT)
该寄存器提供了8个CPU触发XGATE的中断调用
如:XGSWT=0x0101 就是调用XGATE的软件中断0
-------------------------------------------------------------

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

而且如果在TBDML或其他硬件连接方式下好像不大好用,我只在Full Chip Simulation下才能进入XGATE,难道有什么特殊设置吗?
如果您希望“在CPU处理一部分后,把剩余工作交给XGATE”,那么就在CPU的中断服务程序的最后调用XGSWT的软件中断。没有其它特殊设置。
下面是一个例子,能够在S12XEP100的demo板上正常运行。
您可以试一试。

http://bbs.chinaecnet.com/uploadImages/Xgate_SoftInt.rar
谢谢,你给我的程序是完全由XGATE来执行的吧!
SoftwareTrigger1_Handler中的XGSWT=0x0200;是结束执行了吗?为什么要用这条语句?

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

//switch software trigger 1 interrupt to XGATE
ROUTE_INTERRUPT(0x70,0x84);
XGSWT=0x0200清标志后,程序如何跳转呢?
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就静静等着新的中断。
哦,谢谢!
因为我刚好用的就是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);
只能是表示大家都是同样优先级喽?没有其他办法了吧?
是的,很遗憾。没有其它办法。
S12XD中的XGATE为V2版本。S12XE中的XGATE为V3版本。
XD不支持中断嵌套。XGATE V2不支持中断嵌套。
这个例子是在XGATE V3上运行的。XGATE V3支持一级嵌套。
主CPU支持6级嵌套。
哈哈,原来是这样!

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

谢谢TristoneGao了!
顶一下
返回列表