

簡介
cpost包含cpost和cevent兩個工具,cpost用于c語言的上下文切換,cevent用于程序模塊之間的解耦。cpost借鑒了Android的Handler機(jī)制,在c語言環(huán)境中,可以通過調(diào)用cpost接口,將函數(shù)拋出到另外的線程(上下文)中運(yùn)行,對于某些場景,尤其是嵌入式編程無操作系統(tǒng)環(huán)境下的中斷延遲處理。cevent借鑒了Android的廣播機(jī)制,在c語言環(huán)境中,當(dāng)程序運(yùn)行至相應(yīng)的位置,可以通過cevent接口拋出一個事件,其他模塊可以通過注冊的方式,監(jiān)聽這個事件,當(dāng)事件發(fā)生時,調(diào)用注冊的函數(shù),能很大程度上實(shí)現(xiàn)模塊間的解耦。使用
cpost和cevent可以同時使用,也可以獨(dú)立使用,特別針對于嵌入式無操作系統(tǒng)的環(huán)境,使用cpost和cevent,可以簡化編程,更容易實(shí)現(xiàn)模塊化的編程。cpost.h中的宏CPOST_GET_TICK(),配置成獲取系統(tǒng)tickcpostProcess函數(shù),通過cpost執(zhí)行的函數(shù)都會在cpostProcess中執(zhí)行cevent使用注冊的方式監(jiān)聽事件,會依賴于編譯環(huán)境,目前支持keil,iar,和gcc,對于gcc,需要修改鏈接文件(.ld),在只讀數(shù)據(jù)區(qū)添加:_cevent_start = .;
KEEP (*(cEvent))
_cevent_end = .;
ceventInitceventInit();
CEVENT_EXPORT導(dǎo)出事件監(jiān)聽CEVENT_EXPORT(0, handler, (void *)param);
ceventPost拋出事件ceventPost(0);
API
cpost提供了簡單的接口用于延遲處理函數(shù),其接口設(shè)計和Android的Handler設(shè)計類似,cevnet提供了一個事件發(fā)送接口,用于拋出事件cpost?提供一個統(tǒng)一接口?cpost(...)?進(jìn)行事件拋出,此接口通過宏定義,需要在 c99 以上的標(biāo)準(zhǔn)運(yùn)行#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?被拋出執(zhí)行的函數(shù)param?傳遞給函數(shù)的參數(shù)delay?延遲時間attrs.flag?任務(wù)沖突時處理 flagattrs.paramDiff?比較任務(wù)時是否區(qū)分參數(shù)...?拋出的參數(shù),用于構(gòu)造?CpostParam?對象unsigned short整形,建議通過宏定義所有事件void ceventPost(unsigned short event);
event?事件CEVENT_EXPORT(_event, _func, ...)
_event?被監(jiān)聽的事件_func?事件發(fā)生時,執(zhí)行的函數(shù)...?需要傳遞給_func函數(shù)的參數(shù)

