Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ywf123/cpost

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

16 Commits

Repository files navigation

cpost

c语言程序上下文切换和解耦的工具

简介

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

cpost包含cpostcevent两个工具,cpost用于c语言的上下文切换,cevent用于程序模块之间的解耦

cpost借鉴了Android的Handler机制,在c语言环境中,可以通过调用cpost接口,将函数抛出到另外的线程(上下文)中运行,对于某些场景,尤其是嵌入式编程无操作系统环境下的中断延迟处理

cevent借鉴了Android的广播机制,在c语言环境中,当程序运行至相应的位置,可以通过cevent接口抛出一个事件,其他模块可以通过注册的方式,监听这个事件,当事件发生时,调用注册的函数,能很大程度上实现模块间的解耦

使用

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

cpost使用

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

  1. 配置系统tick

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

  2. 配置处理进程

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

cevent使用

cevent使用注册的方式监听事件,会依赖于编译环境,目前支持keil,iar,和gcc,对于gcc,需要修改链接文件(.ld),在只读数据区添加:

_cevent_start = .;
KEEP (*(cEvent))
_cevent_end = .;
  1. 初始化cevent

    系统初始化时,调用ceventInit

    ceventInit();
  2. 注册cevent事件监听

    在c文件中,调用CEVENT_EXPORT导出事件监听

    CEVENT_EXPORT(0, handler, (void *)param);
  3. 发送cevent事件

    在事件发生的地方,调用ceventPost抛出事件

    ceventPost(0);

Api

cpost提供了简单的接口用于延迟处理函数,其接口设计和Android的Handler设计类似,cevnet提供了一个事件发送接口,用于抛出事件

post

cpost 提供一个统一接口 cpost(...) 进行事件抛出,此接口通过宏定义,需要在 c99 以上的标准运行

#define cpost(...) \
 cpostAddHandler(&((CpostParam){__VA_ARGS__}))
  • 参数

    • ... 抛出的参数,用于构造 CpostParam 对象
    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 比较任务时是否区分参数

event post

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

void ceventPost(unsigned short event);
  • 参数

    • event 事件

event export

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

CEVENT_EXPORT(_event, _func, ...)
  • 参数

    • _event 被监听的事件
    • _func 事件发生时,执行的函数
    • ... 需要传递给_func函数的参数

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 100.0%

AltStyle によって変換されたページ (->オリジナル) /