vesperW · 1 天前

分享一个嵌入式代码上下文切换和解耦的工具

C 语言是一种面向过程的语言,做嵌入式项目的时候,如果不变相面向对象,项目到后期很难做好,且不容易维护。

今天就给大家推荐一个用于 C 语言程序上下文切换和解耦的工具。

源码地址:

https://github.com/NevermindZZT/cpost

源码不多,主要就 4 个文件:

image.png

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

简介

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__}))

参数

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函数的参数

END

作者:NevermindZZT
来源:strongerHuang

推荐阅读

欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
2896
内容数
302
分享一些在嵌入式应用开发方面的浅见,广交朋友
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息