#include "event.h" /* ========================================================================= * 事件队列内部变量 * ========================================================================= */ // 环形缓冲区存储数组 static SystemEvent event_queue[EVENT_QUEUE_DEPTH]; // 队列读写指针 static u8 queue_head = 0; // 读指针:指向即将读取的位置 static u8 queue_tail = 0; // 写指针:指向即将写入的位置 static u8 queue_count = 0; // 当前队列中的事件数量 // 队列锁标志(用于中断保护) static bit queue_locked = 0; /* ========================================================================= * 事件队列核心实现 * ========================================================================= */ void EventQueue_Init(void) { queue_head = 0; queue_tail = 0; queue_count = 0; queue_locked = 0; } bit EventQueue_IsEmpty(void) { return (queue_count == 0); } bit EventQueue_IsFull(void) { return (queue_count >= EVENT_QUEUE_DEPTH); } u8 EventQueue_GetCount(void) { return queue_count; } bit EventQueue_Push(SystemEvent evt) { // 队列已满,丢弃事件 if (EventQueue_IsFull()) { return 0; } // 禁用中断保护队列操作 EA = 0; // 将事件写入环形缓冲区 event_queue[queue_tail] = evt; // 更新写指针(循环递增) queue_tail++; if (queue_tail >= EVENT_QUEUE_DEPTH) { queue_tail = 0; } // 更新事件计数 queue_count++; // 恢复中断 EA = 1; return 1; } SystemEvent EventQueue_Pop(void) { SystemEvent evt; // 初始化返回的空事件 evt.key_event = KEY_EVENT_NONE; evt.priority = EVENT_PRIORITY_LOW; evt.extra_data = 0; evt.extra_size = 0; // 队列为空,返回空事件 if (EventQueue_IsEmpty()) { return evt; } // 禁用中断保护队列操作 EA = 0; // 从队列头部读取事件 evt = event_queue[queue_head]; // 更新读指针(循环递增) queue_head++; if (queue_head >= EVENT_QUEUE_DEPTH) { queue_head = 0; } // 更新事件计数 queue_count--; // 恢复中断 EA = 1; return evt; } // 外部声明:应用管理器的事件分发函数 extern void AppManager_DispatchEvent(SystemEvent evt); void EventQueue_EmergencyDispatch(SystemEvent evt) { // 紧急事件直接调用应用管理器分发,跳过队列 // 这种方式用于SOS等最高优先级事件,确保立即响应 AppManager_DispatchEvent(evt); }