问题来龙去脉:
由于公司需要开发一款基于本公司产品的输入法,我参考了其他多种输入法,在PC上设计了一款根据文件字表数据库构建查询表的拼音输入法。数据库存在于文件系统上,在初始化时,进行数据库表的读取之后构建查询表。本设计用纯C开发,不绑定GUI。在PC上调试后之后,可以无任何代码修改的移植到本公司一款基于嵌入式linux (CPU为ARM)的系统上。现在需要移植到MIPS CPU上,并且是基于本公司开发的RTOS上。比较头疼的是,没有完整的C环境,没有文件操作和malloc。所以,数据库表用内嵌资源放在memory中。问题出现了,老是data abord,经过反汇编排查,发现出现在naddr = (int)(*((int*)ptable));(其中ptable为指向数据库表的累加之后的内存地址)这行代码上。期间,排除了stack太小而被爆的情况,排除了封装的函数。估计是字节对齐的问题。我回头在PC上测试,并没有问题。为什么PC上没有呢?因为PC的x86是支持非对齐访问的。ARM+linux上没有爆发这个问题,只是没有测试而已,linux有c环境,数据库表存在文件上,从文件上读取,直接采用fread (&naddr, sizeof (int), 1, fp);并没有MIPS上出现问题的的这行代码上。
问题解决办法:
按照对齐方式来处理,此处地址刚好为2byte对齐的
short1 = (unsigned short)(*((unsigned short*)ptable));
short2 = (unsigned short)(*((unsigned short*)(ptable+2)));
nAddr = ((int)short2 << 16) + short1;
阅读(1611) | 评论(0) | 转发(0) |