853728579 发表于 2019-11-17 11:05:22

不错的延时函数



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

No.5 发表于 2019-11-17 11:34:44

ID不会有危险吗?

853728579 发表于 2019-11-17 11:42:44

No.5 发表于 2019-11-17 11:34
ID不会有危险吗?

什么危险

johnlj 发表于 2019-11-17 11:57:06

定时器+状态机的延时函数

基本够用,顶楼主一下

johnlj 发表于 2019-11-17 11:59:24

853728579 发表于 2019-11-17 11:42
什么危险

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

853728579 发表于 2019-11-17 12:05:16

johnlj 发表于 2019-11-17 11:57
定时器+状态机的延时函数

基本够用,顶楼主一下

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

Ilove51andAVR 发表于 2019-11-17 12:13:08

楼主就这么发一个RAR文件就可以了?不讲讲一下程序流程、动作时序、简要说明?

johnlj 发表于 2019-11-17 12:14:37

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

加油,继续分享好的代码{:victory:}

853728579 发表于 2019-11-17 12:15:12

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

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

maxking 发表于 2019-11-17 18:32:23

看代码看不明白,晕!!

leiyitan 发表于 2019-11-17 19:31:38

来个简单的文字说明吧

youkebing 发表于 2019-11-17 20:53:49

我基本不这么写,我都是这样写的
#include "config.h"

static u32t _tick;
void timer_start(u32t *timer) {
*timer = _tick;
}
void timer_set(u32t *timer, u32t dly) {
*timer = _tick - dly;
}
u32t timer_expired(u32t *timer, u32t dly) {
u32t d;

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

void SysTick_Handler(void) {
_tick++;
}

xml2028 发表于 2019-11-17 20:58:03

看下借鉴一下

lxa0 发表于 2019-11-18 02:22:50

好资料!
下载保存以后用。

wjwjwjwj98 发表于 2019-11-18 07:49:00

先收藏。慢慢看!

853728579 发表于 2019-11-18 09:11:18

youkebing 发表于 2019-11-17 20:53
我基本不这么写,我都是这样写的

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

youkebing 发表于 2019-11-18 09:18:25

本帖最后由 youkebing 于 2019-11-18 09:20 编辑

853728579 发表于 2019-11-18 09:11
不知道你这个代码怎么用的,能否给出一段测试代码。

随便写的测试程序,你看看
static u32t _flag;
static u32t _timer;
void led_init(void) {
_flag = 0;
timer_start(&_timer);
}
void led_poll(void) {
if (timer_expired(&_timer, 1000)) {
    timer_start(&_timer);
    if (_flag == 0) {
      _flag = 1;
      led_open();
    }
    else {
      _flag = 0;
      led_close();
    }
}
}

void main(void) {
led_init();
while (1) {
    led_poll();
}
}

853728579 发表于 2019-11-18 15:18:11

youkebing 发表于 2019-11-18 09:18
随便写的测试程序,你看看

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

if (_tick < *timer)
{
        d = (0xffffffffUL - *timer) + _tick;
}else{
        d = _tick - *timer;
}

return d > dly;
}

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

youkebing 发表于 2019-11-18 15:22:29

本帖最后由 youkebing 于 2019-11-18 15:28 编辑

853728579 发表于 2019-11-18 15:18
你的代码最好加入这个处理,不然不好处理边界问题,时不时会有那么一下延时不准,从思路上分析你这个程 ...

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

jaywen 发表于 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是一个很大的数那么直接就默认溢出了 导致时间不准

youkebing 发表于 2019-11-19 10:45:10

jaywen 发表于 2019-11-19 10:29
u32t timer_expired(u32t *timer, u32t dly) {
u32t d;



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

jaywen 发表于 2019-11-19 11:16:02

youkebing 发表于 2019-11-19 10:45
竟然怀疑,不妨把你的怀疑验证一下,是不是?

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

hy317 发表于 2019-11-19 11:27:38

应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减

youkebing 发表于 2019-11-19 12:28:17

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

不用辩论了,就算我错了好了呗!{:smile:}

canspider 发表于 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

jaywen 发表于 2019-11-19 14:00:21

canspider 发表于 2019-11-19 12:33
你分析的不对,都为uint32的话
0-0xffffffff=1
3-0xfffffffe=4


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

jaywen 发表于 2019-11-19 14:02:48

youkebing 发表于 2019-11-19 12:28
不用辩论了,就算我错了好了呗!

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

853728579 发表于 2019-11-19 14:02:51

这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准

jaywen 发表于 2019-11-19 14:03:40

hy317 发表于 2019-11-19 11:27
应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减

是的{:lol:}

jaywen 发表于 2019-11-19 14:08:39

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

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

jaywen 发表于 2019-11-19 14:09:13

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

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

csq463276932 发表于 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;
楼主这是什么写法?枚举里面有预处理语句和包含头文件函数?看不大懂。

bad_fpga 发表于 2019-11-21 23:26:54

延时函数,学习了
页: [1]
查看完整版本: 不错的延时函数