查看: 3267|回复: 3

浅谈软件延时

[复制链接]
  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 14:38:11 | 显示全部楼层 |阅读模式
    分享到:

    很多的单片机的真高手和假高手 都不喜欢用  软件延时 !

    我不是高手,所以我还用!!!

    我只用过keil编译器 !


    KEIL 编译器的优化级别 对我写得下面这些函数是有影响的..

    Keil V8.02 中第0-3级   是一个档

               4-5级是  一个档

          6-9级是一个档

    ===========================

    例如下的这些例子在 0-3的级别下还是很精确的


    注意:INT8U  你用 unsigned char 替代就可以用了


    /*------------------------
        软件延时(单位:秒)   KEIL 优化级别为0-3时
    -------------------------*/
    /*------------------------
        最长延时时间255秒 晶振12Mhz

            若count=0,实际延时0.000014秒
            若count=1,实际延时1.000024秒
            若count=2,实际延时2.000034秒
            若count=3,实际延时3.000044秒
            若count=n,实际延时n + 0.000014 + (0.00001 * n)秒
    //---------------------------------------------
    void Delay_Sec(INT8U count)
    {
        long int i;
        INT8U j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 16666; i++) {
                ;
            }
        }
    }



    /*------------------------
        软件延时(单位:秒)  KEIL 优化级别为0-3时
    -------------------------*/
    /*------------------------
        最长延时时间255秒 晶振11.0592Mhz

            若count=0,实际延时0.00001519秒
            若count=1,实际延时1.00006945秒
            若count=2,实际延时2.00012369秒
            若count=3,实际延时3.00017795秒

            若count=n,实际延时n + 0.00001519 + (0.0000542 * n)秒
    //------------------------
    void Delay_Sec(INT8U count)
    {
        long int i;
        INT8U j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 15360; i++) {
                ;
            }
        }
    }
    -------------------------*/


    /*------------------------
        软件延时(单位:秒)   KEIL 优化级别为0-3时

    -------------------------*/
    /*------------------------
        最长延时时间255秒 晶振22.1184Mhz

            若count=0,实际延时0.00000760秒
            若count=1,实际延时1.00041667秒
            若count=2,实际延时2.00082574秒
            若count=3,实际延时3.00123481秒

            若count=n,实际延时n + 0.00000760 + (0.00040907 * n)秒
    //---------------------------------
    void Delay_Sec(INT8U count)
    {
        INT16U i;
        INT8U  j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 47275; i++) {
                ;
            }
        }
    }
    -------------------------*/

    ==========================================================

    ========================

    ==========================

    /*------------------------
        软件延时(单位:毫秒)  KEIL  v8.02  优化级别 0-3好用
    -------------------------*/
    /*------------------------
        最长延时时间255毫秒 晶振22.1184Mhz

            若count=0,实际延时0.00760毫秒
            若count=1,实际延时1.00966毫秒
            若count=2,实际延时2.01172毫秒
            若count=3,实际延时3.01378毫秒

            若count=n,实际延时n + 0.00760 + (0.00206 * n)毫秒
    //---------------------------------
    void Delay_Ms(INT8U count)
    {
        INT8U i;
        INT8U j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 229; i++) {
                ;
            }
        }
    }


    /*------------------------
        软件延时(单位:毫秒)  keil V8.02 优化级别 0-3好用
    -------------------------*/
    /*------------------------
        最长延时时间255毫秒 晶振11.0592Mhz

            若count=0,实际延时0.01519毫秒
            若count=1,实际延时1.02105毫秒
            若count=2,实际延时2.02691毫秒
            若count=3,实际延时3.03277毫秒

            若count=n,实际延时n + 0.01519 + (0.00586 * n)毫秒
    //---------------------------------
    void Delay_Ms(INT8U count)
    {
        INT8U i;
        INT8U j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 114; i++) {
                ;
            }
        }
    }
    -------------------------*/


    /*------------------------
        最长延时时间255毫秒     晶振12Mhz  (优化级别 0-3好用)

        软件延时(单位:毫秒)    (若count=0,实际延时0.014毫秒
           若count=1,实际延时1.021毫秒
           若count=2,实际延时2.028毫秒
           若count=3,实际延时3.035毫秒
           若count=4,实际延时4.042毫秒
           若count=5,实际延时5.049毫秒)
                 若count=n,实际延时n + 0.014 + (0.007 * n)毫秒
    //---------------------------------
    void Delay_Ms(INT8U count)
    {
        INT8U i;
        INT8U j;
        for (j = 0; j < count; j++) {
            for (i = 0; i < 124; i++) {
                ;
            }
        }
    }
    -------------------------*/

    以上 这些函数 如果你将keil 优化级别设置为  4 或者是5 也是 可以用的  ,不过  就不是很精确了 !!

    就是说我那些 计算 延时的公式 就不是非常非常准确了,不过也可以凑合着用  !! 就是那些 若 Count  =    ,,, 实际延时 是  ...........的 那些公式。


    如果优化级别是6-9那么这些公式就非常不准确了!!!至于为什么不准确,你看看优化级别的说明就清楚了!!

    =========================

    再次强调  这些公式都是我自己推推导出来的 所以很有可能存在问题  
    这些公式的推导 (在优化级别0-3时 ) 考虑的是 count =0 到 255的这256种情况下的准确性 。而不仅仅是其中的一种情况。


    ======================================================

    那么在所有的优化级别下的通用的 延时函数应该怎么写呢?

    应该是用那个 _nop_(); 吧  这样编译器就不会优化掉这些_nop_();了。调用那个叫 strings。h ,差不多是这个名字。这个你肯定比我清楚 !

    评分

    参与人数 1与非币 +5 收起 理由
    loveeeboard + 5 三周年铜板双倍!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 14:39:20 | 显示全部楼层
    在这里发技术类贴    好像没什么人看哈    但还是发了    充实下STM32的论坛
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-11-17 13:26
  • 签到天数: 410 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-6 15:50:06 | 显示全部楼层
    软件延时和时钟有关的,楼主要小心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-10 16:05:14 | 显示全部楼层
    感谢分享。。。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 11:55 , Processed in 0.150018 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.