不错的延时函数
一个很不错的延时处理函数,供大家参考 ID不会有危险吗? No.5 发表于 2019-11-17 11:34
ID不会有危险吗?
什么危险 定时器+状态机的延时函数
基本够用,顶楼主一下 853728579 发表于 2019-11-17 11:42
什么危险
楼上没别的意思,说的是标题尽量说的详细点 johnlj 发表于 2019-11-17 11:57
定时器+状态机的延时函数
基本够用,顶楼主一下
对的,一般的裸机开发,这两样就OK了,这个延时可以提供一些延时精度不高的,不想占用中断处理时间的 楼主就这么发一个RAR文件就可以了?不讲讲一下程序流程、动作时序、简要说明? 853728579 发表于 2019-11-17 12:05
对的,一般的裸机开发,这两样就OK了,这个延时可以提供一些延时精度不高的,不想占用中断处理时间的 ...
加油,继续分享好的代码{:victory:} Ilove51andAVR 发表于 2019-11-17 12:13
楼主就这么发一个RAR文件就可以了?不讲讲一下程序流程、动作时序、简要说明? ...
程序很简单,直接看代码更好些 看代码看不明白,晕!! 来个简单的文字说明吧 我基本不这么写,我都是这样写的
#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++;
}
看下借鉴一下 好资料!
下载保存以后用。 先收藏。慢慢看! youkebing 发表于 2019-11-17 20:53
我基本不这么写,我都是这样写的
不知道你这个代码怎么用的,能否给出一段测试代码。 本帖最后由 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();
}
} 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:28 编辑
853728579 发表于 2019-11-18 15:18
你的代码最好加入这个处理,不然不好处理边界问题,时不时会有那么一下延时不准,从思路上分析你这个程 ...
不需要增加这么多,都是unsigned int,自动回环的。
每个人都有自己习惯的写法,选择自己喜欢的就可以了!{:smile:} 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是一个很大的数那么直接就默认溢出了 导致时间不准 jaywen 发表于 2019-11-19 10:29
u32t timer_expired(u32t *timer, u32t dly) {
u32t d;
竟然怀疑,不妨把你的怀疑验证一下,是不是?{:smile:} youkebing 发表于 2019-11-19 10:45
竟然怀疑,不妨把你的怀疑验证一下,是不是?
这根本就不需要验证。。。。。 只是出现时间不准的概率并不高 你好好分析一下就知道了 我的简单分析: 时间累加溢出的时候 自动清零0上一次也就是清零前 计数值是一个很大的数本次的 接近0 两者相减 是个负数负数 赋值给无符号变量补码形式 结果很大 基本上可以确认 溢出导致时间不对分析不对请指出 应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减 jaywen 发表于 2019-11-19 11:16
这根本就不需要验证。。。。。 只是出现时间不准的概率并不高 你好好分析一下就知道了 我的简单分 ...
不用辩论了,就算我错了好了呗!{:smile:} jaywen 发表于 2019-11-19 11:16
这根本就不需要验证。。。。。 只是出现时间不准的概率并不高 你好好分析一下就知道了 我的简单分 ...
你分析的不对,都为uint32的话
0-0xffffffff=1
3-0xfffffffe=4
talk is cheap, show me your code canspider 发表于 2019-11-19 12:33
你分析的不对,都为uint32的话
0-0xffffffff=1
3-0xfffffffe=4
sorry 是我理解错了结果是 负数没错但是溢出了符号位被舍弃了变成了 正数 错怪 楼上。。。{:handshake:} youkebing 发表于 2019-11-19 12:28
不用辩论了,就算我错了好了呗!
别生气嘛!!sorry 是我理解错了结果是 负数没错但是溢出了符号位被舍弃了变成了 正数 错怪 了大哥。。。{:handshake:} 看过楼主的代码 看他代码里面有写到这个顾也以有这问题 仔细一看 不需要考虑的 这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 hy317 发表于 2019-11-19 11:27
应该不会不对的,比如uint8小减大应该是相当于小值自动加0x100再减
是的{:lol:} 853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...
看了你代码刚刚开始 也是决定有这个问题可是你仔细一看 没有这个问题的 853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...
看了你代码刚刚开始 也是决定有这个问题可是你仔细一看 没有这个问题的 853728579 发表于 2019-11-19 14:02
这个程序,已经是通过大量实验验证了,是需要加入边界检测,不然会导致有时延时不准 ...
typedef enum TIMER_ENUM
{
#undef DefineTimer
#define DefineTimer(ID) ID,
#include "timer_def.h"
TIMER_MAX
}Timer_e;
楼主这是什么写法?枚举里面有预处理语句和包含头文件函数?看不大懂。
延时函数,学习了
页:
[1]