[技术讨论] 嵌入式开发中的观察者模式

[复制链接]
85|0
地瓜patch 发表于 2026-8-27 21:40 来自手机 | 显示全部楼层 |阅读模式
系统里有一个事件(按键按下、传感器超阈值),多个模块需要响应这个事件——如果直接写成"按键处理函数里调显示函数、调通信函数、调蜂鸣器函数",模块之间的耦合就死死地绑在一起了,改一个牵动全身。观察者模式的核心:谁产生事件不需要知道谁在处理。// 事件类型
typedef enum {
    EVENT_BTN_PRESS,
    EVENT_SENSOR_ALARM,
    EVENT_COMM_CONNECTED,
    EVENT_MAX
} EventType_t;

// 回调函数类型
typedef void (*EventCallback_t)(void* arg);

// 事件中心:每个事件可以注册多个监听者
#define MAX_OBSERVERS 4
static EventCallback_t observers[EVENT_MAX][MAX_OBSERVERS];

void Event_Register(EventType_t event, EventCallback_t cb)
{
    for (int i = 0; i < MAX_OBSERVERS; i++) {
        if (observers[event][i] == NULL) {
            observers[event][i] = cb;
            return;
        }
    }
}

void Event_Notify(EventType_t event, void* arg)
{
    for (int i = 0; i < MAX_OBSERVERS; i++) {
        if (observers[event][i]) {
            observers[event][i](arg);
        }
    }
}

// 使用:各模块独立注册,互不知道对方
// 主初始化里
Event_Register(EVENT_BTN_PRESS, Display_OnButtonPress);
Event_Register(EVENT_BTN_PRESS, Buzzer_OnButtonPress);
Event_Register(EVENT_SENSOR_ALARM, Comm_SendAlarm);

// 按键检测模块,只管发事件,不管谁在响应
void Button_Task(void)
{
    if (Is_Button_Pressed()) {
        Event_Notify(EVENT_BTN_PRESS, NULL);
    }
}新增一个响应模块,只需要多注册一个回调,不需要改任何现有代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

3037

主题

18141

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部
0