当前位置: 首页 > ops >正文

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) */

http://www.xdnf.cn/news/15155.html

相关文章:

  • 用AI做带货视频评论分析【Datawhale AI 夏令营】
  • 冒泡排序和快速排序
  • 「Linux命令基础」文本模式系统关闭与重启
  • 【C/C++】动态内存分配:从 C++98 裸指针到现代策略
  • Linux操作系统之进程间通信:命名管道
  • 飞算JavaAI:给Java开发装上“智能引擎”的超级助手
  • vue入门学习教程
  • 车载诊断进阶篇 --- 关于网关转发性能引起的思考
  • 匿名函数作递归函数引用
  • uniapp制作一个视频播放页面
  • C++11中的std::minmax与std::minmax_element:原理解析与实战
  • WIFI协议全解析06:Beacon帧、Probe帧你必须懂,搞WiFi通信绕不开它们
  • 【理念●体系】Windows AI 开发环境搭建实录:六层架构的逐步实现与路径治理指南
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • 从代码学习深度强化学习 - PPO PyTorch版
  • Go语言WebSocket编程:从零打造实时通信利器
  • Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源
  • 蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?
  • Spring的事务控制——学习历程
  • HarmonyOS NEXT端云一体化开发初体验
  • [Dify] -基础入门4-快速创建你的第一个 Chat 应用
  • 牛客:HJ17 坐标移动[华为机考][字符串]
  • Leaflet面试题及答案(1-20)
  • [实战]调频三角波和锯齿波信号生成(完整C代码)
  • 深入浅出:什么是MCP(模型上下文协议)?
  • 力扣网编程134题:加油站(双指针)
  • C++中柔性数组的现代化替代方案:从内存布局优化到标准演进
  • Debian:从GNOME切换到Xfce
  • 扫描文件 PDF / 图片 纠斜 | 图片去黑边 / 裁剪 / 压缩
  • I2C集成电路总线