1、介紹
ToolKit是一套應(yīng)用于嵌入式系統(tǒng)的通用工具包,可靈活應(yīng)用到有無RTOS的程序中,采用C語言面向?qū)ο蟮乃悸穼?shí)現(xiàn)各個(gè)功能,盡可能最大化的復(fù)用代碼,目前為止工具包包含:循環(huán)隊(duì)列、軟件定時(shí)器、事件集。
??Queue?循環(huán)隊(duì)列
1. 支持動(dòng)態(tài)、靜態(tài)方式進(jìn)行隊(duì)列的創(chuàng)建與刪除。
2. 可獨(dú)立配置緩沖區(qū)大小。
3.?支持?jǐn)?shù)據(jù)最新保持功能,當(dāng)配置此模式并且緩沖區(qū)已滿,若有新的數(shù)據(jù)存入,將會(huì)移除最早數(shù)據(jù),并保持緩沖區(qū)已滿。
??Timer?軟件定時(shí)器
1. 支持動(dòng)態(tài)、靜態(tài)方式進(jìn)行定時(shí)器的創(chuàng)建與刪除。
2.?支持循環(huán)、單次模式。
3. 可配置有無超時(shí)回調(diào)函數(shù)。
4.?可配置定時(shí)器工作在周期或間隔模式。
5. 使用雙向鏈表,超時(shí)統(tǒng)一管理,不會(huì)因?yàn)樵黾佣〞r(shí)器而增加超時(shí)判斷代碼。
??Event?事件集
1. 支持動(dòng)態(tài)、靜態(tài)方式進(jìn)行事件集的創(chuàng)建與刪除。
2.?每個(gè)事件最大支持32個(gè)標(biāo)志位。
3.?事件的觸發(fā)可配置為“標(biāo)志與”和“標(biāo)志或”。
2 、文件目錄
toolkit ├──?include?????????????????????????//?包含文件目錄 |???├──?toolkit.h???????????????????//?toolkit頭文件 |???└──?toolkit_cfg.h???????????????//?toolkit配置文件 ├──?src?????????????????????????????//?toolkit源碼目錄 |???├──?tk_queue.c??????????????????//?循環(huán)隊(duì)列源碼 |???├──?tk_timer.c??????????????????//?軟件定時(shí)器源碼 |???└──?tk_event.c??????????????????//?事件集源碼 ├──?samples?????????????????????????//?例子 |???├──?tk_queue_samples.c??????????//?循環(huán)隊(duì)列使用例程源碼 |???├──?tk_timer_samples.c??????????//?軟件定時(shí)器使用例程源碼 |???└──?tk_event_samples.c??????????//?事件集使用例程源碼 └──?README.md???????????????????????//?說明文檔
3 、函數(shù)定義
3.1 配置文件
??ToolKit配置項(xiàng)
宏定義 | 描述 |
TOOLKIT_USING_ASSERT | ToolKit使用斷言功能 |
TOOLKIT_USING_QUEUE | ToolKit使用循環(huán)隊(duì)列功能 |
TOOLKIT_USING_TIMER | ToolKit使用軟件定時(shí)器功能 |
TOOLKIT_USING_EVENT | ToolKit使用事件集功能 |
??Queue 循環(huán)隊(duì)列配置項(xiàng)
宏定義 | 描述 |
TK_QUEUE_USING_CREATE | Queue 循環(huán)隊(duì)列使用動(dòng)態(tài)創(chuàng)建和刪除 |
??Timer 軟件定時(shí)器配置項(xiàng)
宏定義 | 描述 |
TK_TIMER_USING_CREATE | Timer 軟件定時(shí)器使用動(dòng)態(tài)創(chuàng)建和刪除 |
TK_TIMER_USING_INTERVAL | Timer 軟件定時(shí)器使用間隔模式 |
TK_TIMER_USING_TIMEOUT_CALLBACK | Timer 軟件定時(shí)器使用超時(shí)回調(diào)函數(shù) |
??Event 事件集配置項(xiàng)
宏定義 | 描述 |
TK_EVENT_USING_CREATE | Event 事件集使用動(dòng)態(tài)創(chuàng)建和刪除 |
說明:當(dāng)配置TOOLKIT_USING_ASSERT后,所有功能都將會(huì)啟動(dòng)參數(shù)檢查。
3.2 Queue 循環(huán)隊(duì)列API函數(shù)
以下為詳細(xì)API說明及簡要示例程序,綜合demo可查看tk_queue_samples.c示例。
3.2.1 動(dòng)態(tài)創(chuàng)建隊(duì)列
注意:當(dāng)配置TOOLKIT_USING_QUEUE后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
struct?tk_queue?*tk_queue_create(uint16_t?queue_size,?uint16_t?max_queues,?bool?keep_fresh);
參數(shù) | 描述 |
queue_size | 緩存區(qū)大小(單位字節(jié)) |
max_queues | 最大隊(duì)列個(gè)數(shù) |
keep_fresh | 是否為保持最新模式,true:保持最新;false:默認(rèn)(存滿不能再存) |
返回值 | 創(chuàng)建的隊(duì)列對象(NULL為創(chuàng)建失?。?/td> |
隊(duì)列創(chuàng)建示例:
int?main(int?argc,?char?*argv[]) { ????/*?動(dòng)態(tài)方式創(chuàng)建一個(gè)循環(huán)隊(duì)"queue",緩沖區(qū)大小50字節(jié),不保持最新?*/ ????struct?tk_queue?*queue?=?tk_queue_create(50,?1,?false); ????if(?queue?==?NULL){ ????????printf("隊(duì)列創(chuàng)建失敗! "); ????} ????/*?...?*/ ????/*?You?can?add?your?code?under?here.?*/ ????return?0; }
3.2.2?動(dòng)態(tài)刪除隊(duì)列
注意:當(dāng)配置TOOLKIT_USING_QUEUE后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動(dòng)態(tài)方式創(chuàng)建的隊(duì)列對象。
bool?tk_queue_delete(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要?jiǎng)h除的隊(duì)列對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.2.3?靜態(tài)初始化隊(duì)列
bool?tk_queue_init(struct?tk_queue?*queue,?void?*queuepool,?uint16_t?pool_size,?uint16_t?queue_size,?bool?keep_fresh);
參數(shù) | 描述 |
queue | 要初始化的隊(duì)列對象 |
*queuepool | 隊(duì)列緩存區(qū) |
pool_size | 緩存區(qū)大小(單位字節(jié)) |
queue_size | 隊(duì)列元素大小(單位字節(jié)) |
keep_fresh | 是否為保持最新模式,true:保持最新;false:默認(rèn)(存滿不能再存) |
返回值 | true:初始化成功;false:初始化失敗 |
隊(duì)列創(chuàng)建示例:
int?main(int?argc,?char?*argv[]) { ????/*?定義一個(gè)循環(huán)隊(duì)列?*/ ????struct?tk_queue?queue; ????/*?定義循環(huán)隊(duì)列緩沖區(qū)?*/ ????uint8_t?queue_pool[100]; ????/*?靜態(tài)方式創(chuàng)建一個(gè)循環(huán)隊(duì)列"queue",緩存區(qū)為queue_pool,大小為queue_pool的大小,模式為保持最新?*/ ????if(?tk_queue_init(&queue,?queue_pool,?sizeof(queue_pool),? ??????????????????????sizeof(queue_pool[0]),?true)?==?false){ ????????printf("隊(duì)列創(chuàng)建失敗! "); ????} ????/*?...?*/ ????/*?You?can?add?your?code?under?here.?*/ }
3.2.4 靜態(tài)脫離隊(duì)列
注意: 會(huì)使緩存區(qū)脫離與隊(duì)列的關(guān)聯(lián)。必須為靜態(tài)方式創(chuàng)建的隊(duì)列對象。
bool?tk_queue_detach(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要脫離的隊(duì)列對象 |
返回值 | true:脫離成功;false:脫離失敗 |
3.2.5 清空隊(duì)列
bool?tk_queue_clean(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要清空的隊(duì)列對象 |
返回值 | true:清除成功;false:清除失敗 |
3.2.6 判斷隊(duì)列是否為空
bool?tk_queue_empty(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要查詢的隊(duì)列對象 |
返回值 | true:空;false:不為空 |
3.2.7 判斷隊(duì)列是否已滿
bool?tk_queue_full(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要查詢的隊(duì)列對象 |
返回值 | true:滿;false:不為滿 |
3.2.8 從隊(duì)列中讀取一個(gè)元素(不從隊(duì)列中刪除)
bool?tk_queue_peep(struct?tk_queue?*queue,?void?*pval);
參數(shù) | 描述 |
queue | 隊(duì)列對象 |
*pval | 讀取值地址 |
返回值 | true:讀取成功;false:讀取失敗 |
3.2.9 移除一個(gè)元素
bool?tk_queue_remove(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要移除元素的對象 |
返回值 | true:移除成功;false:移除失敗 |
3.2.10 向隊(duì)列壓入(入隊(duì))1個(gè)元素?cái)?shù)據(jù)
bool?tk_queue_push(struct?tk_queue?*queue,?void?*val);
參數(shù) | 描述 |
queue | 要壓入的隊(duì)列對象 |
*val | 壓入值 |
返回值 | true:成功;false:失敗 |
3.2.11 從隊(duì)列彈出(出隊(duì))1個(gè)元素?cái)?shù)據(jù)
bool?tk_queue_pop(struct?tk_queue?*queue,?void?*pval);
參數(shù) | 描述 |
queue | 要彈出的隊(duì)列對象 |
*pval | 彈出值 |
返回值 | true:成功;false:失敗 |
3.2.12 查詢隊(duì)列當(dāng)前數(shù)據(jù)長度
uint16_t?tk_queue_curr_len(struct?tk_queue?*queue);
參數(shù) | 描述 |
queue | 要查詢的隊(duì)列對象 |
返回值 | 隊(duì)列數(shù)據(jù)當(dāng)前長度 |
3.2.13 向隊(duì)列壓入(入隊(duì))多個(gè)元素?cái)?shù)據(jù)
uint16_t?tk_queue_push_multi(struct?tk_queue?*queue,?void?*pval,?uint16_t?len);
參數(shù) | 描述 |
queue | 要壓入的隊(duì)列對象 |
*pval | 壓入數(shù)據(jù)首地址 |
len | 壓入元素個(gè)數(shù) |
返回值 | 實(shí)際壓入個(gè)數(shù) |
3.2.14 從隊(duì)列彈出(出隊(duì))多個(gè)元素?cái)?shù)據(jù)
uint16_t?tk_queue_pop_multi(struct?tk_queue?*queue,?void?*pval,?uint16_t?len);
參數(shù) | 描述 |
queue | 要彈出的隊(duì)列對象 |
*pval | 存放彈出數(shù)據(jù)的首地址 |
len | 希望彈出的數(shù)據(jù)個(gè)數(shù) |
返回值 | 實(shí)際彈出個(gè)數(shù) |
3.3 Timer 軟件定時(shí)器API函數(shù)
以下為詳細(xì)API說明及簡要示例程序,綜合demo可查看tk_timer_samples.c示例。
3.3.1 軟件定時(shí)器功能初始化
注意:此函數(shù)在使用定時(shí)器功能最初調(diào)用,目的是創(chuàng)建定時(shí)器列表頭結(jié)點(diǎn),和配置tick獲取回調(diào)函數(shù)。
bool?tk_timer_func_init(uint32_t?(*get_tick_func)(void));
參數(shù) | 描述 |
get_tick_func | 獲取系統(tǒng)tick回調(diào)函數(shù) |
返回值 | true:初始化成功;false:初始化失敗 |
3.3.2 動(dòng)態(tài)創(chuàng)建定時(shí)器
注意:當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
struct?tk_timer?*tk_timer_create(void(*timeout_callback)(struct?tk_timer?*timer));
參數(shù) | 描述 |
timeout_callback | 定時(shí)器超時(shí)回調(diào)函數(shù),不使用可配置為NULL |
返回值 | 創(chuàng)建的定時(shí)器對象(NULL為創(chuàng)建失敗) |
定時(shí)器創(chuàng)建示例::
/*?定義獲取系統(tǒng)tick回調(diào)函數(shù)?*/ uint32_t?get_sys_tick(void) { ????return?tick; } /*?定時(shí)器超時(shí)回調(diào)函數(shù)?*/ void?timer_timeout_callback(struct?tk_timer?*timer) { ????printf("timeout_callback:?timer?timeout:%ld ",?get_sys_tick()); } int?main(int?argc,?char?*argv[]) { ????/*?初始化軟件定時(shí)器功能,并配置tick獲取回調(diào)函數(shù)*/ ????tk_timer_func_init(get_sys_tick); ???? ????/*?定義定時(shí)器指針?*/ ????tk_timer_t?timer?=?NULL; ????/*?動(dòng)態(tài)方式創(chuàng)建timer,并配置定時(shí)器超時(shí)回調(diào)函數(shù)?*/ ????timer?=?tk_timer_create((tk_timer_timeout_callback?*)timer_timeout_callback); ????if?(timer?==?NULL) ????{ ????????printf("定時(shí)器創(chuàng)建失敗! "); ????????return?0; ????} ????/*?...?*/ ????/*?You?can?add?your?code?under?here.?*/ ????return?0; }
3.3.3 動(dòng)態(tài)刪除定時(shí)器
當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動(dòng)態(tài)方式創(chuàng)建的定時(shí)器對象。
bool?tk_timer_delete(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要?jiǎng)h除的定時(shí)器對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.3.4 靜態(tài)初始化定時(shí)器
bool?tk_timer_init(struct?tk_timer?*timer,?void?(*timeout_callback)(struct?tk_timer?*timer));
參數(shù) | 描述 |
timer | 要初始化的定時(shí)器對象 |
timeout_callback | 定時(shí)器超時(shí)回調(diào)函數(shù),不使用可配置為NULL |
返回值 | true:創(chuàng)建成功;false:創(chuàng)建失敗 |
隊(duì)列創(chuàng)建示例:
/*?定義獲取系統(tǒng)tick回調(diào)函數(shù)?*/ uint32_t?get_sys_tick(void) { ????return?tick; } /*?定時(shí)器超時(shí)回調(diào)函數(shù)?*/ void?timer_timeout_callback(struct?tk_timer?*timer) { ????printf("timeout_callback:?timer?timeout:%ld ",?get_sys_tick()); } int?main(int?argc,?char?*argv[]) { ????/*?定義定時(shí)器timer?*/ ????struct?tk_timer?timer; ????bool?result?=?tk_timer_init(?&timer,(tk_timer_timeout_callback?*)timer_timeout_callback); ????if?(result?==?NULL) ????{ ????????printf("定時(shí)器創(chuàng)建失敗! "); ????????return?0; ????} ????/*?...?*/ ????/*?You?can?add?your?code?under?here.?*/ ????return?0; }
3.3.5 靜態(tài)脫離定時(shí)器
注意: 會(huì)將timer從定時(shí)器鏈表中移除。必須為靜態(tài)方式創(chuàng)建的定時(shí)器對象。
bool?tk_timer_detach(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要脫離的定時(shí)器對象 |
返回值 | true:脫離成功;false:脫離失敗 |
3.3.6 定時(shí)器啟動(dòng)
bool?tk_timer_start(struct?tk_timer?*timer,?tk_timer_mode?mode,?uint32_t?delay_tick);
參數(shù) | 描述 |
timer | 要啟動(dòng)的定時(shí)器對象 |
mode | 工作模式,單次:?TIMER_MODE_SINGLE;循環(huán):?TIMER_MODE_LOOP |
delay_tick | 定時(shí)器時(shí)長(單位tick) |
返回值 | true:啟動(dòng)成功;false:啟動(dòng)失敗 |
3.3.7 定時(shí)器停止
bool?tk_timer_stop(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要停止的定時(shí)器對象 |
返回值 | true:停止成功;false:停止失敗 |
3.3.8 定時(shí)器繼續(xù)
bool?tk_timer_continue(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要繼續(xù)的定時(shí)器對象 |
返回值 | true:繼續(xù)成功;false:繼續(xù)失敗 |
3.3.9 定時(shí)器重啟
注意:重啟時(shí)長為最后一次啟動(dòng)定時(shí)器時(shí)配置的時(shí)長。
bool?tk_timer_restart(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要重啟的定時(shí)器對象 |
返回值 | true:重啟成功;false:重啟失敗 |
3.3.10 獲取定時(shí)器模式
tk_timer_mode?tk_timer_get_mode(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要獲取的定時(shí)器對象 |
返回值 | 定時(shí)器模式 |
定時(shí)器模式 | 描述 |
TIMER_MODE_SINGLE | 單次模式 |
TIMER_MODE_LOOP | 循環(huán)模式 |
3.3.11 獲取定時(shí)器狀態(tài)
tk_timer_state?tk_timer_get_state(struct?tk_timer?*timer);
參數(shù) | 描述 |
timer | 要獲取的定時(shí)器對象 |
返回值 | 定時(shí)器狀態(tài) |
定時(shí)器模式 | 描述 |
TIMER_STATE_RUNNING | 運(yùn)行狀態(tài) |
TIMER_STATE_STOP | 停止?fàn)顟B(tài) |
TIMER_STATE_TIMEOUT | 超時(shí)狀態(tài) |
3.3.12 定時(shí)器處理
bool?tk_timer_loop_handler(void);
參數(shù) | 描述 |
返回值 | true:正常;false:異常,在調(diào)用此函數(shù)前,未初始化定時(shí)器功能“tk_timer_func_init” |
注意:tk_timer_loop_handler函數(shù)要不斷的循環(huán)調(diào)用。
3.3.13 超時(shí)回調(diào)函數(shù)
函數(shù)原型:
typedef?void?(*timeout_callback)(struct?tk_timer?*timer);
說明:超時(shí)回調(diào)函數(shù)可定義多個(gè),即一個(gè)定時(shí)器對應(yīng)一個(gè)回調(diào)函數(shù),也可多個(gè)定時(shí)器對應(yīng)一個(gè)回調(diào)函數(shù)。
一對一
/*?定義兩個(gè)回調(diào)函數(shù),對應(yīng)定時(shí)器timer1和timer2?*/ void?timer1_timeout_callback(struct?tk_timer?*timer){ ????printf("定時(shí)器1超時(shí)! "); } void?timer2_timeout_callback(struct?tk_timer?*timer){ ????printf("定時(shí)器2超時(shí)! "); } /*?創(chuàng)建兩個(gè)定時(shí)器,配置單獨(dú)超時(shí)回調(diào)函數(shù)?*/ timer1?=?tk_timer_create((timeout_callback?*)timer1_timeout_callback); timer2?=?tk_timer_create((timeout_callback?*)timer2_timeout_callback);
多對一
/*?定時(shí)器timer1和timer2共用一個(gè)回調(diào)函數(shù),在回調(diào)函數(shù)做區(qū)分?*/ void?timer_timeout_callback(struct?tk_timer?*timer){ ????if?(timer?==?timer1) ????????printf("定時(shí)器1超時(shí)! "); ????else?if?(timer?==?timer2) ????????printf("定時(shí)器2超時(shí)! "); } /*?創(chuàng)建兩個(gè)定時(shí)器,使用相同的超時(shí)回調(diào)函數(shù)?*/ timer1?=?tk_timer_create((timeout_callback?*)timer_timeout_callback); timer2?=?tk_timer_create((timeout_callback?*)timer_timeout_callback);
3.4 Event 事件集API函數(shù)
以下為詳細(xì)API說明及簡要示例程序,綜合demo可查看tk_event_samples.c示例。
3.4.1 動(dòng)態(tài)創(chuàng)建一個(gè)事件
注意:當(dāng)配置TOOLKIT_USING_EVENT后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
struct?tk_event?*tk_event_create(void);
參數(shù) | 描述 |
返回值 | 創(chuàng)建的事件對象(NULL為創(chuàng)建失敗) |
3.4.2 動(dòng)態(tài)刪除一個(gè)事件
當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動(dòng)態(tài)方式創(chuàng)建的事件對象。
bool?tk_event_delete(struct?tk_event?*event);
參數(shù) | 描述 |
event | 要?jiǎng)h除的事件對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.4.3 靜態(tài)初始化一個(gè)事件
bool?tk_event_init(struct?tk_event?*event);
參數(shù) | 描述 |
event | 要初始化的事件對象 |
返回值 | true:創(chuàng)建成功;false:創(chuàng)建失敗 |
3.4.4 發(fā)送事件標(biāo)志
bool?tk_event_send(struct?tk_event?*event,?uint32_t?event_set);
參數(shù) | 描述 |
event | 發(fā)送目標(biāo)事件對象 |
event_set | 事件標(biāo)志,每個(gè)標(biāo)志占1Bit,發(fā)送多個(gè)標(biāo)志可“|” |
返回值 | true:發(fā)送成功;false:發(fā)送失敗 |
3.4.5 接收事件
bool?tk_event_recv(struct?tk_event?*event,?uint32_t?event_set,?uint8_t?option,?uint32_t?*recved);
參數(shù) | 描述 |
event | 接收目標(biāo)事件對象 |
event_set | 感興趣的標(biāo)志,每個(gè)標(biāo)志占1Bit,多個(gè)標(biāo)志可“|” |
option | 操作,標(biāo)志與:TK_EVENT_OPTION_AND;?標(biāo)志或:TK_EVENT_OPTION_OR;?清除標(biāo)志:TK_EVENT_OPTION_CLEAR |
返回值 | true:發(fā)送成功;false:發(fā)送失敗 |
編輯:黃飛
?
評論
查看更多