6954|25

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

arm-gcc编译问题,高手指教,在线等!!!指教!在线等!!!帮忙!!!!! [复制链接]

#include
#include
#include
#include

char RoundToInt64 (float dval)
{
    char val;
    static float magic = 12582912.0;
    dval += magic;
    val = *(char *)&dval;
    return val;
}
int main()
{
    char e = 5;
    float d = 9.67;
    struct timeval ts,te;
    int utime;
    int i = 0;
   
    gettimeofday(&ts,NULL);
    for(i=0;i<100000;i++)
    {
        e = RoundToInt64 (d);
    }
    gettimeofday(&te,NULL);
    utime = te.tv_usec - ts.tv_usec;
    printf("utime is %d\n",utime);
    printf("trunc d is %d\n",e);
//  getchar();
    return 0;
}
以上程序用gcc编译成功,运行没问题。可是用arm-gcc编译后在arm7上运行结果如下:

[/host]cd important/
[/host/important]./mmm1
utime is -240000
trunc d is 10
[/host/important]./mmm1
utime is -240000
trunc d is 10
[/host/important]./mmm1
utime is 760000
trunc d is 10
[/host/important]./mmm1
utime is -240000
trunc d is 10
不知是硬件不同的原因还是编译器的原因。高手指教!!!!!
此帖出自ARM技术论坛

最新回复

还有一个问题就是:为什么时钟频率低就测不出微秒级的,是不是因为产生两次频率变化的时间间隔比1us大呢?不知我的理解是不是正确。谢谢!!!!  详情 回复 发表于 2007-4-21 08:23
点赞 关注
 

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
unix下的吗?用keil呢?
此帖出自ARM技术论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不是编译器的问题,是你具体硬件平台上如何配置时钟以及gettimeofday函数的问题。有的平台会用高精度的时钟来计时,那么这样计时就很准;有的则精度较低;更有一些,在系统时钟和硬件时钟之间一定间隔内同步,就会引起负数问题。看你的结果,应该是精度较低+定时同步。可以跟到ARM7板子上的函数里看一下。
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
怎么跟,本人菜鸟,高手指教了。笑话我也没事。我很菜。不好意思。谢谢了!!!!!!!!
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
arm7+uclinux
此帖出自ARM技术论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
不会笑话你的。就是查找一下源代码里面的具体实现吧。你可以贴出来,我来看看。
此帖出自ARM技术论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
哪个具体实现,不太明白。
include
#include
#include
#include

char RoundToInt64 (float dval)
{
    char val;
    static float magic = 12582912.0;
    dval += magic;
    val = *(char *)&dval;
    return val;
}
int main()
{
    char e = 5;
    float d = 9.67;
    struct timeval ts,te;
    int utime;
    int i = 0;
   
    gettimeofday(&ts,NULL);
    for(i=0;i<100000;i++)
    {
        e = RoundToInt64 (d);
    }
    gettimeofday(&te,NULL);
    utime = te.tv_usec - ts.tv_usec;
    printf("utime is %d\n",utime);
    printf("trunc d is %d\n",e);
//  getchar();
    return 0;
}
源码就是这个,是编译以后的源码吗?怎么看,不好意思。太菜了,见笑了.
指点一下。谢谢!!!!
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
不是啊,你在你的整个工程里搜索一下 gettimeofday这个函数。C语言里面有函数声明和定义,我就是想看看gettimeofday的定义。
此帖出自ARM技术论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

9
 
是不是用arm-gcc编译过的那个,还是什么?不太明白
此帖出自ARM技术论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个函数是c的库函数。用加载.是这个意思吗?
此帖出自ARM技术论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
呵呵 现在差不多对了。这个函数接口都是一样的(声明是一样的),但是,具体实现不一样。如果你有整个项目的源代码的话,就可以看到这个函数的具体实现。也就知道你的后发先至是什么原因了。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
我改变了一下循环次数,发现:

100-1300之间出现0和10000交替,随着数值增大0减10000加。1400-2500是10000和20000交替出现,也是随着数值增加20000增加。2700开始出现30000,2800开始出现30000、20000、-970000交替。-970000很少。测到16000,发现一个规律:从0开始加到16000的过程中,从开始出现负值开始,负值和正值的绝对值之和1000000,不知是什么原因。


还有我这不是什么项目就是一个简单的小程序。所有源码都在上面。没有什么项目。



高手帮忙了!!!!!!
此帖出自ARM技术论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

13
 
我投降了。等我回去学学语言表达再来。
此帖出自ARM技术论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
我不懂你说的项目是什么东西。是生成的obj文件吗?那里面都是十六进制代码。怎么看?不知道说的是什么?
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
1.由于我看不到你的源代码,所以不知道你的gettimeofday函数是怎么实现的。我说的源代码,是你板子上的uclinux的源代码。我说的整个项目,就是你全部的uclinux代码。
2.之所以加起来是1000000,因为那是1秒。也就是说,你的系统时钟和板子上的时钟,会进行同步。同步的频率是1秒,精度也是1秒。同步的时候,出现了1秒的误差,就发生了负数情况。
3.
此帖出自ARM技术论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

16
 
void do_gettimeofday(struct timeval *tv)
{
        unsigned long flags;
        unsigned long usec, sec;

        read_lock_irqsave(&xtime_lock, flags);
        usec = gettimeoffset();
        {
                unsigned long lost = jiffies - wall_jiffies;

                if (lost)
                        usec += lost * USECS_PER_JIFFY;
        }
        sec = xtime.tv_sec;
        usec += xtime.tv_usec;
        read_unlock_irqrestore(&xtime_lock, flags);

        /* usec may have gone up a lot: be safe */
        while (usec >= 1000000) {
                usec -= 1000000;
                sec++;
        }

        tv->tv_sec = sec;
        tv->tv_usec = usec;
}
此帖出自ARM技术论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

17
 
从代码来看,出现负数不是同步问题,是因为超过了1秒,进位了。你在操作的时候,把秒算上,数据就对了。
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

18
 
但是以上代码不是
while (usec >= 1000000)
{
   usec -= 1000000;
   sec++;
}
只有大于1000000时才减吗?怎么可能出现负值。而且我把i设的不大是也偶尔会出现负值,还有怎么解释0的情况。一点时间都没用就算完了吗?
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 
真是不太懂说什么好了。
首先,你要明白,这个usec每次是到系统去取的。取usec的时机是随机的。假设,第一次取时间的时候,usec1==900000,第二次区时间的时候,usec2==1100000,此时要对usec2进行处理,结果usec2=1100000-1000000,也就是100000。此时,用你的函数,所花时间就是usec2-usec1==-800000。
时间为零的情况,是因为你系统的时钟分辨率太低。
这类问题,需要自己动脑筋想,才明白。如果你觉得动脑筋了还是不明白,建议你先补充点基础知识。
此帖出自ARM技术论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

20
 
那个负值的情况我现在明白了。为什么出现0能不能再解释一下。实在不好意思。麻烦了。麻烦了。谢谢了!!!!!!!!!
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表