查看: 3851|回复: 3

[其他] XEP100的XGATE协处理器程序设计

[复制链接]

该用户从未签到

10

主题

89

帖子

0

中级会员

Rank: 3Rank: 3

积分
378
最后登录
1970-1-1
发表于 2014-7-8 10:02:06 | 显示全部楼层 |阅读模式
 
 

XEP100XGATE协处理器程序设计

      前几天在XGATE使用时遇到了一些问题,主要是XGATE的工程构建原先就和单处理器的不一样,在这里将经验分享一下次
    注意,在进行XGATE程序设计时,带有XGATE的程序框架与一般的系统程序工程的框架有较大的区别。如果有自己进行程序的架构或从其他XGATE工程移植,难免会有所遗漏,而且设计系统工程内部构架难度较大。所以一般建议另建工程或在原有可以正常使用的XGATE的工程基础上备份修改。
1、  一个新的带有XGATECodeWarrior的建立
QQ图片20140708095255.jpg
QQ图片20140708095343.jpg
 
 
注意这里必须要选中Multi Core(HS12X and XGATE), 其他步骤与一般工程相同。建立工程后可以发现在新工程中多了很多关于XGATE的内容。其中包括xgate.cagatexgate.h文件。
 
1、  XGATE处理外部中断的应用样例
在新建的工程中需要对函数的具体代码进行相应的修改,以处P口的外部中断为例,具体如下
首先进入xgate.cagate中查找P口中断在XGATE中的中断号如下:
{ErrorHandler, 0x47},  // Channel 47 - Port P Interrupt
0x47,从而main.c中修改相应的定义名称如下:
#define PORTPISR_VEC  0x8E /* vector address= 2 * channel id */
 
 
并对SetupXGATE进行修改如下:
static void SetupXGATE(void) {
  /* initialize the XGATE vector block and
     set the XGVBR register to its start address */
  XGVBR= (unsigned int)(void*__far)(XGATE_VectorTable - XGATE_VECTOR_OFFSET);
 
  /* switch software trigger 0 interrupt to XGATE */
  ROUTE_INTERRUPT(PORTPISR_VEC, 0x81); /* RQST=1 and PRIO=1 */
 
  /* when changing your derivative to non-core3 one please remove next five lines */
  XGISPSEL= 1;
  XGISP31= (unsigned int)(void*__far)(XGATE_STACK_L + 1);
  XGISPSEL= 2;
  XGISP74= (unsigned int)(void*__far)(XGATE_STACK_H + 1);
  XGISPSEL= 0;
 
  /* enable XGATE mode and interrupts */
  XGMCTL= 0xFBC1; /* XGE | XGFRZ | XGIE */
 
  /* force execution of software trigger 0 handler */
  //XGSWT= 0x0101;
 
}
main函数中系统已经添加了SetupXGATE();如没有请自行添加。
设定完毕后,主处理器已经将该口中断交给XGATE负责处理。下面需要对XGATE的中断函数进行修改,打开xgate.cxgate文件,将原有的中断函数去除,添加上自己需要用到的中断函数
interrupt void Portp_Handler(MyDataType* __restrict pData) 
{
    //put your own code here
    PIFP_PIFP0=1;   //清除中断标志位 
  }
  
于此同时必须对下边XGATE的中断向量表进行修改,去除工程默认的软件中断改为ErrorHandler,同时在P口向量处修改向量名。具体如下:
QQ图片20140708095913.jpg
在修改完毕后,XGATE已经可以正常工作,但此时必须注意XGATE的变量存储于主处理器是分开的,如果需要同时在这两个处理器中共用通一个变量,即进行变量沟通,可进行一下操作。
main函数中定义全局变量:volatile int shared_counter;
同时在xgate.h中定义:volatile extern int shared_counter;
这样就将shared_counter这个变量共享了,此处注意volatile extern的程序用法。
 
 
                                                                                                                                                                                               Tommy 2014/7/6
我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-7-8 13:46:36 | 显示全部楼层

RE:XEP100的XGATE协处理器程序设计

谢谢楼主的精彩分享!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13136
    最后登录
    2019-1-27
    发表于 2014-7-9 09:31:59 | 显示全部楼层

    RE:XEP100的XGATE协处理器程序设计

    好东西,多谢分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    6

    帖子

    0

    新手上路

    Rank: 1

    积分
    21
    最后登录
    1970-1-1
    发表于 2014-11-3 15:23:54 | 显示全部楼层
    非常感谢楼主的分享!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-26 07:38 , Processed in 0.093706 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表