1、介紹
本篇博文分享一個很實用的嵌入式代碼庫。
它可靈活應用到有無RTOS的程序中,采用C語言面向?qū)ο蟮乃悸穼崿F(xiàn)各個功能,盡可能最大化的復用代碼,目前為止工具包包含:循環(huán)隊列、軟件定時器、事件集。
網(wǎng)址:https://download.csdn.net/download/m0_38106923/87765476?spm=1001.2014.3001.5503
-
Queue 循環(huán)隊列
- 支持動態(tài)、靜態(tài)方式進行隊列的創(chuàng)建與刪除。
- 可獨立配置緩沖區(qū)大小。
- 支持數(shù)據(jù)最新保持功能,當配置此模式并且緩沖區(qū)已滿,若有新的數(shù)據(jù)存入,將會移除最早數(shù)據(jù),并保持緩沖區(qū)已滿。
-
Timer 軟件定時器
- 支持動態(tài)、靜態(tài)方式進行定時器的創(chuàng)建與刪除。
- 支持循環(huán)、單次模式。
- 可配置有無超時回調(diào)函數(shù)。
- 可配置定時器工作在周期或間隔模式。
- 使用雙向鏈表,超時統(tǒng)一管理,不會因為增加定時器而增加超時判斷代碼。
-
Event 事件集
- 支持動態(tài)、靜態(tài)方式進行事件集的創(chuàng)建與刪除。
- 每個事件最大支持32個標志位。
- 事件的觸發(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)建和刪除 |
說明:當配置TOOLKIT_USING_ASSERT后,所有功能都將會啟動參數(shù)檢查。
3.2 Queue 循環(huán)隊列API函數(shù)
以下為詳細API說明及簡要示例程序,綜合demo可查看tk_queue_samples.c示例。
3.2.1 動態(tài)創(chuà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 |
最大隊列個數(shù) |
keep_fresh |
是否為保持最新模式,true:保持最新;false:默認(存滿不能再存) |
返回值 |
創(chuàng)建的隊列對象(NULL為創(chuàng)建失?。?/td>
|
隊列創(chuàng)建示例:
int main(int argc, char *argv[])
{
struct tk_queue *queue = tk_queue_create(50, 1, false);
if( queue == NULL){
printf("隊列創(chuàng)建失敗!\n");
}
return 0;
}
3.2.2 動態(tài)刪除隊列
注意:當配置TOOLKIT_USING_QUEUE后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的隊列對象。
bool tk_queue_delete(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要刪除的隊列對象 |
返回值 |
true:刪除成功;false:刪除失敗 |
3.2.3 靜態(tài)初始化隊列
bool tk_queue_init(struct tk_queue *queue, void *queuepool, uint16_t pool_size, uint16_t queue_size, bool keep_fresh);
參數(shù) |
描述 |
queue |
要初始化的隊列對象 |
*queuepool |
隊列緩存區(qū) |
pool_size |
緩存區(qū)大小(單位字節(jié)) |
queue_size |
隊列元素大小(單位字節(jié)) |
keep_fresh |
是否為保持最新模式,true:保持最新;false:默認(存滿不能再存) |
返回值 |
true:初始化成功;false:初始化失敗 |
隊列創(chuàng)建示例:
int main(int argc, char *argv[])
{
struct tk_queue queue;
uint8_t queue_pool[100];
if( tk_queue_init(&queue, queue_pool, sizeof(queue_pool),
sizeof(queue_pool[0]), true) == false){
printf("隊列創(chuàng)建失敗!\n");
}
}
3.2.4 靜態(tài)脫離隊列
注意: 會使緩存區(qū)脫離與隊列的關聯(lián)。必須為靜態(tài)方式創(chuàng)建的隊列對象。
bool tk_queue_detach(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要脫離的隊列對象 |
返回值 |
true:脫離成功;false:脫離失敗 |
3.2.5 清空隊列
bool tk_queue_clean(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要清空的隊列對象 |
返回值 |
true:清除成功;false:清除失敗 |
3.2.6 判斷隊列是否為空
bool tk_queue_empty(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要查詢的隊列對象 |
返回值 |
true:空;false:不為空 |
3.2.7 判斷隊列是否已滿
bool tk_queue_full(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要查詢的隊列對象 |
返回值 |
true:滿;false:不為滿 |
3.2.8 從隊列中讀取一個元素(不從隊列中刪除)
bool tk_queue_peep(struct tk_queue *queue, void *pval);
參數(shù) |
描述 |
queue |
隊列對象 |
*pval |
讀取值地址 |
返回值 |
true:讀取成功;false:讀取失敗 |
3.2.9 移除一個元素
bool tk_queue_remove(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要移除元素的對象 |
返回值 |
true:移除成功;false:移除失敗 |
3.2.10 向隊列壓入(入隊)1個元素數(shù)據(jù)
bool tk_queue_push(struct tk_queue *queue, void *val);
參數(shù) |
描述 |
queue |
要壓入的隊列對象 |
*val |
壓入值 |
返回值 |
true:成功;false:失敗 |
3.2.11 從隊列彈出(出隊)1個元素數(shù)據(jù)
bool tk_queue_pop(struct tk_queue *queue, void *pval);
參數(shù) |
描述 |
queue |
要彈出的隊列對象 |
*pval |
彈出值 |
返回值 |
true:成功;false:失敗 |
3.2.12 查詢隊列當前數(shù)據(jù)長度
uint16_t tk_queue_curr_len(struct tk_queue *queue);
參數(shù) |
描述 |
queue |
要查詢的隊列對象 |
返回值 |
隊列數(shù)據(jù)當前長度 |
3.2.13 向隊列壓入(入隊)多個元素數(shù)據(jù)
uint16_t tk_queue_push_multi(struct tk_queue *queue, void *pval, uint16_t len);
參數(shù) |
描述 |
queue |
要壓入的隊列對象 |
*pval |
壓入數(shù)據(jù)首地址 |
len |
壓入元素個數(shù) |
返回值 |
實際壓入個數(shù) |
3.2.14 從隊列彈出(出隊)多個元素數(shù)據(jù)
uint16_t tk_queue_pop_multi(struct tk_queue *queue, void *pval, uint16_t len);
參數(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)建定時器列表頭結點,和配置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 動態(tài)創(chuàng)建定時器
注意:當配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到malloc。
struct tk_timer *tk_timer_create(void(*timeout_callback)(struct tk_timer *timer));
參數(shù) |
描述 |
timeout_callback |
定時器超時回調(diào)函數(shù),不使用可配置為NULL |
返回值 |
創(chuàng)建的定時器對象(NULL為創(chuàng)建失敗) |
定時器創(chuàng)建示例:
uint32_t get_sys_tick(void)
{
return tick;
}
void timer_timeout_callback(struct tk_timer *timer)
{
printf("timeout_callback: timer timeout:%ld\n", get_sys_tick());
}
int main(int argc, char *argv[])
{
tk_timer_func_init(get_sys_tick);
tk_timer_t timer = NULL;
timer = tk_timer_create((tk_timer_timeout_callback *)timer_timeout_callback);
if (timer == NULL)
{
printf("定時器創(chuàng)建失敗!\n");
return 0;
}
return 0;
}
3.3.3 動態(tài)刪除定時器
當配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的定時器對象。
bool tk_timer_delete(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要刪除的定時器對象 |
返回值 |
true:刪除成功;false:刪除失敗 |
3.3.4 靜態(tài)初始化定時器
bool tk_timer_init(struct tk_timer *timer, void (*timeout_callback)(struct tk_timer *timer));
參數(shù) |
描述 |
timer |
要初始化的定時器對象 |
timeout_callback |
定時器超時回調(diào)函數(shù),不使用可配置為NULL
|
返回值 |
true:創(chuàng)建成功;false:創(chuàng)建失敗 |
隊列創(chuàng)建示例:
uint32_t get_sys_tick(void)
{
return tick;
}
void timer_timeout_callback(struct tk_timer *timer)
{
printf("timeout_callback: timer timeout:%ld\n", get_sys_tick());
}
int main(int argc, char *argv[])
{
struct tk_timer timer;
bool result = tk_timer_init( &timer,(tk_timer_timeout_callback *)timer_timeout_callback);
if (result == NULL)
{
printf("定時器創(chuàng)建失敗!\n");
return 0;
}
return 0;
}
3.3.5 靜態(tài)脫離定時器
注意: 會將timer從定時器鏈表中移除。必須為靜態(tài)方式創(chuàng)建的定時器對象。
bool tk_timer_detach(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要脫離的定時器對象 |
返回值 |
true:脫離成功;false:脫離失敗 |
3.3.6 定時器啟動
bool tk_timer_start(struct tk_timer *timer, tk_timer_mode mode, uint32_t delay_tick);
參數(shù) |
描述 |
timer |
要啟動的定時器對象 |
mode |
工作模式,單次: TIMER_MODE_SINGLE;循環(huán): TIMER_MODE_LOOP
|
delay_tick |
定時器時長(單位tick) |
返回值 |
true:啟動成功;false:啟動失敗 |
3.3.7 定時器停止
bool tk_timer_stop(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要停止的定時器對象 |
返回值 |
true:停止成功;false:停止失敗 |
3.3.8 定時器繼續(xù)
bool tk_timer_continue(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要繼續(xù)的定時器對象 |
返回值 |
true:繼續(xù)成功;false:繼續(xù)失敗 |
3.3.9 定時器重啟
注意:重啟時長為最后一次啟動定時器時配置的時長。
bool tk_timer_restart(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要重啟的定時器對象 |
返回值 |
true:重啟成功;false:重啟失敗 |
3.3.10 獲取定時器模式
tk_timer_mode tk_timer_get_mode(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要獲取的定時器對象 |
返回值 |
定時器模式 |
定時器模式 |
描述 |
TIMER_MODE_SINGLE |
單次模式 |
TIMER_MODE_LOOP |
循環(huán)模式 |
3.3.11 獲取定時器狀態(tài)
tk_timer_state tk_timer_get_state(struct tk_timer *timer);
參數(shù) |
描述 |
timer |
要獲取的定時器對象 |
返回值 |
定時器狀態(tài) |
定時器模式 |
描述 |
TIMER_STATE_RUNNING |
運行狀態(tài) |
TIMER_STATE_STOP |
停止狀態(tài) |
TIMER_STATE_TIMEOUT |
超時狀態(tài) |
3.3.12 定時器處理
bool tk_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ù)原型:
typedef void (*timeout_callback)(struct tk_timer *timer);
說明:超時回調(diào)函數(shù)可定義多個,即一個定時器對應一個回調(diào)函數(shù),也可多個定時器對應一個回調(diào)函數(shù)。
-
一對一
void timer1_timeout_callback(struct tk_timer *timer){
printf("定時器1超時!\n");
}
void timer2_timeout_callback(struct tk_timer *timer){
printf("定時器2超時!\n");
}
timer1 = tk_timer_create((timeout_callback *)timer1_timeout_callback);
timer2 = tk_timer_create((timeout_callback *)timer2_timeout_callback);
-
多對一
void timer_timeout_callback(struct tk_timer *timer){
if (timer == timer1)
printf("定時器1超時!\n");
else if (timer == timer2)
printf("定時器2超時!\n");
}
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)建一個事件
注意:當配置TOOLKIT_USING_EVENT后,才能使用此函數(shù)。此函數(shù)需要用到malloc。文章來源:http://www.zghlxwxcb.cn/news/detail-437636.html
struct tk_event *tk_event_create(void);
參數(shù) |
描述 |
返回值 |
創(chuàng)建的事件對象(NULL為創(chuàng)建失敗) |
3.4.2 動態(tài)刪除一個事件
當配置TOOLKIT_USING_TIMER后,才能使用此函數(shù)。此函數(shù)需要用到free。必須為動態(tài)方式創(chuàng)建的事件對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-437636.html
bool tk_event_delete(struct tk_event *event);
參數(shù) |
描述 |
event |
要刪除的事件對象 |
返回值 |
true:刪除成功;false:刪除失敗 |
3.4.3 靜態(tài)初始化一個事件
bool tk_event_init(struct tk_event *event);
參數(shù) |
描述 |
event |
要初始化的事件對象 |
返回值 |
true:創(chuàng)建成功;false:創(chuàng)建失敗 |
3.4.4 發(fā)送事件標志
bool tk_event_send(struct tk_event *event, uint32_t event_set);
參數(shù) |
描述 |
event |
發(fā)送目標事件對象 |
event_set |
事件標志,每個標志占1Bit,發(fā)送多個標志可“|” |
返回值 |
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 |
接收目標事件對象 |
event_set |
感興趣的標志,每個標志占1Bit,多個標志可“|” |
option |
操作,標志與:TK_EVENT_OPTION_AND; 標志或:TK_EVENT_OPTION_OR; 清除標志:TK_EVENT_OPTION_CLEAR |
返回值 |
true:發(fā)送成功;false:發(fā)送失敗 |
到了這里,關于自定義循環(huán)隊列、軟件定時器、事件集,實用嵌入式代碼庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!