首页 > 其他分享 >活动对象----active object

活动对象----active object

时间:2025-01-01 16:08:12浏览次数:1  
标签:me Blinky const object ---- Active active Event

一.preface

近期学习QPC框架,其核心之一就是 actvie-object,活动对象的出现是为了解决并发(阻塞、数据竞争)问题。笔者这里做一篇笔记,方便日后回顾。

二.What is "active object"

  • 活动对象的组成框架


  • 代码如下

点击查看代码
typedef struct Active Active; 

typedef void (*DispatchHandler)(Active * const me, Event const * const e);  //当前处理哪一个活动对象,当前的事件是什么

/* Active Object base class */
struct Active {
    INT8U thread;     /* private thread (the unique uC/OS-II task priority), 相当于线程句柄 */
    OS_EVENT *queue;  /* private message queue */

    DispatchHandler dispatch; /* pointer to the dispatch() function */

    /* active object data added in subclasses of Active */
};
  • 举例---LED活动对象
    LED需要一个状态变量来记录LED的状态
点击查看代码
typedef struct Blinke{
    Active super; //active obj class obj
    bool isLedOn;//private data;
}Blinky;

//模块内部使用
static Blinky Blinky_instance;

//模块外部使用 
Active *const AO_Blinky = &Blinky_inst.super;    //保证了私有数据的安全

/*event base class*/
typedef struct{
    Signal sig; /*event signal*/
    /*event parameters added in subclasses of Event*/
}Event;

void Blinky_handler(Active *const me, Event *e){
  switch(e->sig){
  case TIMEOUT_SIG:
    if( ((Blinky *)me)->isLedOn == true )    //模块内部可以通过显示类型转换获得私有数据
    {
        BSP_ledOff();
        *((Blinky *)me)->isLedOn = false; 
    }
    else
    {
        BSP_ledOn();
        *((Blinky *)me)->isLedOn = true; 
    }
    break;
  default:
    //error
  }
}


三. 事件处理函数的状态机实现

点击查看代码
void Blinky_handler(Active *const me, Event *e){
  static enum{
      INIT,
      ON,
      OFF,
  }  state = INIT;
  switch(state){
  case ON:
      switch(e->sig){
      
      }
      break;
  case OFF:
      switch(e->sig){
      
      }
      break;
  default:
    //error
  }
}
但是代码结构并不美观,所以引入层次状态机

标签:me,Blinky,const,object,----,Active,active,Event
From: https://www.cnblogs.com/Charles-Hui/p/18645986

相关文章

  • 新的一年,我决定拆解一个蓝牙接收器
    哈哈,容我介绍一下,如果大家对电子感兴趣,可以看一下下面的图片,会经常更新优秀的原创文章。再次感谢每一个努力的电子爱好者。今天我们来拆解一个蓝牙接收器,首先我们需要有一个直观的印象。下图就是我们这次需要拆解的对象。我再想这么小的接收器,电路是怎么放进去得呢,先别急,往下看......
  • cmu15-445课程所用到的Extendible Hash Table的一个性质证明
    在Fall2023的P2中,对特定bucket_idx_i进行Remove后,可能会触发merge,设:在merge前,bucket_idx_i对应了local_depth_i和page_id_i一次merge的过程涉及到两个page_id,而一个page_id所对应的bucket_idx数量是2^(global_depth-local_depth)个,于是原本的两个page_id涉及到的buc......
  • 《墨菲定律》
    墨菲定律是一种心理学效应,由爱德华·墨菲提出,其主要内容有以下几个方面:-**任何事都没有表面看起来那么简单**:这意味着我们在看待事物时,不能仅仅依据表面现象就轻易下结论,而需要深入探究其本质和内在的复杂性。比如在项目管理中,一个看似简单的任务,可能在实际执行过程中会涉及到......
  • 世界上的五种顶级思维
    以下是几种常见被认为是世界上的顶级思维:###系统思维-**含义**:将一个系统看作一个整体,全面考虑系统内部各要素之间以及系统与外部环境之间的相互联系和相互作用。-**应用示例**:在企业管理中,运用系统思维可以从整体上把握企业的运营状况,包括人力资源、财务、市场、生产等......
  • 打卡信奥刷题(523)用C++信奥P6861[普及组/提高] [RC-03] 难题
    [RC-03]难题题目描述求两个整数a,ba,ba,b(......
  • 类图怎么画,手把手教学(保姆级教学)
    类图先说说类图的几种关系关联和依赖关联关系表示两个类之间的连接或关系,通常表示较为长期的关系,通过成员变量建立对象之间的联系,就比如老师与学生用实线相连依赖是类之间短期的、临时的关系,通常通过方法传参实现用虚线箭头(箭头指向被依赖的类)就比如老师与教材聚集与......
  • OpenCV 图像处理之形态学转换
    摘要: 形态学转换是图像处理中的重要技术,它基于图像的形状特征进行操作,能够有效地对图像进行增强、去噪、分割等处理。本文详细介绍了OpenCV中形态学转换的多种方法,包括侵蚀、扩张、开运算、闭运算、形态学梯度、顶帽和黑帽,并通过Python代码实现这些方法,深入探讨了它们的原......
  • 软件工程萨默维尔版的期末总结
    第一章软件工程概述什么是软件?(了解)狭义来讲是数据和指令的集合,广义来说是程序和相关文档好的软件有哪些重要属性?(重点)可接受性、可依赖性和信息安全性、效率、可维护性什么是工程?(了解)狭义上应用科学知识和技术手段,广义来说一群人为达到某种目的,在一个较长时间的周期......
  • 用仓颉完成编译原理实验-消除左递归和左公共因子,求FIRST集和FOLLOW集
    目录实验目的实验内容实现消去上下文无关文法中所有左递归的算法实现从上下文无关文法中提取左公共因子的算法实现求解上下文无关文法的FIRST集和FOLLOW集的算法设计方案与算法描述设计文法的数据结构实现消去上下文无关文法中所有左递归的算法实现从上下文无关文法中......
  • 如何在 Ubuntu 20.04 上部署 Graylog 日志管理平台教程
    如何在Ubuntu20.04上部署Graylog日志管理平台教程简介Graylog是一个开源的、基于Web的日志管理和聚合系统,它可以帮助你高效地管理和分析大量日志数据。通过收集服务器日志,并使用Elasticsearch进行索引,以及MongoDB保存元数据,Graylog使得详细的日志分析成为可......