在线时间587 小时
UID3253488
注册时间2016-3-21
NXP金币0

TA的每日心情 | 怒 2017-1-4 08:05 |
---|
签到天数: 11 天 连续签到: 1 天 [LV.3]偶尔看看II
版主
  
- 积分
- 2569

- 最后登录
- 2019-3-28
|
本帖最后由 技术范儿 于 2016-6-28 08:26 编辑
还在为不会用操作系统而烦恼吗?还在被写不出迸发任务的程序而烦恼吗?一个简单地定时器任务调度内核,屡试不爽,简单地移植过程,你值得拥有,拿走不谢!(以前从一个协议栈里面抠出来的)- /*******************************************************
- * FileName: sys_to.h
- * Dependencies:
- * Processor: PIC24F
- * Complier: C30,MPLAB IDE V8.0
- * Company:
- * Author Date Comment
- *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * Amayer 09/09/09 Wsn Stack v0.1
- * Amayer 04/31/10 Wsn Stack v1.0
- *******************************************************/
- #include "sys_to.h"
- //定义定时器时间队列的大小
- #define CntSysTOQueSize 8
- //定义定时器管理队列数组
- SYS_TO SysTOQue[CntSysTOQueSize];
- /*******************************************************
- * 【函 数】void InitSetupSysTOTimer(void)
- * 【参 数】void,无
- * 【返回值 】void,无
- * 【用 途】将定时器队列初始化,清空标志,各属性值默认为0
- * 【备 注】通常在主程序的初始化中调用
- * 【完成日期】2004-10-18 11:47
- * 【创建 者】XXXXXXX
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void InitSetupSysTOTimer(void)
- {
- BYTE iIndex;
- for (iIndex=0; iIndex<CntSysTOQueSize; iIndex++)
- {
- SysTOQue[iIndex].start = 0;
- SysTOQue[iIndex].msecs = 0;
- SysTOQue[iIndex].bits.delay = 0;
- SysTOQue[iIndex].h = (sys_to_handler) 0;
- SysTOQue[iIndex].arg = (void *) 0;
- SysTOQue[iIndex].bits.sType = TO_CIR;
- SysTOQue[iIndex].bits.bInUse = 0;
- }
- }
- /*******************************************************
- * 【函 数】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
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- * 标注:只能处理无返回值的函数,有返回值的函数虽然能正常执行,但是是将其强制转换成了无返回值的函数了(sys_to_handler) taolang 20130925
- ********************************************************/
- BYTE CreateSysTOTimer(DWORD msecs, sys_to_handler h, void *arg, BYTE type)
- {
- BYTE iIndex;
- for (iIndex=0; iIndex<CntSysTOQueSize; iIndex++)
- {
- if (!SysTOQue[iIndex].bits.bInUse)
- {
- SysTOQue[iIndex].start = GetTime();
- SysTOQue[iIndex].msecs = msecs;
- SysTOQue[iIndex].h = h;
- SysTOQue[iIndex].arg = arg;
- SysTOQue[iIndex].bits.sType = type;
- SysTOQue[iIndex].bits.delay = 0;
- SysTOQue[iIndex].bits.bInUse = 1;
- return iIndex;
- }
- }
- return InValHandle;
- }
- /*******************************************************
- * 【函 数】void RemoveSysTOTimer(WORD Index)
- * 【参 数】WORD Index,需要删除的定时器的句柄
- * 【返回值 】void,无
- * 【用 途】当定时器使用完毕,就删除,释放资源,供其它的
- * 程序使用
- * 【备 注】在void RefreshSysTOTimer(void)函数中调用
- * 通常是只调用一次的定时器处理
- * 【完成日期】2010-7-5 17:58
- * 【创建 者】
- * 【修改记录】
- * ※修改说明※
- * ※修改时间※
- * ※修改人※
- * ※修改前源代码是否备份※
- ********************************************************/
- void RemoveSysTOTimer(BYTE Index)
- {
- if ((Index < CntSysTOQueSize) && (SysTOQue[Index].bits.bInUse))
- {
- SysTOQue[Index].start = 0;
- SysTOQue[Index].msecs = 0;
- SysTOQue[Index].h = (sys_to_handler) 0;
- SysTOQue[Index].arg = (void *) 0;
- SysTOQue[Index].bits.bInUse = 0;
- }
- }
- /*******************************************************
- * 【函 数】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<CntSysTOQueSize; 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<CntSysTOQueSize; 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);
- }
- }
- }
- }
- }
- }
- /*******************************************************
- * 【函 数】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)
- {
- if ((Index < CntSysTOQueSize) && (SysTOQue[Index].bits.bInUse))
- {
- SysTOQue[Index].bits.delay = delay;
- if (SysTOQue[Index].bits.delay >= CntMaxDelayTimes)
- {
- SysTOQue[Index].bits.delay = CntMaxDelayTimes;
- }
- }
- }
复制代码- #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
复制代码- #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
复制代码
|
|