1
|
|
|
|
- /*******************************************************
- * 【函 数】WORD SearchSysTOTimer(sys_to_handler h,void *arg)
- * 【参 数】sys_to_handler h:定时结束后触发的事件
- * void *arg,触发事件的参数
- * 【返回值 】WORD,根据触发事件及参数查询定时器,返回句柄
- * 【用 途】查看定时器队列中,是否已经创建了触发该事件的定时器
- *
- * 【备 注】通常在创建定时器之前使用,防止重复
- *
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- BYTE SearchSysTOTimer(sys_to_handler h, void *arg)
- {
- BYTE iIndex;
- for (iIndex=0; iIndex {
- if ((SysTOQue[iIndex].bits.bInUse) && (SysTOQue[iIndex].h == h)
- && (SysTOQue[iIndex].arg == arg))
- {
- return iIndex;
- }
- }
- return InValHandle;
- }
- /*******************************************************
- * 【函 数】void RefreshSysTOTimer(void)
- * 【参 数】void,无
- *
- * 【返回值 】void
- * 【用 途】定时器队列的处理事件,若是定时时间到就触发相应的动作
- * 若是一次性定时器,则删除释放资源
- * 若是循环定时器,重新计时
- * 【备 注】通常在主函数中调用,在死循环中调用,不断轮询,实时检查
- *
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void RefreshSysTOTimer(void)
- {
- BYTE iIndex;
- DWORD time;
- for (iIndex=0; iIndex {
- if (SysTOQue[iIndex].bits.bInUse)
- {
- time = DiffTime(SysTOQue[iIndex].start, GetTime());
- //若是定时到
- if ((time > SysTOQue[iIndex].msecs))
- {
- //是否延时了
- if (SysTOQue[iIndex].bits.delay > 0)
- {
- SysTOQue[iIndex].bits.delay--;
- SysTOQue[iIndex].start = GetTime();
- }
- else
- {
- //若是没有延时
- if (SysTOQue[iIndex].arg == NULL)
- {
- (SysTOQue[iIndex].h)();
- }
- else
- {
- (SysTOQue[iIndex].h)(SysTOQue[iIndex].arg);
- }
- if (SysTOQue[iIndex].bits.sType == TO_CIR)
- {
- SysTOQue[iIndex].start = GetTime();
- }
- else if (SysTOQue[iIndex].bits.sType == TO_ONY)
- {
- RemoveSysTOTimer(iIndex);
- }
- }
- }
- }
- }
- }
|
|
|
|
|
- #ifndef _SYS_TO_H
- #define _SYS_TO_H
- /*********************************************************************
- tick调度移植:
- tick调度包括:tick.c/h sys_to.c/h 函数
- 移植CalacCounter();到2ms定时器中。
- 部署:
- InitSetupSysTOTimer(); 到系统初始化中
- RefreshSysTOTimer(); 到while循环中
- 接口函数:
- CreateSysTOTimer();建立定时任务
- DiffTime(); 系统时间比较函数
- GetTime(); 系统时间获取函数
- **********************************************************************/
- /*******************************************************
- * FileName: sys_to.h
- * Dependencies:
- * Processor: PIC24F
- * Complier: C30,MPLAB IDE V8.0
- * Company:
- * Author Date Comment
- *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *******************************************************/
- #include "common.h"
- #include "Tick.h"
- //定义函数指针
- typedef void (*sys_to_handler)();
- #define TO_ONY 0x01 //单次
- #define TO_CIR 0x02 //循环的
- #define CntMaxDelayTimes 5
- #ifndef NULL //taolang 修改
- #define NULL (void *)0
- #endif
- typedef struct _SYS_TO
- {
- DWORD start; //起始时间
- DWORD msecs; //定时时间
- sys_to_handler h; //事件触发
- void *arg; //参数
- struct
- {
- WORD sType:8;
- WORD bInUse:1;
- WORD delay:3; //延时8倍
- WORD :4;
- }bits;
- }SYS_TO;
- /*******************************************************
- * 【函 数】void InitSetupSysTOTimer(void)
- * 【参 数】void,无
- * 【返回值 】void,无
- * 【用 途】将定时器队列初始化,清空标志,各属性值默认为0
- * 【备 注】通常在主程序的初始化中调用
- * 【完成日期】2004-10-18 11:47
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void InitSetupSysTOTimer(void);
- /*******************************************************
- * 【函 数】WORD CreateSysTOTimer(DWORD msecs,sys_to_handler h,void *arg,BYTE type)
- * 【参 数】DWORD msecs:定时时间;sys_to_handler h:超时发生的事件;
- * void *arg,超时事件的参数;BYTE type:定时器使用类型,是只发生一次就
- * 删除,还是循环使用
- * 【返回值 】WORD,返回创建的定时器的句柄,也就是标识
- * 【用 途】建立一个定时器,需要制定定时时间,结束时触发的动作,及相关类型
- * 【备 注】在需要超时处理的位置调用
- * 【完成日期】2010-7-5 17:56
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- BYTE CreateSysTOTimer(DWORD msecs, sys_to_handler h, void *arg, BYTE type);
- /*******************************************************
- * 【函 数】void RemoveSysTOTimer(WORD Index)
- * 【参 数】WORD Index,需要删除的定时器的句柄
- * 【返回值 】void,无
- * 【用 途】当定时器使用完毕,就删除,释放资源,供其它的
- * 程序使用
- * 【备 注】在void RefreshSysTOTimer(void)函数中调用
- * 通常是只调用一次的定时器处理
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void RemoveSysTOTimer(BYTE Index);
- /*******************************************************
- * 【函 数】WORD SearchSysTOTimer(sys_to_handler h,void *arg)
- * 【参 数】sys_to_handler h:定时结束后触发的事件
- * void *arg,触发事件的参数
- * 【返回值 】WORD,根据触发事件及参数查询定时器,返回句柄
- * 【用 途】查看定时器队列中,是否已经创建了触发该事件的定时器
- *
- * 【备 注】通常在创建定时器之前使用,防止重复
- *
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- BYTE SearchSysTOTimer(sys_to_handler h, void *arg);
- /*******************************************************
- * 【函 数】void RefreshSysTOTimer(void)
- * 【参 数】void,无
- *
- * 【返回值 】void
- * 【用 途】定时器队列的处理事件,若是定时时间到就触发相应的动作
- * 若是一次性定时器,则删除释放资源
- * 若是循环定时器,重新计时
- * 【备 注】通常在主函数中调用,在死循环中调用,不断轮询,实时检查
- *
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void RefreshSysTOTimer(void);
- /*******************************************************
- * 【函 数】void DelaySysTOTimer(WORD Index, BYTE delay)
- * 【参 数】WORD Index,需要延时的定时器的句柄
- * BYTE delay,延时的时间,最大不超过定时的5倍
- * 【返回值 】void,无
- * 【用 途】将某个定时器延时,根据句柄来实现
- *
- * 【备 注】在需要将定时器队列延时的时候使用
- *
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※ 增加了一个参数,可设定延时时间
- * ※修改时间※ 2010-8-13 8:50
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void DelaySysTOTimer(BYTE Index, BYTE delay);
- #endif
|
|
|
|
|
#include "tick.h"
//#include "stm32f10x_lib.h"
//设定一个时间片,每到中断,SysTick自增
#define MAX_COUNT_VALUE 0xFFFFFFFF
#define CntTicksSize (5)
//用于实现定时器的中断次数累计
//全局变量在哪个文件中定义,一定在相应文件中初始化
DWORD ASysTick = 0;
DWORD SysTime = 0;
//SysTime 的计时为每N个节拍,dwtimes增加1
static WORD nCounter = 0;
TICK GetTime(void)
{
return SysTime;
}
/*******************************************
功能:获取时间差
参数: 输入,两个时间点
输出,时间差值
******************************************/
TICK DiffTime(TICK start, TICK end)
{
TICK dwValue;
if (end >= start)
{
dwValue = end - start;
}
else
{
dwValue = MAX_COUNT_VALUE + end - start;
}
return dwValue;
}
TICK GetTicks(void)
{
return ASysTick;
}
TICK DiffTicks(TICK start, TICK end)
{
TICK dwValue;
if (end >= start)
{
dwValue = end - start;
}
else
{
dwValue = (MAX_COUNT_VALUE - start) + end ;
}
return dwValue;
}
void CalacCounter(void)
{
ASysTick++;
nCounter++;
if (nCounter >= CntTicksSize)
{
SysTime++;
nCounter = 0;
}
}
/*
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt(void)
{
TMR1=0x0000;
SysTick++;
IFS0bits.T1IF=0;//这个一定要
}
int main(void)
{
DWORD dwTemp=0;
InitSetup();
SysTick=0;
dwTemp=0xFFFFFFF0;
while(1)
{
if(DiffTicks(dwTemp,GetTicks())>=30)
{
Nop();
}
}
return TRUE;
}
*/
|
|
|
|
|
- #ifndef _TICK_H
- #define _TICK_H
- /***************************************************
- tick调度移植:
- tick调度包括:tick.c/h sys_to.c/h 函数
- 移植CalacCounter();到2ms定时器中。
- 部署:
- InitSetupSysTOTimer(); 到系统初始化中
- RefreshSysTOTimer(); 到while循环中
- 接口函数:
- CreateSysTOTimer();建立定时任务
- DiffTime(); 系统时间比较函数
- GetTime(); 系统时间获取函数
- ****************************************************/
- #include "common.h"
- //定义时间结构
- typedef DWORD TICK;
- /*******************************************************
- * 【函 数】TICK GetTime(void)
- * 【参 数】void,无
- * 【返回值 】TICK,返回当前全局变量的值,也就是dwTimes
- * 【用 途】为长时间的计时,提供基础,提供时间片
- * 【备 注】利用硬件的定时器产生小的时间片,通过统计时间片的
- * 数量,实现计时
- * 【完成日期】2010-7-6 8:47
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- TICK GetTime(void);
- /*******************************************************
- * 【函 数】TICK DiffTime(TICK start,TICK end)
- * 【参 数】TICK start:计算时间差的起始时间;
- * TICK end:计算时间差的截止时间
- * 【返回值 】TICK,返回时间差值
- * 【用 途】计算时间差
- * 【备 注】
- *
- * 【完成日期】2010-7-6 8:47
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- TICK DiffTime(TICK start, TICK end);
- /*******************************************************
- * 【函 数】TICK GetTicks(void)
- * 【参 数】void,无
- * 【返回值 】TICK,返回当前全局变量的值,也就是dwSeconds
- * 【用 途】为长时间的计时,提供基础,提供时间片
- * 【备 注】利用硬件的定时器产生小的时间片,通过统计时间片的
- * 数量,实现计时
- * 【完成日期】2010-7-6 8:47
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- TICK GetTicks(void);
- /*******************************************************
- * 【函 数】TICK DiffTicks(TICK start,TICK end)
- * 【参 数】TICK start:计算时间差的起始时间;
- * TICK end:计算时间差的截止时间
- * 【返回值 】TICK,返回时间差值
- * 【用 途】计算时间差
- * 【备 注】
- *
- * 【完成日期】2010-7-6 8:47
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- TICK DiffTicks(TICK start, TICK end);
- void CalacCounter(void);
- #endif
|
|
|
|
|