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

xgate把中断交给S12X问题,斑竹和高手来帮下!!!

xgate把中断交给S12X问题,斑竹和高手来帮下!!!

本帖最后由 hithtl 于 2010-6-13 14:36 编辑

两个问题:
1.我用xgate处理CAN中断,其中有一条CAN信息是通过 ASM{SIF} 指令给了S12X处理,但是调试发现,S12X只能处理几次这样的中断,十来次后单片机就停止工作了,如果我把SIF指令去掉,XGATE运行是没有问题的,单片机也不会停止,有谁碰到过这样的问题,如何解决?

2.XGATE是不是处理32位数据的时候有问题,我有一个32位的共用体变量,把它赋值给另一个32位无符号变量,在S12X下没问题,在XGATE下高16位老不对,低16位是正确的
自己顶,发现跑飞不是XGATE问题,是CPU自己中断出问题了,还有一个问题,希望有解决的
没有代码,不知道真相。
第一个问题,一,XGATE里要清CAN的中断标志;二,CPU中断里要清XGATE的中断标志。
第二个问题,原因是XGATE的一个字必须从偶地址开始,而主处理器一个字则没有这种要求。比如定义一个结构体:
struct  
{
    unsigned int a;
    unsigned char b;
    unsigned int c;
}box;
假设地址是从0开始的,那么在主处理器中,box.a的地址是0,box.b的地址是2,box.c的地址是3,但到了XGATE中,box.a的地址是0,box.b的地址是2,到box.c的时候,因为xgate的字必须要从偶地址开始,地址就变成4了。因此,在主处理器中,box占用地址0-5的5个字节,而在XGATE中,box占用地址0-6的6个字节。
我用了个取巧的办法,假如a,b,c都是我们需要的数据,为了保证对齐,我在b和c之间插入了一个char 型,结构体就变成:
struct  
{
    unsigned int a;
    unsigned char b;
    unsigned char reserve;
    unsigned int c;
}box;
这样就保证了2边的地址大小一致,而又不需要修改原有代码。
返回列表