读书人

郁闷了十几天的移植有关问题,标准如何

发布时间: 2012-02-16 21:30:36 作者: rapoo

郁闷了十几天的移植问题,标准怎么说???
郁闷!
  我是做嵌入式开发的,最近十几天移植别人的股票系统库,传数据进入股票系统总是死机,没有原码,郁闷了很多天才把这个问题解决.
  原来在他的库里面使用了类似于以下的语句:
  char pData[1024];
short *p,result;
  
  ...  

p=(short *)(pData+9);
result = *p;

  在最后一句出现异常了.在我们的系统中,奇地址上不能一次访问2个或者4个字节,但他的库在另外一个平台是可以的.

  不知大家遇到过这种问题?
  标准里面有没有对此作出规定?






[解决办法]
标准里没有对此作出规定
你这个异常是硬件相关的
[解决办法]
很明显可以看出来, 是由于lz的硬件环境中 short * 的访问不能访问奇地址。
标准并没有对此作出约定。

解决的办法麻, 如果一定要+9的话,也可以将 pData置于一个奇地址就可以了。
[解决办法]
MIPS CPU上有一个“对齐”异常,就是在这种情况下产生的。

解决这一类问题分两个步骤:a、分析问题原因;b、提出解决问题的方案并实施。

a、分析问题原因
楼主花了十几天来找这个问题,效率太低,主要原因是方法不对。一般来说,计算机不会莫名奇妙的死机,死之前总会有一些“异常”的征兆,正确解释死机之前的征兆就最好的线索。楼主的这个,在很多机器上都能够显示异常(exception)号码,CPU的手册上有该异常(exception)号码对应的详细解释,很快就清楚是什么原因了。

b、解决方案
由于楼主用的是别人的library,没有源代码,因此要修改源代码的方案是不可行的。最佳方案是的做法是编写一段该异常(exception)的服务程序,挂到系统的中断入口处,专门处理这种情况。就好像以前的i386没有FPU,如果遇到浮点指令,就产生一个“指令”异常,浮点模拟软件作为“指令”异常的服务程序被运行。道理是一样的。

另外,即便有源代码,如果代码量大,也很难把所有的这样错误语句都找全,漏掉一个,就是一个炸弹,说不清楚什么时候还会死机。所以直接修改源代码不是最好的方案。

如果一定要去对源码动手,那么还有一个办法,就是用PC-Lint来帮忙,他可以把所有这样地方找出来。

(回答结束)


[解决办法]
这种赤裸裸的内存hack本来就是不可移植的。自己动手改吧。

读书人网 >C语言

热点推荐