QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1997|回复: 1

BUG报告(skyeye-1.2.8)

[复制链接]
发表于 2011-1-1 15:50:19 | 显示全部楼层 |阅读模式
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了
发表于 2011-1-1 21:37:45 | 显示全部楼层
1、 bug汇报的地址在sourceforge的SkyEye站点,如下:
https://sourceforge.net/tracker/?group_id=85554&atid=576533

2、以前有一个类似的bug report如下:
https://sourceforge.net/tracker/ ... 554&atid=576533

3、最新的SkyEye-1.3.2在cygwin没有测试。预计在skyeye-1.3.3支持MingW版本俄。最新的me_read代码在common/bus/ram.c

Thanks
MK
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-22 11:45 , Processed in 0.051519 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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