增加事件驱动和业务回滚处理方式

This commit is contained in:
冯佳
2026-03-04 08:50:04 +08:00
parent cc4c361df6
commit 47a9dff6ef
25 changed files with 2626 additions and 1780 deletions

203
app/event_queue.c Normal file
View File

@ -0,0 +1,203 @@
/*
* event_queue.c
*
* Created on: 2026-03-04
* Author: RT-Thread
*
* 功能: 事件队列模块实现
* 依赖: RT-Thread Nano, osal
* 跨平台适配: 基于RT-Thread Nano使用标准API
*/
#include <rtthread.h>
#include "osal.h"
#include "event_queue.h"
/* 事件队列结构 */
static event_queue_t g_event_queue;
/**
* @brief 初始化事件队列
* @return 0 成功非0 失败
*/
int event_queue_init(void)
{
/* 初始化事件队列 */
g_event_queue.head = 0;
g_event_queue.tail = 0;
g_event_queue.count = 0;
/* 初始化互斥锁 */
g_event_queue.mutex = osal_mutex_create("event_mutex");
if (g_event_queue.mutex == NULL)
{
osal_log_e("Failed to create event queue mutex");
return -1;
}
/* 初始化信号量 */
g_event_queue.sem = osal_sem_create("event_sem", 0);
if (g_event_queue.sem == NULL)
{
osal_log_e("Failed to create event queue semaphore");
osal_mutex_delete(g_event_queue.mutex);
return -1;
}
osal_log_i("Event queue initialized");
return 0;
}
/**
* @brief 销毁事件队列
* @return 0 成功非0 失败
*/
int event_queue_deinit(void)
{
if (g_event_queue.mutex != NULL)
{
osal_mutex_delete(g_event_queue.mutex);
g_event_queue.mutex = NULL;
}
if (g_event_queue.sem != NULL)
{
osal_sem_delete(g_event_queue.sem);
g_event_queue.sem = NULL;
}
osal_log_i("Event queue deinitialized");
return 0;
}
/**
* @brief 向事件队列中添加事件
* @param event 事件指针
* @return 0 成功非0 失败
*/
int event_queue_push(event_t *event)
{
if (event == NULL)
{
return -1;
}
/* 加锁 */
if (osal_mutex_take(g_event_queue.mutex, OSAL_WAIT_FOREVER) != OSAL_OK)
{
osal_log_e("Failed to take event queue mutex");
return -1;
}
/* 检查队列是否已满 */
if (g_event_queue.count >= EVENT_QUEUE_SIZE)
{
osal_log_w("Event queue is full, dropping event");
osal_mutex_release(g_event_queue.mutex);
return -1;
}
/* 添加事件到队列 */
g_event_queue.events[g_event_queue.tail] = *event;
g_event_queue.tail = (g_event_queue.tail + 1) % EVENT_QUEUE_SIZE;
g_event_queue.count++;
/* 解锁 */
osal_mutex_release(g_event_queue.mutex);
/* 释放信号量 */
osal_sem_release(g_event_queue.sem);
return 0;
}
/**
* @brief 从事件队列中获取事件
* @param event 事件指针,用于存储获取的事件
* @param timeout 超时时间单位ms
* @return 0 成功非0 失败
*/
int event_queue_pop(event_t *event, int timeout)
{
if (event == NULL)
{
return -1;
}
/* 等待信号量 */
if (osal_sem_take(g_event_queue.sem, timeout) != OSAL_OK)
{
return -1;
}
/* 加锁 */
if (osal_mutex_take(g_event_queue.mutex, OSAL_WAIT_FOREVER) != OSAL_OK)
{
osal_log_e("Failed to take event queue mutex");
return -1;
}
/* 检查队列是否为空 */
if (g_event_queue.count == 0)
{
osal_mutex_release(g_event_queue.mutex);
return -1;
}
/* 从队列中获取事件 */
*event = g_event_queue.events[g_event_queue.head];
g_event_queue.head = (g_event_queue.head + 1) % EVENT_QUEUE_SIZE;
g_event_queue.count--;
/* 解锁 */
osal_mutex_release(g_event_queue.mutex);
return 0;
}
/**
* @brief 获取事件队列中的事件数量
* @return 事件数量
*/
int event_queue_get_count(void)
{
int count;
/* 加锁 */
if (osal_mutex_take(g_event_queue.mutex, OSAL_WAIT_FOREVER) != OSAL_OK)
{
osal_log_e("Failed to take event queue mutex");
return -1;
}
count = g_event_queue.count;
/* 解锁 */
osal_mutex_release(g_event_queue.mutex);
return count;
}
/**
* @brief 清空事件队列
* @return 0 成功非0 失败
*/
int event_queue_clear(void)
{
/* 加锁 */
if (osal_mutex_take(g_event_queue.mutex, OSAL_WAIT_FOREVER) != OSAL_OK)
{
osal_log_e("Failed to take event queue mutex");
return -1;
}
/* 清空队列 */
g_event_queue.head = 0;
g_event_queue.tail = 0;
g_event_queue.count = 0;
/* 解锁 */
osal_mutex_release(g_event_queue.mutex);
return 0;
}