OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5215|回复: 20

什么实现动态定时器

[复制链接]

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
发表于 2017-8-21 11:39:29 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Eternal单人行 于 2017-9-4 09:59 编辑

怎么实现动态定时器,申请,关闭,中断服务函数也是动态的

最佳答案

查看完整内容[请看2#楼]

当然能够了.不然还在这参和, #include "soft_timer.h" __TIMER SoftTimer[TIMER_COUNT]; ui check_timer_idle(void) { ui i; for(i=0;i
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 11:39:30 | 显示全部楼层
本帖最后由 操作系统 于 2017-8-21 15:30 编辑
Eternal单人行 发表于 2017-8-21 14:34
这是一种方法,但能做到动态申请定时器吗?每一次中断结束后,关闭该定时器

当然能够了.不然还在这参和,
#include "soft_timer.h"


__TIMER SoftTimer[TIMER_COUNT];


ui check_timer_idle(void)
{
ui i;
for(i=0;i<TIMER_COUNT;i++)
{
  if(SoftTimer.time == 0 && SoftTimer.task == 0) break;
}
return i;
}

void stop_timer(TASK_P task_timer)
{
ui i;
for(i=0;i<TIMER_COUNT;i++)
{

  if(SoftTimer.task == task_timer)
          {
                  SoftTimer.time = 0;
                SoftTimer.task = 0;
          }
}

}


void StopAllTimer(void)
{
ui i;
for(i=0;i<TIMER_COUNT;i++)
{
  SoftTimer.time = 0;
  SoftTimer.task = 0;
}

}

void start_timer(ui time,TASK_P task_timer)
{
ui n;
stop_timer(task_timer);
n = check_timer_idle();

if(n<TIMER_COUNT)
{
   SoftTimer[n].time = time;
   SoftTimer[n].task = (TASK_P)task_timer;

}


}


void process_soft_timer(void)
{
ui i;
        for(i=0;i< TIMER_COUNT;i++)
                {
                        if( SoftTimer.time )
                                {
                                  SoftTimer.time --;
                                        if(SoftTimer.time==0 )
                                                {
                                                        if( SoftTimer.task != 0)
                                                                {
                                                                SoftTimer.task();
                                                               
                                                                }
                                                       
                                                }
                                }
                }
}


回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 12:27:51 | 显示全部楼层
本帖最后由 操作系统 于 2017-8-21 13:44 编辑

个人理解,应该是软定时器吧.这个实现.相当容易,只是定时精度变低了.只能精确到毫秒.
如果楼主指的是硬件定时器..并且是动态的.其实就是加壳技术.类似钩子函数.
也可以实现.单片机貌似没有必要这样子来操作.效率不高.
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 13:11:07 | 显示全部楼层
操作系统 发表于 2017-8-21 12:27
个人理解,应该是软定时器吧.这个发实现.相当容易,只是定时精度变低了.只能精确到毫秒.
如果楼主指的是硬件 ...

软定时,毫秒够了
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 13:48:23 | 显示全部楼层

1.先初始化 系统TICK定时器为一毫秒一次.(现成的,大部分的程序都是这样子)
2.中断服务函数里面,搞一全局标志位,标志=1;
3.大循环中,查询上面的标志位,如果标志==1,调用一个函数.函数里面清标志.
4.这个函数就是一毫秒事件函数.软定时器就在这里实现.可以实现N多个.
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 14:34:14 | 显示全部楼层
操作系统 发表于 2017-8-21 13:48
1.先初始化 系统TICK定时器为一毫秒一次.(现成的,大部分的程序都是这样子)
2.中断服务函数里面,搞一全局 ...

这是一种方法,但能做到动态申请定时器吗?每一次中断结束后,关闭该定时器
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2017-8-21 14:38:11 | 显示全部楼层
软定时
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 14:39:16 | 显示全部楼层
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2017-8-21 14:42:44 | 显示全部楼层

以一个TIM的定时周期做为基数,TIM更新一次时间递进一次,依次类推,根据次数乘以周期得出定时的时间,实现动态定时
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 14:49:51 | 显示全部楼层
1375917982gxut 发表于 2017-8-21 14:42
以一个TIM的定时周期做为基数,TIM更新一次时间递进一次,依次类推,根据次数乘以周期得出定时的时间,实 ...

能详细点吗?小白刚接触定时器,不是很理解
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 14:54:54 | 显示全部楼层
1375917982gxut 发表于 2017-8-21 14:42
以一个TIM的定时周期做为基数,TIM更新一次时间递进一次,依次类推,根据次数乘以周期得出定时的时间,实 ...

如果是全局变量累加器那个知道,但我想能不能像动态申请内存的那种,进行申请然后,在调用中断服务函数,最后再释放
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 15:34:04 | 显示全部楼层
操作系统 发表于 2017-8-21 15:25
当然能够了.不然还在这参和,
#include "soft_timer.h"

谢谢,我试试
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 15:39:37 | 显示全部楼层
操作系统 发表于 2017-8-21 11:39
当然能够了.不然还在这参和,
#include "soft_timer.h"

soft_timer.h这个头文件是自己写的,还是哪个库里的
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 16:11:23 | 显示全部楼层
Eternal单人行 发表于 2017-8-21 15:39
soft_timer.h这个头文件是自己写的,还是哪个库里的
#ifndef __typeh
#define __typeh
typedef   void (* TASK_P)(void);

typedef unsigned int ui;
typedef unsigned char uc;
typedef unsigned short us;

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;


#endif
#ifndef __SOFT_TIMER_H__
#define __SOFT_TIMER_H__
#include "type.h"



#define TIMER_COUNT 8

typedef struct
{
ui time;
TASK_P task;
}__TIMER;

ui check_timer_idle(void);
void start_timer(ui time,TASK_P task_timer);
void process_soft_timer(void);
void stop_timer(TASK_P task_timer);

void StopAllTimer(void);


#endif
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 16:13:37 | 显示全部楼层
        while (1)
        {
       
           if( soft_timer_pend )
            {
                                soft_timer_pend = 0;
                               
                                process_soft_timer();
                      }
}
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 16:31:45 | 显示全部楼层
操作系统 发表于 2017-8-21 16:11
#ifndef __typeh
#define __typeh
typedef   void (* TASK_P)(void);

time指向定时器的序号吗?task是指针函数指向中断服务函数,但time不是很理解
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 16:43:02 | 显示全部楼层
定时器序号是自动分配的.不用管理.这么简单的代码.静心下来一定可以看得明明白白的.
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 16:46:22 | 显示全部楼层
Eternal单人行 发表于 2017-8-21 16:31
time指向定时器的序号吗?task是指针函数指向中断服务函数,但time不是很理解

start_timer(ui time,.....),,time 是 时间,不是序号.是多久后执行后面的程序.想要重复多次执行..自己想一想..就不啰嗦了.
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 16:47:15 | 显示全部楼层
操作系统 发表于 2017-8-21 16:43
定时器序号是自动分配的.不用管理.这么简单的代码.静心下来一定可以看得明明白白的.

那结构体中的time代表的是什么?while(1){……}那个是等待计时器的函数,这样写好像没有调用STM32本身的定时器啊
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-21 16:48:23 | 显示全部楼层
Eternal单人行 发表于 2017-8-21 16:47
那结构体中的time代表的是什么?while(1){……}那个是等待计时器的函数,这样写好像没有调用STM32本身 ...

while(1){..},就是大循环中的查询代码呀.soft_timer_pend   就是那个 全局标呀
回复

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
 楼主| 发表于 2017-8-21 16:55:22 | 显示全部楼层
操作系统 发表于 2017-8-21 16:48
while(1){..},就是大循环中的查询代码呀.soft_timer_pend   就是那个 全局标呀

哦哦,谢谢大神的指教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 12:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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