C语言作为一种面向过程的语言,在进行嵌入式项目开发时,如果不采用某种方法将其变相地转向面向对象的风格,项目在后期很难完成且维护困难。
今天我要向大家推荐一个用于C语言程序上下文切换和解耦的工具。
这个工具的源码可以在以下地址找到:
https://github.com/NevermindZZT/cpost
整个工具的源码并不太多,主要涉及4个文件:
具体源码就不一一描述了,大家可以直接下载,这里给大家介绍并描述下使用方法。
简介
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
函数的参数
-
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !