搜索
bottom↓
回复: 32

不错的延时函数

[复制链接]

出0入0汤圆

发表于 2019-11-17 11:05:22 | 显示全部楼层 |阅读模式


一个很不错的延时处理函数,供大家参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-11-17 11:34:44 来自手机 | 显示全部楼层
ID不会有危险吗?

出0入0汤圆

 楼主| 发表于 2019-11-17 11:42:44 | 显示全部楼层
No.5 发表于 2019-11-17 11:34
ID不会有危险吗?

什么危险

出0入0汤圆

发表于 2019-11-17 11:57:06 | 显示全部楼层
定时器+状态机  的延时函数

基本够用,顶楼主一下

出0入0汤圆

发表于 2019-11-17 11:59:24 | 显示全部楼层

楼上没别的意思,说的是标题尽量说的详细点

出0入0汤圆

 楼主| 发表于 2019-11-17 12:05:16 | 显示全部楼层
johnlj 发表于 2019-11-17 11:57
定时器+状态机  的延时函数

基本够用,顶楼主一下

对的,一般的裸机开发,这两样就OK了,这个延时可以提供一些延时精度不高的,不想占用中断处理时间的

出0入0汤圆

发表于 2019-11-17 12:13:08 | 显示全部楼层
楼主就这么发一个RAR文件就可以了?不讲讲一下程序流程、动作时序、简要说明?

出0入0汤圆

发表于 2019-11-17 12:14:37 | 显示全部楼层
853728579 发表于 2019-11-17 12:05
对的,一般的裸机开发,这两样就OK了,这个延时可以提供一些延时精度不高的,不想占用中断处理时间的 ...

加油,继续分享好的代码

出0入0汤圆

 楼主| 发表于 2019-11-17 12:15:12 | 显示全部楼层
Ilove51andAVR 发表于 2019-11-17 12:13
楼主就这么发一个RAR文件就可以了?不讲讲一下程序流程、动作时序、简要说明? ...

程序很简单,直接看代码更好些

出0入0汤圆

发表于 2019-11-17 18:32:23 | 显示全部楼层
看代码看不明白,晕!!

出140入8汤圆

发表于 2019-11-17 19:31:38 | 显示全部楼层
来个简单的文字说明吧

出0入89汤圆

发表于 2019-11-17 20:53:49 | 显示全部楼层
我基本不这么写,我都是这样写的
  1. #include "config.h"

  2. static u32t _tick;
  3. void timer_start(u32t *timer) {
  4.   *timer = _tick;
  5. }
  6. void timer_set(u32t *timer, u32t dly) {
  7.   *timer = _tick - dly;
  8. }
  9. u32t timer_expired(u32t *timer, u32t dly) {
  10.   u32t d;

  11.   d = _tick - *timer;
  12.   return d > dly;
  13. }

  14. void SysTick_Handler(void) {
  15.   _tick++;
  16. }
复制代码

出675入8汤圆

发表于 2019-11-17 20:58:03 来自手机 | 显示全部楼层
看下借鉴一下

出0入0汤圆

发表于 2019-11-18 02:22:50 | 显示全部楼层
好资料!
下载保存以后用。

出0入0汤圆

发表于 2019-11-18 07:49:00 来自手机 | 显示全部楼层
先收藏。慢慢看!

出0入0汤圆

 楼主| 发表于 2019-11-18 09:11:18 | 显示全部楼层
youkebing 发表于 2019-11-17 20:53
我基本不这么写,我都是这样写的

不知道你这个代码怎么用的,能否给出一段测试代码。

出0入89汤圆

发表于 2019-11-18 09:18:25 | 显示全部楼层
本帖最后由 youkebing 于 2019-11-18 09:20 编辑
853728579 发表于 2019-11-18 09:11
不知道你这个代码怎么用的,能否给出一段测试代码。


随便写的测试程序,你看看
  1. static u32t _flag;
  2. static u32t _timer;
  3. void led_init(void) {
  4.   _flag = 0;
  5.   timer_start(&_timer);
  6. }
  7. void led_poll(void) {
  8.   if (timer_expired(&_timer, 1000)) {
  9.     timer_start(&_timer);
  10.     if (_flag == 0) {
  11.       _flag = 1;
  12.       led_open();
  13.     }
  14.     else {
  15.       _flag = 0;
  16.       led_close();
  17.     }
  18.   }
  19. }

  20. void main(void) {
  21.   led_init();
  22.   while (1) {
  23.     led_poll();
  24.   }
  25. }
复制代码

出0入0汤圆

 楼主| 发表于 2019-11-18 15:18:11 | 显示全部楼层
youkebing 发表于 2019-11-18 09:18
随便写的测试程序,你看看
  1. u32t timer_expired(u32t *timer, u32t dly) {
  2.   u32t d;

  3.   if (_tick < *timer)
  4.   {
  5.           d = (0xffffffffUL - *timer) + _tick;
  6.   }else{
  7.           d = _tick - *timer;
  8.   }
  9.   
  10.   return d > dly;
  11. }
复制代码


你的代码最好加入这个处理,不然不好处理边界问题,时不时会有那么一下延时不准,从思路上分析你这个程序和我那个是一样的,从参数管理方面,我那个比较更管理参数。

出0入89汤圆

发表于 2019-11-18 15:22:29 | 显示全部楼层
本帖最后由 youkebing 于 2019-11-18 15:28 编辑
853728579 发表于 2019-11-18 15:18
你的代码最好加入这个处理,不然不好处理边界问题,时不时会有那么一下延时不准,从思路上分析你这个程 ...


不需要增加这么多,都是unsigned int,自动回环的。
每个人都有自己习惯的写法,选择自己喜欢的就可以了!

出0入10汤圆

发表于 2019-11-19 10:29:27 | 显示全部楼层
youkebing 发表于 2019-11-18 15:22
不需要增加这么多,都是unsigned int,自动回环的。
每个人都有自己习惯的写法,选择自己喜欢的就可以了 ...

u32t timer_expired(u32t *timer, u32t dly) {
  u32t d;

  d = _tick - *timer;
  return d > dly;
}

这段代码不严谨吧。。。参考LZ说的   回环是没错   当tick  小于 timer时(溢出的边缘情况) 那么d是一个很大的数  那么直接就默认溢出了 导致时间不准

出0入89汤圆

发表于 2019-11-19 10:45:10 | 显示全部楼层
jaywen 发表于 2019-11-19 10:29
u32t timer_expired(u32t *timer, u32t dly) {
  u32t d;

竟然怀疑,不妨把你的怀疑验证一下,是不是?

出0入10汤圆

发表于 2019-11-19 11:16:02 | 显示全部楼层
youkebing 发表于 2019-11-19 10:45
竟然怀疑,不妨把你的怀疑验证一下,是不是?

这根本就不需要验证。。。。。 只是出现时间不准的概率并不高     你好好分析一下就知道了   我的简单分析: 时间累加溢出的时候 自动清零0  上一次也就是清零前 计数值是一个很大的数  本次的 接近0   两者相减 是个负数  负数 赋值给无符号变量  补码形式 结果很大 基本上可以确认 溢出  导致时间不对  分析不对请指出

出0入0汤圆

发表于 2019-11-19 11:27:38 | 显示全部楼层
应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减

出0入89汤圆

发表于 2019-11-19 12:28:17 | 显示全部楼层
jaywen 发表于 2019-11-19 11:16
这根本就不需要验证。。。。。 只是出现时间不准的概率并不高     你好好分析一下就知道了   我的简单分 ...

不用辩论了,就算我错了好了呗!

出0入8汤圆

发表于 2019-11-19 12:33:47 来自手机 | 显示全部楼层
jaywen 发表于 2019-11-19 11:16
这根本就不需要验证。。。。。 只是出现时间不准的概率并不高     你好好分析一下就知道了   我的简单分 ...


你分析的不对,都为uint32的话
0-0xffffffff=1
3-0xfffffffe=4

talk is cheap, show me your code

出0入10汤圆

发表于 2019-11-19 14:00:21 | 显示全部楼层
canspider 发表于 2019-11-19 12:33
你分析的不对,都为uint32的话
0-0xffffffff=1
3-0xfffffffe=4

sorry   是我理解错了  结果是 负数没错  但是溢出了  符号位被舍弃了  变成了 正数   错怪 楼上。。。

出0入10汤圆

发表于 2019-11-19 14:02:48 | 显示全部楼层
youkebing 发表于 2019-11-19 12:28
不用辩论了,就算我错了好了呗!

别生气嘛!!sorry   是我理解错了  结果是 负数没错  但是溢出了  符号位被舍弃了  变成了 正数   错怪 了大哥。。。   看过楼主的代码   看他代码里面有写到这个  顾也以有这问题   仔细一看   不需要考虑的   

出0入0汤圆

 楼主| 发表于 2019-11-19 14:02:51 | 显示全部楼层
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准

出0入10汤圆

发表于 2019-11-19 14:03:40 | 显示全部楼层
hy317 发表于 2019-11-19 11:27
应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减

是的

出0入10汤圆

发表于 2019-11-19 14:08:39 | 显示全部楼层
853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...

看了你代码  刚刚开始 也是决定有这个问题  可是你仔细一看    没有这个问题的   

出0入10汤圆

发表于 2019-11-19 14:09:13 | 显示全部楼层
853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...

看了你代码  刚刚开始 也是决定有这个问题  可是你仔细一看    没有这个问题的   

出0入0汤圆

发表于 2019-11-21 22:30:32 | 显示全部楼层
853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...


typedef enum TIMER_ENUM
{
        #undef DefineTimer
        #define DefineTimer(ID) ID,
        #include "timer_def.h"
        TIMER_MAX
}Timer_e;
楼主这是什么写法?枚举里面有预处理语句和包含头文件函数?看不大懂。

出0入0汤圆

发表于 2019-11-21 23:26:54 | 显示全部楼层
延时函数,学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 20:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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