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

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.dtcms.com/a/276445.html

相关文章:

  • Openpyxl:Python操作Excel的利器
  • 浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别
  • Python 数据建模与分析项目实战预备 Day 3 - 特征工程基础与数据预处理(针对简历结构化数据)
  • 使用iso制作ubuntu22.04docker镜像
  • 处理日期与时间
  • 【嵌入式电机控制#13】PID参数整定的全面步骤
  • ClickHouse 25.6 版本发布说明
  • 【华为机试】HJ68 成绩排序
  • 从0设计一个短链接服务:如何实现尽可能短、可变长的短网址系统?
  • 过拟合 跷跷板 幻觉 混合精度
  • 计算机毕业设计springboot影视周边推荐系统 基于SpringBoot的电影衍生品智能推荐平台 JavaWeb实现的影视文化周边个性化服务系统
  • git版本发布
  • 黑客工具Nessus介绍及其安装使用教程
  • 使用Kali Linux hydra进行密码爆破(仅供学习)
  • 质量属性场景(Quality Attribute Scenario)深度解析
  • mybatis模糊匹配采用concat与#{},动态sql讲解
  • 模拟专家协作网络——重塑LLM专业内容生成
  • C语言基础知识--枚举
  • 商业智能(BI)系统深度解析
  • Matlab R2024b下载及详细安装教程,附中文免费Matlab安装包(含离线帮助文档)
  • 为什么一个 @Transactional 注解就能开启事务?揭秘 Spring AOP 的底层魔法
  • 维基艺术图片: python + scrapy 爬取图片
  • 【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
  • 典型的前后端交互数据示例
  • 消息认证码(message authentication code)MAC
  • 自动编码器:深度学习的特征提取与数据压缩利器
  • c++11——移动语义的举例说明
  • 数据结构与算法:逆元、除法同余和容斥原理
  • 指令微调时,也要考虑提示损失
  • Linux - 安全排查 3