页面加载中,请稍候
来源:strongerHuang发布时间:2023-05-061373浏览
询问 AI作者 |NevermindZZT

简介
cpost是一个c语言编写的,用于c语言程序上下文切换和解耦的工具。
cpost包含cpost和cevent两个工具,cpost用于c语言的上下文切换,cevent用于程序模块之间的解耦。cpost借鉴了Android的Handler机制,在c语言环境中,可以通过调用cpost接口,将函数抛出到另外的线程(上下文)中运行,对于某些场景,尤其是嵌入式编程无操作系统环境下的中断延迟处理。cevent借鉴了Android的广播机制,在c语言环境中,当程序运行至相应的位置,可以通过cevent接口抛出一个事件,其他模块可以通过注册的方式,监听这个事件,当事件发生时,调用注册的函数,能很大程度上实现模块间的解耦。使用
cpost和cevent可以同时使用,也可以独立使用,特别针对于嵌入式无操作系统的环境,使用cpost和cevent,可以简化编程,更容易实现模块化的编程。以使用在嵌入式无操作系统中为例,主要用作中断延迟处理的情况
配置系统tick
配置cpost.h中的宏CPOST_GET_TICK(),配置成获取系统tick
配置处理进程
在main loop调用cpostProcess函数,通过cpost执行的函数都会在cpostProcess中执行
cevent使用注册的方式监听事件,会依赖于编译环境,目前支持keil,iar,和gcc,对于gcc,需要修改链接文件(.ld),在只读数据区添加:
_cevent_start = .;
KEEP (*(cEvent))
_cevent_end = .;
初始化cevent
系统初始化时,调用ceventInit
ceventInit();注册cevent事件监听
在c文件中,调用CEVENT_EXPORT导出事件监听
CEVENT_EXPORT(0, handler, (void *)param);发送cevent事件
在事件发生的地方,调用ceventPost抛出事件
ceventPost(0);API
cpost提供了简单的接口用于延迟处理函数,其接口设计和Android的Handler设计类似,cevnet提供了一个事件发送接口,用于抛出事件cpost提供一个统一接口cpost(...)进行事件抛出,此接口通过宏定义,需要在 c99 以上的标准运行
#define cpost(...) \
cpostAddHandler(((CpostParam){__VA_ARGS__}))参数
typedef struct
{
void *handler;
void *param;
size_t delay;
struct {
unsigned char flag : 2;
unsigned char paramDiff: 1;
} attrs;
} CpostParam;handler被抛出执行的函数
param传递给函数的参数
delay延迟时间
attrs.flag任务冲突时处理 flag
attrs.paramDiff比较任务时是否区分参数
...抛出的参数,用于构造CpostParam对象
event post接口会抛出事件,事件定义为一个unsigned short整形,建议通过宏定义所有事件
void ceventPost(unsigned short event);参数
event事件
event post接口会静态注册一个事件监听,注意,此接口实际上为定义一个全局的常量,所以需要写在函数体外
CEVENT_EXPORT(_event, _func, ...)参数
_event被监听的事件
_func事件发生时,执行的函数
...需要传递给_func函数的参数
声明:本文部分素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。


新闻来源:strongerHuang,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-06-03
2026-07-09