一个用于C语言程序上下文切换和解耦的工具

编程语言及工具

106人已加入

描述

C语言是一种面向过程的语言,做嵌入式项目的时候,如果不变相面向对象,项目到后期很难做好,且不容易维护。   今天就给大家推荐一个用于C语言程序上下文切换和解耦的工具。   源码地址: https://github.com/NevermindZZT/cpost   源码不多,主要就4个文件:

C语言

具体源码就不一一描述了,大家可以直接下载,这里给大家介绍并描述下使用方法。  

简介

cpost是一个c语言编写的,用于c语言程序上下文切换和解耦的工具。

cpost包含cpost和cevent两个工具,cpost用于c语言的上下文切换,cevent用于程序模块之间的解耦。 cpost借鉴了Android的Handler机制,在c语言环境中,可以通过调用cpost接口,将函数抛出到另外的线程(上下文)中运行,对于某些场景,尤其是嵌入式编程无操作系统环境下的中断延迟处理。 cevent借鉴了Android的广播机制,在c语言环境中,当程序运行至相应的位置,可以通过cevent接口抛出一个事件,其他模块可以通过注册的方式,监听这个事件,当事件发生时,调用注册的函数,能很大程度上实现模块间的解耦。

使用

cpost和cevent可以同时使用,也可以独立使用,特别针对于嵌入式无操作系统的环境,使用cpost和cevent,可以简化编程,更容易实现模块化的编程。

cpost使用

以使用在嵌入式无操作系统中为例,主要用作中断延迟处理的情况

配置系统tick

配置cpost.h中的宏CPOST_GET_TICK(),配置成获取系统tick

配置处理进程

在main loop调用cpostProcess函数,通过cpost执行的函数都会在cpostProcess中执行

cevent使用

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提供了一个事件发送接口,用于抛出事件

post

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

event post接口会抛出事件,事件定义为一个unsigned short整形,建议通过宏定义所有事件

 

void ceventPost(unsigned short event);

 

参数

event 事件

event export

event post接口会静态注册一个事件监听,注意,此接口实际上为定义一个全局的常量,所以需要写在函数体外

 

CEVENT_EXPORT(_event, _func, ...)

 

参数

_event 被监听的事件

_func 事件发生时,执行的函数

... 需要传递给_func函数的参数






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分