|
在www.skyeye.org上没有发现bug报告的地方,到这里来报告一下。
首先列一下我的使用环境:
操作系统:windowXP
编译系统:cygwin 1.7.7-1
目标系统:VxWorks 5.5
我用skyeye模拟公司的系统,参照公司的BSP代码新适配了一块单板,已经运行成功,但发现有个地方效率奇低,经过仔细检查,发现在调用vxWorks中的strstr函数时花费了大量时间,为什么呢?于是进一步调试strstr函数的代码,终于发现skyeye 1.2.8对于字节的读操作存在问题,我专门写了验证代码:
char c1='a';
unsigned char c2='a';
char str[]="abc";
char *p=str;
然后打印c1,str[0],str[1],str[2],p[0],p[1],p[2]
经过运行发现c1,str[0],str[1],str[2]的结果全部大于256,而p[0],p[1],p[2]的结果却是正确的。
进一步查看发现c1,str[0],str[1],str[2]的结果低8位是‘a’,貌似被随机加上了高24位的数据。
问题找到了,于是就查看skyeye 1.2.8的代码,由于打印的变量地址每次运行都是一样的,也就是说以上c1,c2每次运行时地址不变,所以我在skyeye 1.2.8代码中读内存的地方加了一个打印,条件是地址为c1的地址时才打印,否则打印太多了,没法看,这样一来发现读出来的时候确实有问题,但低8位是正确的,于是进一步往下找终于找到了临界点:mem_read函数:
char mem_read(short size, int offset, uint32_t * value){
void * state;
switch(size){
case 8:
*(uint8_t *)value = (uint8_t)mem_read_byte (offset);
break;
case 16:
*(uint16_t *)value = (uint16_t)mem_read_halfword(offset);
break;
case 32:
*value = mem_read_word(offset);
break;
default:
fprintf(stderr, "In %s, invalid data length %d\n", __FUNCTION__, size);
return -1;
}
return 0;
}
mem_read_byte 返回的是正确的,但是打印value的值却不正确,此时我修改代码如下:
char mem_read(short size, int offset, uint32_t * value){
void * state;
switch(size){
case 8:
*value = (uint8_t)mem_read_byte (offset);
break;
case 16:
*value = (uint16_t)mem_read_halfword(offset);
break;
case 32:
*value = mem_read_word(offset);
break;
default:
fprintf(stderr, "In %s, invalid data length %d\n", __FUNCTION__, size);
return -1;
}
return 0;
}
经过实际运行,问题得到解决,所以我认为此函数的“字节”和“字”的读操作存在问题,请感兴趣的同学看看我说的对不对,修改之后我发现vxWorks系统启动速度提高了很多,呵呵。
skyeye的其它版本我没有查看,1.3.2版本的变化似乎比较大, mem_read的实现不一样,不知道高版本运行情况如何,我没有试过,因为1.3.2在我这里编不过,只好用1.2.8了 |
|