查看: 5098|回复: 18

[其他] 求教在C程序中精确延时

[复制链接]

该用户从未签到

15

主题

49

帖子

0

新手上路

Rank: 1

积分
77
最后登录
1970-1-1
发表于 2013-10-17 16:36:37 | 显示全部楼层 |阅读模式
请问各位大侠,我在codewarrior中用C变成,怎样加入精确延时呢?
我知道答案 目前已有17人回答
回复

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
发表于 2013-10-18 14:28:30 | 显示全部楼层

RE:求教在C程序中精确延时

能说明一下硬件平台和有无操作系统等软件配置么?
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2013-10-18 16:56:54 | 显示全部楼层

回复:求教在C程序中精确延时

不知道你用的是什么型号的芯片,你可以用定时器产生准确延时!
回复 支持 反对

使用道具 举报

该用户从未签到

15

主题

49

帖子

0

新手上路

Rank: 1

积分
77
最后登录
1970-1-1
 楼主| 发表于 2013-10-18 21:57:55 | 显示全部楼层

回复:求教在C程序中精确延时

回复第 2 楼 于2013-10-18 14:28:30发表:
能说明一下硬件平台和有无操作系统等软件配置么? 

您好,用的是MCF52259的芯片,16MHZ无源晶振+PLL倍频,CODE warrior 7.2 无操作系统,。汇编里面的每条语句都有固定的时钟周期,所以让CPU做空等待的时间可以准确计算,但是在C里面就没法这样计算了。我就想请教一下,在C里面有没有类似汇编中做延时的方法。
回复 支持 反对

使用道具 举报

该用户从未签到

15

主题

49

帖子

0

新手上路

Rank: 1

积分
77
最后登录
1970-1-1
 楼主| 发表于 2013-10-18 21:59:21 | 显示全部楼层

回复:求教在C程序中精确延时

回复第 3 楼 于2013-10-18 16:56:54发表:
不知道你用的是什么型号的芯片,你可以用定时器产生准确延时! 

您好,我用的是MCF52259,定时器当然能做到准确定时,但是需要CPU空等待。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-10-21 09:29:03 | 显示全部楼层

    RE:求教在C程序中精确延时

    用for循环?应该是你的上限+4就是实际的运行的机器周期总数。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    351

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    1970-1-1
    发表于 2013-10-21 17:08:07 | 显示全部楼层

    回复:求教在C程序中精确延时

    你的要求好特别,要用C、不要定时器、又要精确延时。
    那我觉得你只能根据C代码中循环等待函数的反汇编指令条数去推算了。
    毕竟还是汇编的有对应指令周期可循
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    29

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    217
    最后登录
    1970-1-1
    发表于 2013-10-21 19:24:56 | 显示全部楼层

    RE:求教在C程序中精确延时

    没用过ColdFire的处理器,不过应该可以类推的。看你需要多大的延时以及延时精度了。
    1. 纳秒的延时C可能不能完成,即使可以,也得需要将for循环生成的obj文件反汇编,再根据汇编程序对C的循环次数做相应的修改;
    2. 对于微秒的延时,如果最后倍频后CPU core的时钟可以达到几百兆,你可以尝试一下这样做看行不行
    void us_delay(unsigned int delay)
    {
    TB_VAL tb_old;   /* old time base value */
    TB_VAL tb_new;   /* new time base value */
    TB_VAL delta;    /* delta for entire delay period */
    tb_old = TIME_BASE_GET;
    /*
    * Calculate number of ticks for desired elapsed time.
    */
    delta = (TB_VAL)delay * TIME_BASE_FREQ / 1000000;
    do {
    tb_new = TIME_BASE_GET;;
    } while ((tb_new - tb_old) < delta);
    return;
    }
    不知道ColdFire有没有时基的专用寄存器,若没有用一个timer做时基就成。其中TIME_BASE_GET是需要根据CPU去实现的,就是获取timer的当前值;TIME_BASE_FREQ就是timer的计数频率。如果时基是32位的,TB_VAL就是unsigned int,如果是64位的,就是unsigned long long,当然还需要分高低位读。
    3. 对于毫秒级的延时直接调us_delay(1000)就行。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15

    主题

    49

    帖子

    0

    新手上路

    Rank: 1

    积分
    77
    最后登录
    1970-1-1
     楼主| 发表于 2013-10-28 13:28:26 | 显示全部楼层

    回复:求教在C程序中精确延时

    回复第 7 楼 于2013-10-21 17:08:07发表:
    你的要求好特别,要用C、不要定时器、又要精确延时。
    那我觉得你只能根据C代码中循环等待函数的反汇编指令条数去推算了。
    毕竟还是汇编的有对应指令周期可循
     

    好的谢谢!
    另外我还有一个问题请教。
    我的MCF52259,外部中断(下降沿触发,最高优先级)总是被spurious中断抢占。找了好长时间,还是找不到问题在哪。
     
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15

    主题

    49

    帖子

    0

    新手上路

    Rank: 1

    积分
    77
    最后登录
    1970-1-1
     楼主| 发表于 2013-10-28 13:30:35 | 显示全部楼层

    回复:求教在C程序中精确延时

    回复第 8 楼 于2013-10-21 19:24:56发表:
    没用过ColdFire的处理器,不过应该可以类推的。看你需要多大的延时以及延时精度了。
    1. 纳秒的延时C可能不能完成,即使可以,也得需要将for循环生成的obj文件反汇编,再根据汇编程序对C的循环次数做相应的修改;
    2. 对于微秒的延时,如果最后倍频后CPU core的时钟可以达到几百兆,你可以尝试一下这样做看行不行
    void us_delay(unsigned int delay)
    {
    TB_VAL tb_old; /* old time base value */
    TB_VAL tb_new; /* new time base value */
    TB_VAL delta; /* delta for entire delay period */
    tb_old = TIME_BASE_GET;
    /*
    * Calculate number of ticks for desired elapsed time.
    */
    delta = (TB_VAL)delay * TIME_BASE_FREQ / 1000000;
    do {
    tb_new = TIME_BASE_GET;;
    } while ((tb_new - tb_old) < delta);
    return;
    }
    不知道ColdFire有没有时基的专用寄存器,若没有用一个timer做时基就成。其中TIME_BASE_GET是需要根据CPU去实现的,就是获取timer的当前值;TIME_BASE_FREQ就是timer的计数频率。如果时基是32位的,TB_VAL就是unsigned int,如果是64位的,就是unsigned long long,当然还需要分高低位读。
    3. 对于毫秒级的延时直接调us_delay(1000)就行。
     

    好的谢谢!delay(1000)这个函数,我试过了。
    另外我还有一个问题请教。
    我的MCF52259,外部中断(下降沿触发,最高优先级)总是被spurious中断抢占。找了好长时间,还是找不到问题在哪。不知道您之前有没有遇到过这种问题
     
     
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 05:59 , Processed in 0.198358 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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