方法:

采用了一个定时器链表,按照定时时间从早到大进行排序,可加速处理的速度
并且加入了一个哨兵节点,定时时间设置为0xffffffff,来简化节点插入的操作

Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__#include "fifo.h"//设定最多有500个定时器
#define MAX_TIMER 500
//已配置状态
#define TIMER_FLAGS_ALLOC   1
//定时器运行状态
#define TIMER_FLAGS_USING   2
//该定时器没有分配 使用
#define TIMER_FLAGS_NOT_USE 0struct TIMER
{struct TIMER *pNext;unsigned int u32TimeOut;unsigned int u32Flag;//记录当前的定时器是否被使用过struct FIFO *pFifo;//缓冲区队列int nData;
};struct TIMER_CONTRAL
{unsigned int u32Count;//当前总共计数的秒数unsigned int u32Next;//下一个需要比较的定时器的时间struct TIMER *pTimerHead;//定时器 链表的 头结点struct TIMER TimerArr[MAX_TIMER];
};//获得一个定时器
struct TIMER *GetTimer(void);//释放一个定时器
void TimerFree(struct TIMER *pTimer);//初始化定时器
void TimerInit(struct TIMER *pTimer, struct FIFO *pFifo,  int nData);//设置定时器
void SetTimer(struct TIMER *pTimer, unsigned int u32TimeOut);#endif

初始化定时器

//初始化定时器 每10ms 发生一次中断
void InitPit(void)
{int i;struct TIMER *pShaoBIng;//感觉没有必要添加哨兵节点//使用计数器0 先写入低字节在写入高字节 方式2循环计数 采用二进制io_out8(PIT_CTRL, 0x34);//00 11 010 0io_out8(PIT_COUNT0, 0x9c);io_out8(PIT_COUNT0, 0x2e);TimerCtl.u32Count = 0;//将所有的定时器都设置为 未使用for(i = 0; i < MAX_TIMER; i++){TimerCtl.TimerArr[i].u32Flag = TIMER_FLAGS_NOT_USE;}//获得一个SB定时器 并将其放在定时器链表的最后pShaoBIng = GetTimer();pShaoBIng->u32TimeOut = 0xffffffff;pShaoBIng->u32Flag = TIMER_FLAGS_USING;pShaoBIng->pNext = 0;//没有正在运行的定时器 所以就设置为SB的定时时间TimerCtl.u32Next = 0xffffffff;//设定定时器链表的头结点 为SB节点TimerCtl.pTimerHead = pShaoBIng;return;
}

定时器的中断处理

每次将TCL 的计数值+1 , 如何没有大于头结点设置的那个定时值,那么直接返回,到了后,查找定时值最小的那个,设置为头结点

void IntHandler20(int *pEsp)//定时器中断IRQ0
{struct TIMER *pTimerTemp;io_out8(PIC0_OCW2, 0x60);//每次中断+1 来计数TimerCtl.u32Count++;//下一个需要比较的时间 未到 那么什么也不做if(TimerCtl.u32Next > TimerCtl.u32Count){return;}//把定时器链表的 头结点 赋值给 TemppTimerTemp = TimerCtl.pTimerHead;//Temp 在循环结束时候 是第一个未超时的那个 或者都超时了 while(1){//一直运行到 不超时那个TIMER 为止 因为pTimer数组是经过排序的if(pTimerTemp->u32TimeOut > TimerCtl.u32Count){break;}//处理超时的定时器pTimerTemp->u32Flag = TIMER_FLAGS_ALLOC;FifoSaveData(pTimerTemp->pFifo, pTimerTemp->nData);pTimerTemp = pTimerTemp->pNext;}//改变头结点TimerCtl.pTimerHead = pTimerTemp;TimerCtl.u32Next = TimerCtl.pTimerHead->u32TimeOut;return;
}

