|
#ifndef _USE_SYSTEM_DELAY_H
#define _USE_SYSTEM_DELAY_H
/***********************************************************
* 函数库说明:系统并行延时函数库 *
* 版本: v1.01 *
* 作者: 傻孩子 *
* 日期: 2005年8月15日 *
* -------------------------------------------------------- *
* [支持库] *
* 库名称: RD_MacroAndConst.h *
* 需要版本: v0.01 &abv *
* 函数库说明:系统常用宏定义库 *
* -------------------------------------------------------- *
* 修改: 傻孩子 *
* 修改日期: 2006月4月11日 *
* 版本升级: v1.0 *
* *
* 修改: 傻孩子 *
* 修改日期: 2006年4月16日 *
* 版本: v1.01 *
* -------------------------------------------------------- *
* [版本历史] *
* v1.0 从原来的程序代码中提取了该函数库,支持系统 *
* 并行延时,支持外部修改缓冲区大小。 *
* v1.01 使用了统一的代码插入接口标准。 *
* -------------------------------------------------------- *
* [说明] *
* 1、在您需要使用该函数之前引用该头文件 *
* 2、在您的毫秒定时器中断处理程序里面调用函数 *
* SD_INSERT_MS_TIMER_OVF_ISR_CODE以确保函数 *
* 库正常使用。 *
* 3、在系统初始化程序里面增加对该系统初始化函数 *
* SystemMsDelayInit()的调用 *
* 4、通过调用addDelayItems(n)函数来添加一个延时 *
* 该操作成功将会返回一个用于查询的句柄;否则 *
* 返回False(0)。 *
* 5、通过函数IfTimeOut(句柄)来查询句柄代表的那 *
* 个延时是否完成True/False。如果出现错误会 *
* 返回SD_ERROR标志。 *
* 6、通过在引用该头文件之前定义宏: *
* SD_DELAY_BUFF_COUNT来设定缓冲区的大小。 *
***********************************************************/
# include <RD_MacroAndConst.h>
/***********************
* 系 统 宏 定 义 *
***********************/
/*---------------------*
* 常 量 宏 定 义 *
*---------------------*/
#ifndef SD_DELAY_BUFF_COUNT
# define SD_DELAY_BUFF_COUNT 16
#endif
# define SD_ERROR 0xAD
# define SD_IN_USE 0x01
# define SD_FREE 0x00
# define SD_COMPLETE 0xAC
/*---------------------*
* 动 作 宏 定 义 区 *
*---------------------*/
# define SD_INSERT_MS_TIMER_OVF_ISR_CODE refreshSystemMsDelay();
/***********************
* 全局变量声明区 *
***********************/
unsigned int DelayBuff[SD_DELAY_BUFF_COUNT];
char DelayBuffState[SD_DELAY_BUFF_COUNT];
char PointHead = 0;
char PointTail = 0;
char DelayItemsCounter = 0;
/***********************
* 函 数 声 明 区 *
***********************/
void SystemMsDelayInit(void);
char addDelayItems(unsigned int DelayTime);
char IfTimeOut(char ItemID);
void refreshSystemMsDelay(void);
/********************************************************
* 函数说明:系统延时函数初始化 *
********************************************************/
void SystemMsDelayInit(void)
{
char a = 0;
for (a = 0;a<SD_DELAY_BUFF_COUNT;a++)
{
DelayBuff[a] = 0;
DelayBuffState[a] = SD_FREE;
}
PointHead = 0;
PointTail = 0;
DelayItemsCounter = 0;
}
/********************************************************
* 函数说明:添加延时函数 *
* 输入: 延时的长度 *
* 输出: 成功返回一个延时句柄 否则返回一个False(0) *
********************************************************/
char addDelayItems(unsigned int DelayTime)
{
char a = 0,b = 0;
if (DelayItemsCounter < SD_DELAY_BUFF_COUNT)
{
DelayBuffState[PointTail] = SD_IN_USE;
DelayBuff[PointTail] = DelayTime;
b = PointTail;
PointTail++;
if (PointTail == SD_DELAY_BUFF_COUNT)
{
PointTail = 0;
}
DelayItemsCounter ++;
return b+1;
}
return False;
}
/********************************************************
* 函数说明:延时查询函数 *
* 输入: 需要查询的延时的句柄 *
* 输出: 是否超时 True / False / SD_ERROR *
********************************************************/
char IfTimeOut(char ItemID)
{
char a = 0;
if (ItemID == 0)
{
return SD_ERROR;
}
ItemID--;
switch (DelayBuffState[ItemID])
{
case SD_IN_USE:
return False;
break;
case SD_FREE:
return False;
break;
case SD_COMPLETE:
DelayBuffState[ItemID] = SD_FREE;
for (a = 0;a<SD_DELAY_BUFF_COUNT;a++)
{
if (DelayBuffState[PointHead] == SD_FREE)
{
DelayItemsCounter--;
PointHead++;
if (PointHead == SD_DELAY_BUFF_COUNT)
{
PointHead = 0;
}
if (PointHead == PointTail)
{
break;
}
}
else
{
break;
}
}
return True;
break;
}
return SD_ERROR;
}
/********************************************************
* 函数说明:系统延时处理函数 *
********************************************************/
void refreshSystemMsDelay(void)
{
char a = 0;
for (a = 0;a<SD_DELAY_BUFF_COUNT;a++)
{
if (DelayBuffState[a] == SD_IN_USE)
{
if (DelayBuff[a] > 0)
{
DelayBuff[a] -- ;
}
else
{
DelayBuffState[a] = SD_COMPLETE;
}
}
}
}
#endif
欢迎大家一起测试。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|