[求助]关于XGATE的几个问题,希望大家讨论一下
- UID
- 165497
- 性别
- 男
|
[求助]关于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执行正常操作吗?
好多东西不用不知道,一旦用起来才发现那么多问题,不知道哪位大虾以前做过,希望不吝赐教! |
|
|
|
|
|
- UID
- 341189
- 性别
- 男
|
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()。 |
|
|
|
|
|
- UID
- 165497
- 性别
- 男
|
10.3.1.9 XGATE Software Trigger Register (XGSWT)
该寄存器提供了8个CPU触发XGATE的中断调用
如:XGSWT=0x0101 就是调用XGATE的软件中断0
-------------------------------------------------------------
这个我看到过,可是它不是CPU进入XGATE的软件调用吗?
而且如果在TBDML或其他硬件连接方式下好像不大好用,我只在Full Chip Simulation下才能进入XGATE,难道有什么特殊设置吗? |
|
|
|
|
|
- UID
- 341189
- 性别
- 男
|
如果您希望“在CPU处理一部分后,把剩余工作交给XGATE”,那么就在CPU的中断服务程序的最后调用XGSWT的软件中断。没有其它特殊设置。
下面是一个例子,能够在S12XEP100的demo板上正常运行。
您可以试一试。
http://bbs.chinaecnet.com/uploadImages/Xgate_SoftInt.rar |
|
|
|
|
|
- UID
- 165497
- 性别
- 男
|
谢谢,你给我的程序是完全由XGATE来执行的吧!
SoftwareTrigger1_Handler中的XGSWT=0x0200;是结束执行了吗?为什么要用这条语句?
另外,想请教一下,下面这两条语句当中,0x81和0x84是表示什么意思,我原来以为默认就是0x81,不需要修改呢!
ROUTE_INTERRUPT(0x72,0x81);
//switch software trigger 1 interrupt to XGATE
ROUTE_INTERRUPT(0x70,0x84); |
|
|
|
|
|
- UID
- 165497
- 性别
- 男
|
XGSWT=0x0200清标志后,程序如何跳转呢? |
|
|
|
|
|
- UID
- 341189
- 性别
- 男
|
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就静静等着新的中断。 |
|
|
|
|
|
- UID
- 165497
- 性别
- 男
|
哦,谢谢!
因为我刚好用的就是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);
只能是表示大家都是同样优先级喽?没有其他办法了吧? |
|
|
|
|
|
- UID
- 341189
- 性别
- 男
|
是的,很遗憾。没有其它办法。
S12XD中的XGATE为V2版本。S12XE中的XGATE为V3版本。 |
|
|
|
|
|
- UID
- 341189
- 性别
- 男
|
XD不支持中断嵌套。XGATE V2不支持中断嵌套。
这个例子是在XGATE V3上运行的。XGATE V3支持一级嵌套。
主CPU支持6级嵌套。 |
|
|
|
|
|
- UID
- 165497
- 性别
- 男
|
哈哈,原来是这样!
原以为现在的XGATE使用起来一样呢!
谢谢TristoneGao了! |
|
|
|
|
|
- UID
- 121393
- 性别
- 男
|
|
|
|
|
|