Files
arcs/arcs-sdk/components/work_queue/workqueue.c
2026-08-13 16:50:52 +08:00

86 lines
2.3 KiB
C

#include "workqueue.h"
#define TAG "workqueue"
#include "lisa_log.h"
// 工作队列任务函数
static void workqueue_task(void *pvParameters)
{
workqueue_t *workQueue = (workqueue_t *)pvParameters;
workqueue_item_t workItem;
for (;;) {
// 等待队列中的工作项
if (xQueueReceive(workQueue->queue, &workItem, portMAX_DELAY) == pdPASS) {
// 执行工作项
if (workItem.function != NULL) {
workItem.function(workItem.parameter);
}
}
}
}
// 创建工作队列
workqueue_t *workqueue_create(const char *name, int priority, uint16_t queueLength, uint16_t stackSize)
{
workqueue_t *workQueue = (workqueue_t *)pvPortMalloc(sizeof(workqueue_t));
if (workQueue == NULL) {
return NULL;
}
// 创建队列
workQueue->queue = xQueueCreate(queueLength, sizeof(workqueue_item_t));
if (workQueue->queue == NULL) {
vPortFree(workQueue);
return NULL;
}
// 创建任务
if (xTaskCreate(workqueue_task, name, stackSize, workQueue, priority, &workQueue->taskHandle) != pdPASS) {
vQueueDelete(workQueue->queue);
vPortFree(workQueue);
return NULL;
}
return workQueue;
}
// 创建工作队列
workqueue_t *workqueue_create_static(const char *name, int priority, uint16_t queueLength, void* stack,uint16_t stackSize)
{
workqueue_t *workQueue = (workqueue_t *)pvPortMalloc(sizeof(workqueue_t));
if (workQueue == NULL) {
return NULL;
}
// 创建队列
workQueue->queue = xQueueCreate(queueLength, sizeof(workqueue_item_t));
if (workQueue->queue == NULL) {
vPortFree(workQueue);
return NULL;
}
// 创建任务
workQueue->taskHandle = xTaskCreateStatic(workqueue_task, name, stackSize, workQueue, priority,stack, &workQueue->statictask);
if (workQueue->taskHandle == NULL) {
vQueueDelete(workQueue->queue);
vPortFree(workQueue);
return NULL;
}
return workQueue;
}
// 提交工作到工作队列
int workqueue_submit(workqueue_t *workQueue, void (*function)(void *), void *parameter)
{
if (workQueue == NULL || function == NULL) {
return -1;
}
workqueue_item_t workItem;
workItem.function = function;
workItem.parameter = parameter;
return xQueueSend(workQueue->queue, &workItem, 0);
}