C语言——一个简单的事件处理循环

C语言——一个简单的事件处理循环,第1张

C语言——一个简单的事件处理循环 摘要

编写一个简单的事件处理循环,用于单片机裸机编程。考虑到中断函数中不可调用malloc,未采用动态内存分配的形式编写事件链表。

eventloop.h
#ifndef __EVENTLOOP_H__
#define __EVENTLOOP_H__

typedef enum {
    EventTypeNull,
    EventTypeHardIrp0,
    EventTypeHardIrp1,
    EventTypeTimer1,
    EventTypeTimer2,
    EventTypeTimer3,
}EventType;


int send_event(EventType type, void(*handle)(void *), void *param);


void event_loop_start(void);


int event_loop_init(int depth);

#endif

eventloop.c
#include "eventloop.h"
#include "stdlib.h"
#include "stdio.h"

typedef struct Event
{
    EventType type;
    void (*handle)(void *);
    void *param;
}Event_t;

typedef struct EventLoop
{
    Event_t *event;
    int depth;
    int ps;
    int pe;
}EventLoop_t;

static EventLoop_t loop;

int send_event(EventType type, void(*handle)(void *), void *param)
{
    int next = (loop.pe + 1) % loop.depth;
    if (next == loop.ps)
        return -1;//事件堆栈已满
    loop.event[loop.pe].type = type;
    loop.event[loop.pe].handle = handle;
    loop.event[loop.pe].param = param;
    loop.pe = next;
    return 0;
}

int event_loop_init(int depth)
{
    loop.event = malloc(sizeof(Event_t) * (depth + 1));
    if (loop.event == NULL)
        return -1;
    loop.depth = depth + 1;
    loop.ps = 0;
    loop.pe = 0;
    return 0;
}

void event_loop_start(void)
{
    while (1)
    {
        if (loop.ps != loop.pe)
        {
            loop.pe = loop.pe == 0 ? loop.depth - 1 : loop.pe - 1;
            loop.event[loop.pe].handle(loop.event[loop.pe].param);
        }
    }
    return;
}
test.c
#include "eventloop.h"
#include "stdio.h"

void hardirp_handle(void *param)
{
    printf("hardirp handle param == %dn", (int)param);
}

int main(void)
{
    int err = event_loop_init(10);
    int i;
    for (i = 0; i < 10; i++)
    {
        send_event(EventTypeHardIrp0, hardirp_handle, (void *)i);
    }
    event_loop_start();
    return 0;
}
代码说明

通过 event_loop_init 函数初始化模块内部封装的事件堆栈,然后在main函数中执行 event_loop_start 即可。test.c中模拟中断调用send_event函数将事件本身和事件处理函数发送到事件处理循环。

可修改 EventLoop_t 结构体和event_loop_start,send_event 函数,添加事件处理优先级属性,优先处理优先级高的事件。

可修改 EventLoop_t 结构体和event_loop_init,event_loop_start函数,增加事件处理等待方式为fifo模式或者优先级等待模式。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5713770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存