Event 事件系统
Event
类是 LibXR 中用于事件驱动机制的核心中间件,支持事件注册、事件触发、中断安全调用与事件绑定,是构建嵌入式任务协作的重要工具。
模块功能
- 基于 事件 ID 注册多个回调;
- 支持 线程/中断上下文触发;
- 可通过
GetList()
实现 中断上下文安全事件触发; - 支持 事件桥接绑定,用于跨模块事件流转;
- 内部采用 红黑树 + 无锁链表 实现高效、并发安全存储。
快速使用
注册事件回调
int counter = 0;
LibXR::Event evt;
auto cb = LibXR::Event::Callback::Create(
[](bool, int *cnt, uint32_t event) {
(*cnt)++;
ASSERT(event == 0x10);
},
&counter);
evt.Register(0x10, cb);
触发事件
evt.Active(0x10); // 普通线程上下文触发
中断上下文触发(需提前获取回调链表)
// 在非回调中获取事件链表
auto list = evt.GetList(0x1234);
// 在回调中触发
evt.ActiveFromCallback(list, 0x1234);
事件绑定
evt_dst.Bind(evt_src, 0xA, 0xB); // 当 evt_src 的事件 0xA 触发时,会激活 evt_dst 的事件 0xB
类定义结构
Event::Register(event, cb)
:注册回调;Event::Active(event)
:非中断触发;Event::ActiveFromCallback(list, event)
:中断上下文安全触发;Event::GetList(event)
:获取并缓存事件链表;Event::Bind(src, id_src, id_dst)
:实现事件桥接;- 内部使用
RBTree<uint32_t>
管理事件映射,事件对应回调使用LockFreeList
存储。
示例:测试事件绑定与触发
int arg = 0;
auto cb = Event::Callback::Create([](bool, int* a, uint32_t e) {
*a += 1;
}, &arg);
Event e1, e2;
e1.Register(0x1234, cb);
e1.Active(0x1234); // arg += 1
e2.Bind(e1, 0x4321, 0x1234);
e2.Active(0x4321); // arg += 1
应用场景
- 按键/传感器中断触发事件;
- 多任务协作中的状态通知;
- 与 Topic/Message 联动构建事件-消息系统。
更多信息请查阅 event.hpp
源码。