來源 | Github
1、介紹
ToolKit是一套應(yīng)用于嵌入式系統(tǒng)的通用工具包,可靈活應(yīng)用到有無RTOS的程序中,采用C語言面向?qū)ο蟮乃悸穼崿F(xiàn)各個功能,盡可能最大化的復(fù)用代碼,目前為止工具包包含:循環(huán)隊列、軟件定時器、事件集。
?Queue循環(huán)隊列
1. 支持動態(tài)、靜態(tài)方式進行隊列的創(chuàng)建與刪除。
2. 可獨立配置緩沖區(qū)大小。
3.支持數(shù)據(jù)最新保持功能,當(dāng)配置此模式并且緩沖區(qū)已滿,若有新的數(shù)據(jù)存入,將會移除最早數(shù)據(jù),并保持緩沖區(qū)已滿。
?Timer軟件定時器
1. 支持動態(tài)、靜態(tài)方式進行定時器的創(chuàng)建與刪除。
2.支持循環(huán)、單次模式。
3. 可配置有無超時回調(diào)函數(shù)。
4.可配置定時器工作在周期或間隔模式。
5. 使用雙向鏈表,超時統(tǒng)一管理,不會因為增加定時器而增加超時判斷代碼。
?Event事件集
1. 支持動態(tài)、靜態(tài)方式進行事件集的創(chuàng)建與刪除。
2.每個事件最大支持32個標志位。
3.事件的觸發(fā)可配置為“標志與”和“標志或”。
2 、文件目錄
toolkit ├──include//包含文件目錄 |├──toolkit.h//toolkit頭文件 |└──toolkit_cfg.h//toolkit配置文件 ├──src//toolkit源碼目錄 |├──tk_queue.c//循環(huán)隊列源碼 |├──tk_timer.c//軟件定時器源碼 |└──tk_event.c//事件集源碼 ├──samples//例子 |├──tk_queue_samples.c//循環(huán)隊列使用例程源碼 |├──tk_timer_samples.c//軟件定時器使用例程源碼 |└──tk_event_samples.c//事件集使用例程源碼 └──README.md//說明文檔
3 、函數(shù)定義
3.1 配置文件
?ToolKit配置項
宏定義 | 描述 |
TOOLKIT_USING_ASSERT | ToolKit使用斷言功能 |
TOOLKIT_USING_QUEUE | ToolKit使用循環(huán)隊列功能 |
TOOLKIT_USING_TIMER | ToolKit使用軟件定時器功能 |
TOOLKIT_USING_EVENT | ToolKit使用事件集功能 |
?Queue 循環(huán)隊列配置項
宏定義 | 描述 |
TK_QUEUE_USING_CREATE | Queue 循環(huán)隊列使用動態(tài)創(chuàng)建和刪除 |
?Timer 軟件定時器配置項
宏定義 | 描述 |
TK_TIMER_USING_CREATE | Timer 軟件定時器使用動態(tài)創(chuàng)建和刪除 |
TK_TIMER_USING_INTERVAL | Timer 軟件定時器使用間隔模式 |
TK_TIMER_USING_TIMEOUT_CALLBACK | Timer 軟件定時器使用超時回調(diào)函數(shù) |
?Event 事件集配置項
宏定義 | 描述 |
TK_EVENT_USING_CREATE | Event 事件集使用動態(tài)創(chuàng)建和刪除 |
說明:當(dāng)配置TOOLKIT_USING_ASSERT后,所有功能都將會啟動參數(shù)檢查。
3.2 Queue 循環(huán)隊列API函數(shù)
以下為詳細API說明及簡要示例程序,綜合demo可查看tk_queue_samples.c示例。
3.2.1 動態(tài)創(chuàng)建隊列
注意:當(dāng)配置TOOLKIT_USING_QUEUE后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
structtk_queue*tk_queue_create(uint16_tqueue_size,uint16_tmax_queues,boolkeep_fresh);
參數(shù) | 描述 |
queue_size | 緩存區(qū)大小(單位字節(jié)) |
max_queues | 最大隊列個數(shù) |
keep_fresh | 是否為保持最新模式,true:保持最新;false:默認(存滿不能再存) |
返回值 | 創(chuàng)建的隊列對象(NULL為創(chuàng)建失敗) |
隊列創(chuàng)建示例:
intmain(intargc,char*argv[]) { /*動態(tài)方式創(chuàng)建一個循環(huán)隊"queue",緩沖區(qū)大小50字節(jié),不保持最新*/ structtk_queue*queue=tk_queue_create(50,1,false); if(queue==NULL){ printf("隊列創(chuàng)建失敗! "); } /*...*/ /*Youcanaddyourcodeunderhere.*/ return0; }
3.2.2動態(tài)刪除隊列
注意:當(dāng)配置TOOLKIT_USING_QUEUE后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的隊列對象。
booltk_queue_delete(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要刪除的隊列對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.2.3靜態(tài)初始化隊列
booltk_queue_init(structtk_queue*queue,void*queuepool,uint16_tpool_size,uint16_tqueue_size,boolkeep_fresh);
參數(shù) | 描述 |
queue | 要初始化的隊列對象 |
*queuepool | 隊列緩存區(qū) |
pool_size | 緩存區(qū)大小(單位字節(jié)) |
queue_size | 隊列元素大小(單位字節(jié)) |
keep_fresh | 是否為保持最新模式,true:保持最新;false:默認(存滿不能再存) |
返回值 | true:初始化成功;false:初始化失敗 |
隊列創(chuàng)建示例:
intmain(intargc,char*argv[]) { /*定義一個循環(huán)隊列*/ structtk_queuequeue; /*定義循環(huán)隊列緩沖區(qū)*/ uint8_tqueue_pool[100]; /*靜態(tài)方式創(chuàng)建一個循環(huán)隊列"queue",緩存區(qū)為queue_pool,大小為queue_pool的大小,模式為保持最新*/ if(tk_queue_init(&queue,queue_pool,sizeof(queue_pool), sizeof(queue_pool[0]),true)==false){ printf("隊列創(chuàng)建失敗! "); } /*...*/ /*Youcanaddyourcodeunderhere.*/ }
3.2.4 靜態(tài)脫離隊列
注意: 會使緩存區(qū)脫離與隊列的關(guān)聯(lián)。必須為靜態(tài)方式創(chuàng)建的隊列對象。
booltk_queue_detach(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要脫離的隊列對象 |
返回值 | true:脫離成功;false:脫離失敗 |
3.2.5 清空隊列
booltk_queue_clean(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要清空的隊列對象 |
返回值 | true:清除成功;false:清除失敗 |
3.2.6 判斷隊列是否為空
booltk_queue_empty(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要查詢的隊列對象 |
返回值 | true:空;false:不為空 |
3.2.7 判斷隊列是否已滿
booltk_queue_full(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要查詢的隊列對象 |
返回值 | true:滿;false:不為滿 |
3.2.8 從隊列中讀取一個元素(不從隊列中刪除)
booltk_queue_peep(structtk_queue*queue,void*pval);
參數(shù) | 描述 |
queue | 隊列對象 |
*pval | 讀取值地址 |
返回值 | true:讀取成功;false:讀取失敗 |
3.2.9 移除一個元素
booltk_queue_remove(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要移除元素的對象 |
返回值 | true:移除成功;false:移除失敗 |
3.2.10 向隊列壓入(入隊)1個元素數(shù)據(jù)
booltk_queue_push(structtk_queue*queue,void*val);
參數(shù) | 描述 |
queue | 要壓入的隊列對象 |
*val | 壓入值 |
返回值 | true:成功;false:失敗 |
3.2.11 從隊列彈出(出隊)1個元素數(shù)據(jù)
booltk_queue_pop(structtk_queue*queue,void*pval);
參數(shù) | 描述 |
queue | 要彈出的隊列對象 |
*pval | 彈出值 |
返回值 | true:成功;false:失敗 |
3.2.12 查詢隊列當(dāng)前數(shù)據(jù)長度
uint16_ttk_queue_curr_len(structtk_queue*queue);
參數(shù) | 描述 |
queue | 要查詢的隊列對象 |
返回值 | 隊列數(shù)據(jù)當(dāng)前長度 |
3.2.13 向隊列壓入(入隊)多個元素數(shù)據(jù)
uint16_ttk_queue_push_multi(structtk_queue*queue,void*pval,uint16_tlen);
參數(shù) | 描述 |
queue | 要壓入的隊列對象 |
*pval | 壓入數(shù)據(jù)首地址 |
len | 壓入元素個數(shù) |
返回值 | 實際壓入個數(shù) |
3.2.14 從隊列彈出(出隊)多個元素數(shù)據(jù)
uint16_ttk_queue_pop_multi(structtk_queue*queue,void*pval,uint16_tlen);
參數(shù) | 描述 |
queue | 要彈出的隊列對象 |
*pval | 存放彈出數(shù)據(jù)的首地址 |
len | 希望彈出的數(shù)據(jù)個數(shù) |
返回值 | 實際彈出個數(shù) |
3.3 Timer 軟件定時器API函數(shù)
以下為詳細API說明及簡要示例程序,綜合demo可查看tk_timer_samples.c示例。
3.3.1 軟件定時器功能初始化
注意:此函數(shù)在使用定時器功能最初調(diào)用,目的是創(chuàng)建定時器列表頭結(jié)點,和配置tick獲取回調(diào)函數(shù)。
booltk_timer_func_init(uint32_t(*get_tick_func)(void));
參數(shù) | 描述 |
get_tick_func | 獲取系統(tǒng)tick回調(diào)函數(shù) |
返回值 | true:初始化成功;false:初始化失敗 |
3.3.2 動態(tài)創(chuàng)建定時器
注意:當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
structtk_timer*tk_timer_create(void(*timeout_callback)(structtk_timer*timer));
參數(shù) | 描述 |
timeout_callback | 定時器超時回調(diào)函數(shù),不使用可配置為NULL |
返回值 | 創(chuàng)建的定時器對象(NULL為創(chuàng)建失敗) |
定時器創(chuàng)建示例::
/*定義獲取系統(tǒng)tick回調(diào)函數(shù)*/ uint32_tget_sys_tick(void) { returntick; } /*定時器超時回調(diào)函數(shù)*/ voidtimer_timeout_callback(structtk_timer*timer) { printf("timeout_callback:timertimeout:%ld ",get_sys_tick()); } intmain(intargc,char*argv[]) { /*初始化軟件定時器功能,并配置tick獲取回調(diào)函數(shù)*/ tk_timer_func_init(get_sys_tick); /*定義定時器指針*/ tk_timer_ttimer=NULL; /*動態(tài)方式創(chuàng)建timer,并配置定時器超時回調(diào)函數(shù)*/ timer=tk_timer_create((tk_timer_timeout_callback*)timer_timeout_callback); if(timer==NULL) { printf("定時器創(chuàng)建失敗! "); return0; } /*...*/ /*Youcanaddyourcodeunderhere.*/ return0; }
3.3.3 動態(tài)刪除定時器
當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的定時器對象。
booltk_timer_delete(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要刪除的定時器對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.3.4 靜態(tài)初始化定時器
booltk_timer_init(structtk_timer*timer,void(*timeout_callback)(structtk_timer*timer));
參數(shù) | 描述 |
timer | 要初始化的定時器對象 |
timeout_callback | 定時器超時回調(diào)函數(shù),不使用可配置為NULL |
返回值 | true:創(chuàng)建成功;false:創(chuàng)建失敗 |
隊列創(chuàng)建示例:
/*定義獲取系統(tǒng)tick回調(diào)函數(shù)*/ uint32_tget_sys_tick(void) { returntick; } /*定時器超時回調(diào)函數(shù)*/ voidtimer_timeout_callback(structtk_timer*timer) { printf("timeout_callback:timertimeout:%ld ",get_sys_tick()); } intmain(intargc,char*argv[]) { /*定義定時器timer*/ structtk_timertimer; boolresult=tk_timer_init(&timer,(tk_timer_timeout_callback*)timer_timeout_callback); if(result==NULL) { printf("定時器創(chuàng)建失敗! "); return0; } /*...*/ /*Youcanaddyourcodeunderhere.*/ return0; }
3.3.5 靜態(tài)脫離定時器
注意: 會將timer從定時器鏈表中移除。必須為靜態(tài)方式創(chuàng)建的定時器對象。
booltk_timer_detach(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要脫離的定時器對象 |
返回值 | true:脫離成功;false:脫離失敗 |
3.3.6 定時器啟動
booltk_timer_start(structtk_timer*timer,tk_timer_modemode,uint32_tdelay_tick);
參數(shù) | 描述 |
timer | 要啟動的定時器對象 |
mode | 工作模式,單次:TIMER_MODE_SINGLE;循環(huán):TIMER_MODE_LOOP |
delay_tick | 定時器時長(單位tick) |
返回值 | true:啟動成功;false:啟動失敗 |
3.3.7 定時器停止
booltk_timer_stop(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要停止的定時器對象 |
返回值 | true:停止成功;false:停止失敗 |
3.3.8 定時器繼續(xù)
booltk_timer_continue(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要繼續(xù)的定時器對象 |
返回值 | true:繼續(xù)成功;false:繼續(xù)失敗 |
3.3.9 定時器重啟
注意:重啟時長為最后一次啟動定時器時配置的時長。
booltk_timer_restart(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要重啟的定時器對象 |
返回值 | true:重啟成功;false:重啟失敗 |
3.3.10 獲取定時器模式
tk_timer_modetk_timer_get_mode(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要獲取的定時器對象 |
返回值 | 定時器模式 |
定時器模式 | 描述 |
TIMER_MODE_SINGLE | 單次模式 |
TIMER_MODE_LOOP | 循環(huán)模式 |
3.3.11 獲取定時器狀態(tài)
tk_timer_statetk_timer_get_state(structtk_timer*timer);
參數(shù) | 描述 |
timer | 要獲取的定時器對象 |
返回值 | 定時器狀態(tài) |
定時器模式 | 描述 |
TIMER_STATE_RUNNING | 運行狀態(tài) |
TIMER_STATE_STOP | 停止狀態(tài) |
TIMER_STATE_TIMEOUT | 超時狀態(tài) |
3.3.12 定時器處理
booltk_timer_loop_handler(void);
參數(shù) | 描述 |
返回值 | true:正常;false:異常,在調(diào)用此函數(shù)前,未初始化定時器功能“tk_timer_func_init” |
注意:tk_timer_loop_handler函數(shù)要不斷的循環(huán)調(diào)用。
3.3.13 超時回調(diào)函數(shù)
函數(shù)原型:
typedefvoid(*timeout_callback)(structtk_timer*timer);
說明:超時回調(diào)函數(shù)可定義多個,即一個定時器對應(yīng)一個回調(diào)函數(shù),也可多個定時器對應(yīng)一個回調(diào)函數(shù)。
一對一
/*定義兩個回調(diào)函數(shù),對應(yīng)定時器timer1和timer2*/ voidtimer1_timeout_callback(structtk_timer*timer){ printf("定時器1超時! "); } voidtimer2_timeout_callback(structtk_timer*timer){ printf("定時器2超時! "); } /*創(chuàng)建兩個定時器,配置單獨超時回調(diào)函數(shù)*/ timer1=tk_timer_create((timeout_callback*)timer1_timeout_callback); timer2=tk_timer_create((timeout_callback*)timer2_timeout_callback);
多對一
/*定時器timer1和timer2共用一個回調(diào)函數(shù),在回調(diào)函數(shù)做區(qū)分*/ voidtimer_timeout_callback(structtk_timer*timer){ if(timer==timer1) printf("定時器1超時! "); elseif(timer==timer2) printf("定時器2超時! "); } /*創(chuàng)建兩個定時器,使用相同的超時回調(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ù)
以下為詳細API說明及簡要示例程序,綜合demo可查看tk_event_samples.c示例。
3.4.1 動態(tài)創(chuàng)建一個事件
注意:當(dāng)配置TOOLKIT_USING_EVENT后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
structtk_event*tk_event_create(void);
參數(shù) | 描述 |
返回值 | 創(chuàng)建的事件對象(NULL為創(chuàng)建失敗) |
3.4.2 動態(tài)刪除一個事件
當(dāng)配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的事件對象。
booltk_event_delete(structtk_event*event);
參數(shù) | 描述 |
event | 要刪除的事件對象 |
返回值 | true:刪除成功;false:刪除失敗 |
3.4.3 靜態(tài)初始化一個事件
booltk_event_init(structtk_event*event);
參數(shù) | 描述 |
event | 要初始化的事件對象 |
返回值 | true:創(chuàng)建成功;false:創(chuàng)建失敗 |
3.4.4 發(fā)送事件標志
booltk_event_send(structtk_event*event,uint32_tevent_set);
參數(shù) | 描述 |
event | 發(fā)送目標事件對象 |
event_set | 事件標志,每個標志占1Bit,發(fā)送多個標志可“|” |
返回值 | true:發(fā)送成功;false:發(fā)送失敗 |
3.4.5 接收事件
booltk_event_recv(structtk_event*event,uint32_tevent_set,uint8_toption,uint32_t*recved);
參數(shù) | 描述 |
event | 接收目標事件對象 |
event_set | 感興趣的標志,每個標志占1Bit,多個標志可“|” |
option | 操作,標志與:TK_EVENT_OPTION_AND;標志或:TK_EVENT_OPTION_OR;清除標志:TK_EVENT_OPTION_CLEAR |
返回值 | true:發(fā)送成功;false:發(fā)送失敗 |
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5141文章
19537瀏覽量
315063 -
定時器
+關(guān)注
關(guān)注
23文章
3288瀏覽量
117234 -
軟件框架
+關(guān)注
關(guān)注
0文章
22瀏覽量
10005 -
工具包
+關(guān)注
關(guān)注
0文章
47瀏覽量
9674 -
GitHub
+關(guān)注
關(guān)注
3文章
481瀏覽量
17457
原文標題:搭建一套優(yōu)秀的嵌入式軟件框架必備的通用工具包
文章出處:【微信號:嵌入式應(yīng)用研究院,微信公眾號:嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
LabVIEW 2011模塊和工具包(嵌入式設(shè)計)
分享一套通用的開發(fā)環(huán)境搭建教程
介紹一套完整的針對嵌入式系統(tǒng)的自動化動態(tài)確認測試平臺
通用裝備嵌入式軟件測試工具怎么樣
使用C++構(gòu)建嵌入式開發(fā)框架
SCADE為嵌入式軟件提供了一套基于模型的開發(fā)方式

如何使用PIC32MZ嵌入式連接(EC)入門工具包的詳細使用說明
嵌入式系統(tǒng)移植-01嵌入式基本概念,嵌入式開發(fā)環(huán)境搭建,目標機搭建,TFTP服務(wù)搭建,NFS服務(wù)搭建

嵌入式系統(tǒng)框架----軟件篇

評論