|
TEvent 20081017
Author: ATmega32
1.数据结构
事件值
uint8 EventValue;
其中EVT_TASK_ENTRY(0XFF)和EVT_TASK_DELAY(0XFE)内核已使用
事件结构体
typedef struct
{
TLink Link;
uint8 Flag;
uint8 EventValue;
}TEvent;
任务结构体
typedef struct
{
uint8 Flag;
TQueue EventQueue;
TTaskExecute *Execute;
}TTask;
定时器结构体
typedef struct
{
TLink Link;
size_t Rel;
size_t Abs;
uint8 Flag;
uint8 TaskId;
uint8 EventValue;
}TTimer;
休眠结构体
typedef struct
{
volatile uint8 SleepEnable;
volatile uint8 SleepLevel;
}
TSleepBlock;
2.需要配置的地方(在EV_Config.h)
#define TASK_MAX_COUNT 3
最大任务数,用户可使用的任务ID为0到TASK_MAX_COUNT-1
#define EVENT_MAX_COUNT 30
最大事件数,EventTab[EVENT_MAX_COUNT]为用户时间提供存储空间
#define TIMER_MAX_COUNT 10
最大定时器数,TimerTab[TIMER_MAX_COUNT]为用户定时器提供存储空间
3.用户接口函数
void EVT_FreeMemorry(TEvent *Event);
释放事件存储空间
TEvent *EVT_AllocMemory(void);
分配事件存储空间,如果分配成功,返回事件结构体指针,如果分配失败,返回NULL
TEvent * EVT_Create(uint8 EventValue);
创建一个事件,包含分配事件存储空间并赋值事件值,如果分配成功,返回事件结构体指针,如果分配失败,返回NULL
uint8 EVT_Scheduler(void);
内核调度,如果内核调度对所有任务循环调度一周,如果没有任何事件,则返回0,否则,返回1
此返回值可作为系统进入休眠条件
void TSK_Init(TTaskExecute *Execute,uint8 TaskId);
任务初始化,初始化时,允许内核调度执行任务事件
void TSK_InitWithEntryEvent(TTaskExecute *Execute,uint8 TaskId);
任务初始化,初始化时,允许内核调度执行任务事件,并触发一个EVT_TASK_ENTRY(0XFF)的事件
void TSK_Disable(uint8 TaskId);
禁止内核调度执行任务事件
void TSK_Enable(uint8 TaskId);
允许内核调度执行任务事件,任务初始化设为允许
void TSK_EventPutLock(uint8 TaskId);
禁止向ID为TaskId的任务事件队列写入事件
void TSK_EventPutUnlock(uint8 TaskId);
允许向ID为TaskId的任务事件队列写入事件
void TSK_EventGetLock(uint8 TaskId);
禁止从ID为TaskId的任务事件队列读取事件
void TSK_EventGetUnlock(uint8 TaskId);
允许从ID为TaskId的任务事件队列读取事件
void TSK_EventLock(uint8 TaskId);
禁止向ID为TaskId的任务事件队列写入和读取事件
void TSK_EventUnlock(uint8 TaskId);
允许向ID为TaskId的任务事件队列写入和读取事件
void TSK_EventClear(uint8 TaskId);
清除ID为TaskId的任务事件队列里的所有事件
TEvent * EVT_PostToTask(uint8 EventValue,uint8 TaskId);
向ID为TaskId的任务触发一个事件,事件值为EventValue,如果成功,返回事件结构体指针,否则,返回NULL
TTimer * EVT_DelayPostToTask(uint8 EventValue,size_t delay,uint8 TaskId);
分配一个定时器,此定时器将在一定延时后,向ID为TaskId的任务触发一个事件。
如果分配定时器成功,返回定时器结构体指针,否则,返回NULL
TEvent * EVT_Post(uint8 EventValue);
向当前任务触发一个事件,事件值为EventValue,如果成功,返回事件结构体指针,否则,返回NULL
此函数只在能在任务中使用
TTimer * EVT_DelayPost(uint8 EventValue,size_t delay);
分配一个定时器,此定时器将在一定延时后,向当前任务触发一个事件。
如果分配定时器成功,返回定时器结构体指针,否则,返回NULL。
此函数只能在任务中使用
TTimer * TSK_Delay(size_t delay)
等同于EVT_DelayPost(EVT_TASK_DELAY,delay),实际上并非函数,是一个宏
分配一个定时器,此定时器将在一定延时后,向当前任务触发一个事件值为EVT_TASK_DELAY的事件。
如果分配定时器成功,返回定时器结构体指针,否则,返回NULL。
此函数只能在任务中使用
void EVT_Delete(uint8 TaskId,TEvent *Event);
删除ID为TaskId的任务的事件队列里Event事件结构体指针指向的事件
void TMR_TicksHander(void);
定时器节拍处理
TTimer *TMR_AllocMemory(void);
分配一个定时器存储空间,如果成功,返回定时器结构体指针,否则,返回NULL
void TMR_FeeMemory(TTimer *Timer);
释放定时器存储空间
void TMR_Delete(TTimer *Timer);
删除定时器队列里Timer定时器结构体指针指向的定时器结构体
void TMR_Clear(void);
删除定时器队列里所有定时器
TTimer * TMR_Post(size_t Abs,uint8 Flag,uint8 TaskId,uint8 EventValue);
创建一个定时器并加入到定时器队列,在Abs个节拍延时后,向ID为TaskId的任务触发一个事件值为EventValue的事件,
如果Flag为TMR_ONESHOT(0X01),则事件触发后,定时器会被删除,
如果Flag为TMR_PERIODIC(0x02),则会周期性触发事件
void SLP_Enable(void);
允许调度内核休眠
void SLP_Disable(void);
禁止调度内核休眠
uint8 SLP_IsEnable(void);
判断内核使用允许休眠
void SLP_SetLevel(uint8);
设置休眠等级
uint8 SLP_GetLevel(void);
读取休眠等级
点击此处下载 ourdev_459012.rar(文件大小:124K) (原文件名:test_tevent.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|