Day13_定时器中断处理
方法:
采用了一个定时器链表,按照定时时间从早到大进行排序,可加速处理的速度
并且加入了一个哨兵节点,定时时间设置为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_定时器中断处理相关推荐
- stm8s103k3 周期 捕获_STM8S003K3如何用定时器中断处理捕获脉冲?
如果用STM8S的一个IO口检测一个脉冲电平,用在电话机上面,比方说是GPIO3用来检测脉冲电平变化后,MCU将接通电话的GPIO1置高,接通电话.当挂断电话后,GPIO3脉冲再次变化,GPIO1置低 ...
- STM32在定时器中控制步进电机
2019独角兽企业重金招聘Python工程师标准>>> 写WEB程序的时候,发现如果加上步进电机控制的话,就会出现问题.原因是如果把电机控制放在uip循环中处理的话,因为控制电机涉及 ...
- STM32系统滴答定时器(systick)应用
一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...
- ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖
参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...
- STM32那点事(6)_定时器(上)
STM32定时器是CPU中的基本功能模块之一,最基本的功能是提供定时,STM32定时器共用16个定时器,主要分为两个基本定时器,10个通用定时器,2个高级定时器,以及两个看门狗定时器.看门狗定时器后面 ...
- stm32关定时器_STM32F103ZET6的基本定时器
1.定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8.STM32的定时器分为基本定时器.通用定时器和高等定时器. TIM6.TIM7是基本定时器.基本定时器是只能向 ...
- 【STM32】HAL库 STM32CubeMX教程六----定时器中断
前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...
- 关于软件定时器的一些讨论
1.简介 这里先介绍下软件定时器和硬件定时器的区别 硬件定时器: CPU内部自带的定时器模块,通过初始化.配置可以实现定时,定时时间到以后就会执行相应的定时器中断处理函数.硬件定时器一般都带有其它功能 ...
- 单片机定时器实现的数字时钟
利用51单片机的定时器,设计一个数字时钟,具有时间.年月日和星期显示功能,并且可以通过按键设置调整年时间年月日和星期的功能. 1.系统功能模块图 系统主要有LED灯显示模块.电源模块.单片机最小系统. ...
- jiffies与HZ、定时器、原子操作
jiffies与HZ.定时器.原子操作 前言 一.Jiffies与HZ 1.jiffies: 2.HZ: 3.时间与jiffies转换 4.jiffies的回绕 二.计时.延迟与睡眠 1.计时 2.延 ...
最新文章
- 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
- 客户主数据冻结与删除标记位汇总
- php ajax 重复提交,ThinkPHP防止重复提交表单的方法实例分析
- C语言printf控制光标位置和清空屏幕
- window.createPopup()用法以及短消息提示框代码
- java开发_eclipse导出为war文件,热部署到tomcat运行总结[转]
- C语言中用二进制输出一个数字
- 苹果电脑mac计算机图标怎么删除吗,苹果电脑桌面的图标怎么删除不了怎么办
- frft雷达信号处理 论文
- Excel 2010 VBA 入门 126 批量设置控件属性
- PLC与Unity通讯☀️ 一、目标及术语解释
- shen_tian_hao的C++快快编程AC代码库(每周更新)
- LoadRunner使用教程
- 历届试题 九宫重排 广度优先搜索+康拓排序
- 三菱plc pwm指令_三菱PLC高速指令汇总,使用方法讲解!
- 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机
- 华为mate30 完全卸载google套件
- 奇迹服务器端套装文件夹,奇迹一条龙1.07H服务端的MuBlue.ini配置文件
- Cesium专栏-气象卫星云图动图(附源码下载)
- 嵌入式Linux搭建物联网网关,基于嵌入式Linux的物联网网关研究与实现