大家好!
我有一个中断服务程序,如下:
void interrupt Crank_ISR(void)
{
Crank_Signal=Get_Capture_Time(TPU_IN_RLOC_1);
}
其中Get_Capture_Time(TPU_IN_RLOC_1)是一个API函数。
这个中断服务程序在S12XCPU下是可以正常运行的,但在XGATE下就会出现Link错误:
Link Error : L1822: Symbol __X_Get_Capture_Time in file D:\Project\My-CW\S12x_ECU\S12x_ECU_Data\TBDML\ObjectCode\xgate.cxgate.o is undefined
Link Error : Link failed
(但是,如果把Get_Capture_Time函数的内容拷到XGATE中断服务程序中,又是可以正常运行的。)
上述Link错误是什么原因啊?.....请大家帮帮忙!谢谢!
还有,Crank_Signal是一个32位变量。
论坛中有一帖“XGATE中能处理32bit的数据吗?”好像跟我的问题是一个性质的,但就是不知道什么原因。
我在建立工程的时候,对于XGATE选择的是“All float and double variables are 32bit/IEEE32 for the XGATE.” 内存模式是“Banked”
但我感觉,问题不在变量上,而是在调用API函数上。因为下面的中断处理是可以的
void interrupt Crank_ISR(void)
{
if(TFLG2_TOF == 1)
{
read = TCNT; // Read to clear the TOF flag
Crank_Signal=(65536 + TC2 - TC2H);
}
else
Crank_Signal=(TC2 - TC2H);
}
求助了......
[此贴子已经被作者于2008-8-28 17:13:27编辑过]
Freescale的S12X是一个双核处理器,两个核是S12XCPU和XGATE. IDE(如Freescale的CodeWarrior)有两个编译器分别对S12XCPU和XGATE的代码进行编译。在您的第一种情况下,函数Get_Capture_Time()放在 *.c的源文件中,系统将其编译为S12XCPU的指令,XGATE当然不能执行,故Link时报错。
在第二中情况下,函数Get_Capture_Time()的代码放在*.cxgate的源文件中,故系统将其编译为XGATE的指令,XGATE就可以调用了。在此情况下,s12xcpu就不能调用该函数了。如果你想让两个核都能使用,那必须在*.C核*.cxgate的文件中都要有该函数的代码。
注意:1)S12XCPU和XGATE的指令集完全不同;2)系统IDE根据源文件的扩展名(*.c / *.cxgate)来选择相应的编译器。
希望解答了您的问题。
谢谢楼上的!
但是,我的意思并不是让两个核同时调用函数Get_Capture_Time(),我是分开调试的;首先,让s12xcpu处理中断,调用函数Get_Capture_Time(),运行正常;接下来把这部分中断任务让XGATE来做,就出现连接错误了!
帮忙啊...
已经解释过了,请再仔细阅读上面的贴子。
1)在您的第一种情况下,函数Get_Capture_Time()放在 *.c的源文件中,系统将其编译为S12XCPU的指令,XGATE当然不能执行,故Link时报错。
2)必须要将函数Get_Capture_Time()放在 *.cxgate的源文件中,系统才会将其编译为XGATE的指令,XGATE才能调用。
谢谢!谢谢!
问题是解决了!在建立API函数的时候,就要将函数Get_Capture_Time()放在 *.cxgate的文件中
[em04]欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |