super task 事件驱动框架
1.定义任务数据结构,必须继承SST_Task父类,可以添加定时事件SST_TimeEvt类,和相关任务变量数据。
typedef struct {
SST_Task super; /* inherit SST_Task */
SST_TimeEvt te_evt;//定时事件,系统自带的类
uint16_t time_cnt;
}task_xxx_t;
2.定义任务的构造函数,初始化函数和执行函数。
static void Task_xxx_ctor(task_xxx_t * const me);
static void Task_xxx_init(task_xxx_t* const me, SST_Evt const * const ie);
static void Task_xxx_dispatch(task_xxx_t* const me, SST_Evt const * const e);
3.定义任务实例
static task_xxx_t task_xxx_inst; /* 定义任务实例*/
SST_Task * const AO_Task_xxx = &task_xxx_inst.super; /* 定义任务父类指针,用于创建任务 */
SST_Evt const *task_xxx_QSto[10]; /* 定义事件队列缓冲区,大小根据应用调整*/
4.在任务头文件中,定义事件信号宏, 这些宏会在其它接收事件的任务中需要用到。
enum xx_SIGNAL {
xxx_TIMEOUT_SIG,
xxx_SIG1,
xxx_SIG2,
xxx_SIG3
/* ... */
KEY_MAX_SIG /* the last signal */
};
5.定义静态事件数组,事件信息不允许再更改。
static SST_Evt const xxx_sig[] = {
{
.sig = xxx_SIG1,
},
{
.sig = xxx_SIG2,
},
{
.sig = xxx_SIG3,
}
};
6.初始化任务操作
/**
* @brief 任务例程创建,调用构造函数,相当于将任务初始函数和执行函数注册到系统调度器中。
* @note
*/
void Task_xxx_instantiate(void) {
Task_xxx_ctor(&task_xxx_inst);
}
/**
* @brief 任务构造函数初始化
* @param me: [in]任务指针
* @note
*/
static void Task_xxx_ctor(task_xxx_t * const me) {
SST_Task_ctor( &me->super,(SST_Handler)&Task_xxx_init,
(SST_Handler)&Task_xxx_dispatch);//注册初始化函数和执行函数
SST_TimeEvt_ctor(&me->te_evt, xxx_TIMEOUT_SIG, &me->super);//注册一个xxx_TIMEOUT_SIG事件信息
}
/**
* @brief 任务信号创建
* @param me: [in]任务指针
* @param ie: [in]事件信息指针,暂时不用。
* @note
*/
static void Task_xxx_init(task_xxx_t * const me, SST_Evt const * const ie){
(void)ie; /* unused parameter */
SST_TimeEvt_arm(&me->te_evt, 1U, KEY_TICKS_PER_SEC);//第二个时间参数:延时多长时间开始执行,不能为0,第一个参数周期产生信号的时间参数
}
7.定义任务的执行函数
static void send_evt(void)
{
SST_Task_post(AO_receive_task,&xxx_sig[0]);//发送事件到其它任务中,第一个参数为接收事件的任务指针,第二个事件参数(在接收到任务的执行函数中会收到 xxx_SIG1事件信息)
}
static void Task_xxx_dispatch(task_xxx_t * const me, SST_Evt const * const e) {
switch (e->sig) {
case KEY_TIMEOUT_SIG: { //定时事件KEY_TIMEOUT_SIG 产生时,跳转到此执行。
fun_handle();//伪造函数,在这里执行处理任务功能。
send_evt();//可以主动发送事件给到其它任务,可以发一个或多个事件。
break;
}
default: {
break;
}
}
}
8.在main.c主函数中创建任务
Task_XXX_instantiate();//创建任务实例
SST_Task_start(
AO_Task_XXX, /* AO pointer to start */
1U, /* SST-priority */
task_XXX_QSto, /* storage for the AO's queue */
ARRAY_NELEM(task_XXX_QSto), /* queue length */
(void *)0); /* initialization event (not used) */