關注+星標公眾號,不錯過精彩內容

作者 |?NevermindZZT

簡介
cpost是一個c語言編寫的,用于c語言程序上下文切換和解耦的工具。
cpost包含cpost和cevent兩個工具,cpost用于c語言的上下文切換,cevent用于程序模塊之間的解耦。cpost借鑒了Android的Handler機制,在c語言環(huán)境中,可以通過調用cpost接口,將函數(shù)拋出到另外的線程(上下文)中運行,對于某些場景,尤其是嵌入式編程無操作系統(tǒng)環(huán)境下的中斷延遲處理。cevent借鑒了Android的廣播機制,在c語言環(huán)境中,當程序運行至相應的位置,可以通過cevent接口拋出一個事件,其他模塊可以通過注冊的方式,監(jiān)聽這個事件,當事件發(fā)生時,調用注冊的函數(shù),能很大程度上實現(xiàn)模塊間的解耦。使用
cpost和cevent可以同時使用,也可以獨立使用,特別針對于嵌入式無操作系統(tǒng)的環(huán)境,使用cpost和cevent,可以簡化編程,更容易實現(xiàn)模塊化的編程。以使用在嵌入式無操作系統(tǒng)中為例,主要用作中斷延遲處理的情況
配置系統(tǒng)tick
配置cpost.h中的宏CPOST_GET_TICK(),配置成獲取系統(tǒng)tick
配置處理進程
在main loop調用cpostProcess函數(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 = .;
初始化cevent
系統(tǒng)初始化時,調用ceventInit
ceventInit();注冊cevent事件監(jiān)聽
在c文件中,調用CEVENT_EXPORT導出事件監(jiān)聽
CEVENT_EXPORT(0, handler, (void *)param);發(fā)送cevent事件
在事件發(fā)生的地方,調用ceventPost拋出事件
ceventPost(0);API
cpost提供了簡單的接口用于延遲處理函數(shù),其接口設計和Android的Handler設計類似,cevnet提供了一個事件發(fā)送接口,用于拋出事件cpost?提供一個統(tǒng)一接口?cpost(...)?進行事件拋出,此接口通過宏定義,需要在 c99 以上的標準運行
#define cpost(...) \
cpostAddHandler(&((CpostParam){__VA_ARGS__}))參數(shù)
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?任務沖突時處理 flag
attrs.paramDiff?比較任務時是否區(qū)分參數(shù)
...?拋出的參數(shù),用于構造?CpostParam?對象
event post接口會拋出事件,事件定義為一個unsigned short整形,建議通過宏定義所有事件
void ceventPost(unsigned short event);參數(shù)
event?事件
event post接口會靜態(tài)注冊一個事件監(jiān)聽,注意,此接口實際上為定義一個全局的常量,所以需要寫在函數(shù)體外
CEVENT_EXPORT(_event, _func, ...)參數(shù)
_event?被監(jiān)聽的事件
_func?事件發(fā)生時,執(zhí)行的函數(shù)
...?需要傳遞給_func函數(shù)的參數(shù)
聲明:本文部分素材來源網(wǎng)絡,版權歸原作者所有。如涉及作品版權問題,請與我聯(lián)系刪除。
------------?END?------------

●專欄《嵌入式工具》
●專欄《嵌入式開發(fā)》
●專欄《Keil教程》
●嵌入式專欄精選教程
關注公眾號回復“加群”按規(guī)則加入技術交流群,回復“1024”查看更多內容。

