Files
ETH_TCP_Demo/app/event_queue.c
2026-03-04 08:50:04 +08:00

204 lines
4.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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;
}