Day13_定时器中断处理相关推荐

  1. stm8s103k3 周期 捕获_STM8S003K3如何用定时器中断处理捕获脉冲?

    如果用STM8S的一个IO口检测一个脉冲电平,用在电话机上面,比方说是GPIO3用来检测脉冲电平变化后,MCU将接通电话的GPIO1置高,接通电话.当挂断电话后,GPIO3脉冲再次变化,GPIO1置低 ...

  2. STM32在定时器中控制步进电机

    2019独角兽企业重金招聘Python工程师标准>>> 写WEB程序的时候,发现如果加上步进电机控制的话,就会出现问题.原因是如果把电机控制放在uip循环中处理的话,因为控制电机涉及 ...

  3. STM32系统滴答定时器(systick)应用

    一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...

  4. ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

    参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...

  5. STM32那点事(6)_定时器(上)

    STM32定时器是CPU中的基本功能模块之一,最基本的功能是提供定时,STM32定时器共用16个定时器,主要分为两个基本定时器,10个通用定时器,2个高级定时器,以及两个看门狗定时器.看门狗定时器后面 ...

  6. stm32关定时器_STM32F103ZET6的基本定时器

    1.定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8.STM32的定时器分为基本定时器.通用定时器和高等定时器. TIM6.TIM7是基本定时器.基本定时器是只能向 ...

  7. 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...

  8. 关于软件定时器的一些讨论

    1.简介 这里先介绍下软件定时器和硬件定时器的区别 硬件定时器: CPU内部自带的定时器模块,通过初始化.配置可以实现定时,定时时间到以后就会执行相应的定时器中断处理函数.硬件定时器一般都带有其它功能 ...

  9. 单片机定时器实现的数字时钟

    利用51单片机的定时器,设计一个数字时钟,具有时间.年月日和星期显示功能,并且可以通过按键设置调整年时间年月日和星期的功能. 1.系统功能模块图 系统主要有LED灯显示模块.电源模块.单片机最小系统. ...

  10. jiffies与HZ、定时器、原子操作

    jiffies与HZ.定时器.原子操作 前言 一.Jiffies与HZ 1.jiffies: 2.HZ: 3.时间与jiffies转换 4.jiffies的回绕 二.计时.延迟与睡眠 1.计时 2.延 ...

最新文章

  1. 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
  2. 客户主数据冻结与删除标记位汇总
  3. php ajax 重复提交,ThinkPHP防止重复提交表单的方法实例分析
  4. C语言printf控制光标位置和清空屏幕
  5. window.createPopup()用法以及短消息提示框代码
  6. java开发_eclipse导出为war文件,热部署到tomcat运行总结[转]
  7. C语言中用二进制输出一个数字
  8. 苹果电脑mac计算机图标怎么删除吗,苹果电脑桌面的图标怎么删除不了怎么办
  9. frft雷达信号处理 论文
  10. Excel 2010 VBA 入门 126 批量设置控件属性
  11. PLC与Unity通讯☀️ 一、目标及术语解释
  12. shen_tian_hao的C++快快编程AC代码库(每周更新)
  13. LoadRunner使用教程
  14. 历届试题 九宫重排 广度优先搜索+康拓排序
  15. 三菱plc pwm指令_三菱PLC高速指令汇总,使用方法讲解!
  16. 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机
  17. 华为mate30 完全卸载google套件
  18. 奇迹服务器端套装文件夹,奇迹一条龙1.07H服务端的MuBlue.ini配置文件
  19. Cesium专栏-气象卫星云图动图(附源码下载)
  20. 嵌入式Linux搭建物联网网关,基于嵌入式Linux的物联网网关研究与实现

热门文章

  1. Java 8 Optional
  2. 大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
  3. C语言 16进制转float
  4. linux scp 使用简单说明
  5. RSA私钥及公钥生成
  6. Webstorm配置svn【window系统】
  7. SQL注入***的种类和防范手段
  8. 关于PPPOE拨号分配给用户32位掩码,且IP与网关相同的问题
  9. java希尔排序的实例,Java 插入排序之希尔排序的实例
  10. CURL基于某个URL请求需要身份验证