良许Linux教程网 干货合集 嵌入式程序上下文切换和解耦的工具

嵌入式程序上下文切换和解耦的工具

C语言作为一种面向过程的语言,在进行嵌入式项目开发时,如果不采用某种方法将其变相地转向面向对象的风格,项目在后期很难完成且维护困难。

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

这个工具的源码可以在以下地址找到:

https://github.com/NevermindZZT/cpost

整个工具的源码并不太多,主要涉及4个文件:

image-20231030222011860
image-20231030222011860

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

简介

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部