精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

搭建一套優秀的嵌入式軟件框架必備的通用工具包

嵌入式應用研究院 ? 來源:Github ? 2023-04-18 09:34 ? 次閱讀

來源 | Github

1、介紹

ToolKit是一套應用于嵌入式系統的通用工具包,可靈活應用到有無RTOS的程序中,采用C語言面向對象的思路實現各個功能,盡可能最大化的復用代碼,目前為止工具包包含:循環隊列、軟件定時器、事件集

?Queue循環隊列

1. 支持動態、靜態方式進行隊列的創建與刪除。

2. 可獨立配置緩沖區大小。

3.支持數據最新保持功能,當配置此模式并且緩沖區已滿,若有新的數據存入,將會移除最早數據,并保持緩沖區已滿。

?Timer軟件定時器

1. 支持動態、靜態方式進行定時器的創建與刪除。

2.支持循環單次模式。

3. 可配置有無超時回調函數。

4.可配置定時器工作在周期間隔模式。

5. 使用雙向鏈表,超時統一管理,不會因為增加定時器而增加超時判斷代碼。

?Event事件集

1. 支持動態、靜態方式進行事件集的創建與刪除。

2.每個事件最大支持32個標志位。

3.事件的觸發可配置為“標志與”“標志或”

2 、文件目錄

toolkit
├──include//包含文件目錄
|├──toolkit.h//toolkit頭文件
|└──toolkit_cfg.h//toolkit配置文件
├──src//toolkit源碼目錄
|├──tk_queue.c//循環隊列源碼
|├──tk_timer.c//軟件定時器源碼
|└──tk_event.c//事件集源碼
├──samples//例子
|├──tk_queue_samples.c//循環隊列使用例程源碼
|├──tk_timer_samples.c//軟件定時器使用例程源碼
|└──tk_event_samples.c//事件集使用例程源碼
└──README.md//說明文檔

3 、函數定義

3.1 配置文件

?ToolKit配置項

宏定義 描述
TOOLKIT_USING_ASSERT ToolKit使用斷言功能
TOOLKIT_USING_QUEUE ToolKit使用循環隊列功能
TOOLKIT_USING_TIMER ToolKit使用軟件定時器功能
TOOLKIT_USING_EVENT ToolKit使用事件集功能

?Queue 循環隊列配置項

宏定義 描述
TK_QUEUE_USING_CREATE Queue 循環隊列使用動態創建和刪除

?Timer 軟件定時器配置項

宏定義 描述
TK_TIMER_USING_CREATE Timer 軟件定時器使用動態創建和刪除
TK_TIMER_USING_INTERVAL Timer 軟件定時器使用間隔模式
TK_TIMER_USING_TIMEOUT_CALLBACK Timer 軟件定時器使用超時回調函數

?Event 事件集配置項

宏定義 描述
TK_EVENT_USING_CREATE Event 事件集使用動態創建和刪除

說明:當配置TOOLKIT_USING_ASSERT后,所有功能都將會啟動參數檢查。

3.2 Queue 循環隊列API函數

以下為詳細API說明及簡要示例程序,綜合demo可查看tk_queue_samples.c示例。

3.2.1 動態創建隊列

注意:當配置TOOLKIT_USING_QUEUE后,才能使用此函數。此函數需要用到malloc

structtk_queue*tk_queue_create(uint16_tqueue_size,uint16_tmax_queues,boolkeep_fresh);

參數 描述
queue_size 緩存區大小(單位字節)
max_queues 最大隊列個數
keep_fresh 是否為保持最新模式,true:保持最新;false:默認(存滿不能再存)
返回值 創建的隊列對象(NULL為創建失敗)

隊列創建示例:

intmain(intargc,char*argv[])
{
/*動態方式創建一個循環隊"queue",緩沖區大小50字節,不保持最新*/
structtk_queue*queue=tk_queue_create(50,1,false);
if(queue==NULL){
printf("隊列創建失敗!
");
}
/*...*/
/*Youcanaddyourcodeunderhere.*/
return0;
}

3.2.2動態刪除隊列

注意:當配置TOOLKIT_USING_QUEUE后,才能使用此函數。此函數需要用到free。必須為動態方式創建的隊列對象。

booltk_queue_delete(structtk_queue*queue);

參數 描述
queue 要刪除的隊列對象
返回值 true:刪除成功;false:刪除失敗

3.2.3靜態初始化隊列

booltk_queue_init(structtk_queue*queue,void*queuepool,uint16_tpool_size,uint16_tqueue_size,boolkeep_fresh);

參數 描述
queue 要初始化的隊列對象
*queuepool 隊列緩存區
pool_size 緩存區大小(單位字節)
queue_size 隊列元素大小(單位字節)
keep_fresh 是否為保持最新模式,true:保持最新;false:默認(存滿不能再存)
返回值 true:初始化成功;false:初始化失敗

隊列創建示例:

intmain(intargc,char*argv[])
{
/*定義一個循環隊列*/
structtk_queuequeue;
/*定義循環隊列緩沖區*/
uint8_tqueue_pool[100];
/*靜態方式創建一個循環隊列"queue",緩存區為queue_pool,大小為queue_pool的大小,模式為保持最新*/
if(tk_queue_init(&queue,queue_pool,sizeof(queue_pool),
sizeof(queue_pool[0]),true)==false){
printf("隊列創建失敗!
");
}
/*...*/
/*Youcanaddyourcodeunderhere.*/
}

3.2.4 靜態脫離隊列

注意: 會使緩存區脫離與隊列的關聯。必須為靜態方式創建的隊列對象。

booltk_queue_detach(structtk_queue*queue);

參數 描述
queue 要脫離的隊列對象
返回值 true:脫離成功;false:脫離失敗

3.2.5 清空隊列

booltk_queue_clean(structtk_queue*queue);

參數 描述
queue 要清空的隊列對象
返回值 true:清除成功;false:清除失敗

3.2.6 判斷隊列是否為空

booltk_queue_empty(structtk_queue*queue);

參數 描述
queue 要查詢的隊列對象
返回值 true:空;false:不為空

3.2.7 判斷隊列是否已滿

booltk_queue_full(structtk_queue*queue);

參數 描述
queue 要查詢的隊列對象
返回值 true:滿;false:不為滿

3.2.8 從隊列中讀取一個元素(不從隊列中刪除)

booltk_queue_peep(structtk_queue*queue,void*pval);

參數 描述
queue 隊列對象
*pval 讀取值地址
返回值 true:讀取成功;false:讀取失敗

3.2.9 移除一個元素

booltk_queue_remove(structtk_queue*queue);

參數 描述
queue 要移除元素的對象
返回值 true:移除成功;false:移除失敗

3.2.10 向隊列壓入(入隊)1個元素數據

booltk_queue_push(structtk_queue*queue,void*val);

參數 描述
queue 要壓入的隊列對象
*val 壓入值
返回值 true:成功;false:失敗

3.2.11 從隊列彈出(出隊)1個元素數據

booltk_queue_pop(structtk_queue*queue,void*pval);

參數 描述
queue 要彈出的隊列對象
*pval 彈出值
返回值 true:成功;false:失敗

3.2.12 查詢隊列當前數據長度

uint16_ttk_queue_curr_len(structtk_queue*queue);

參數 描述
queue 要查詢的隊列對象
返回值 隊列數據當前長度

3.2.13 向隊列壓入(入隊)多個元素數據

uint16_ttk_queue_push_multi(structtk_queue*queue,void*pval,uint16_tlen);

參數 描述
queue 要壓入的隊列對象
*pval 壓入數據首地址
len 壓入元素個數
返回值 實際壓入個數

3.2.14 從隊列彈出(出隊)多個元素數據

uint16_ttk_queue_pop_multi(structtk_queue*queue,void*pval,uint16_tlen);

參數 描述
queue 要彈出的隊列對象
*pval 存放彈出數據的首地址
len 希望彈出的數據個數
返回值 實際彈出個數

3.3 Timer 軟件定時器API函數

以下為詳細API說明及簡要示例程序,綜合demo可查看tk_timer_samples.c示例。

3.3.1 軟件定時器功能初始化

注意:此函數在使用定時器功能最初調用,目的是創建定時器列表頭結點,和配置tick獲取回調函數。

booltk_timer_func_init(uint32_t(*get_tick_func)(void));

參數 描述
get_tick_func 獲取系統tick回調函數
返回值 true:初始化成功;false:初始化失敗

3.3.2 動態創建定時器

注意:當配置TOOLKIT_USING_TIMER后,才能使用此函數。此函數需要用到malloc

structtk_timer*tk_timer_create(void(*timeout_callback)(structtk_timer*timer));

參數 描述
timeout_callback 定時器超時回調函數,不使用可配置為NULL
返回值 創建的定時器對象(NULL為創建失敗)

定時器創建示例:

/*定義獲取系統tick回調函數*/
uint32_tget_sys_tick(void)
{
returntick;
}

/*定時器超時回調函數*/
voidtimer_timeout_callback(structtk_timer*timer)
{
printf("timeout_callback:timertimeout:%ld
",get_sys_tick());
}

intmain(intargc,char*argv[])
{
/*初始化軟件定時器功能,并配置tick獲取回調函數*/
tk_timer_func_init(get_sys_tick);

/*定義定時器指針*/
tk_timer_ttimer=NULL;
/*動態方式創建timer,并配置定時器超時回調函數*/
timer=tk_timer_create((tk_timer_timeout_callback*)timer_timeout_callback);
if(timer==NULL)
{
printf("定時器創建失敗!
");
return0;
}
/*...*/
/*Youcanaddyourcodeunderhere.*/
return0;
}

3.3.3 動態刪除定時器

當配置TOOLKIT_USING_TIMER后,才能使用此函數。此函數需要用到free。必須為動態方式創建的定時器對象。

booltk_timer_delete(structtk_timer*timer);

參數 描述
timer 要刪除的定時器對象
返回值 true:刪除成功;false:刪除失敗

3.3.4 靜態初始化定時器

booltk_timer_init(structtk_timer*timer,void(*timeout_callback)(structtk_timer*timer));

參數 描述
timer 要初始化的定時器對象
timeout_callback 定時器超時回調函數,不使用可配置為NULL
返回值 true:創建成功;false:創建失敗

隊列創建示例:

/*定義獲取系統tick回調函數*/
uint32_tget_sys_tick(void)
{
returntick;
}

/*定時器超時回調函數*/
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("定時器創建失敗!
");
return0;
}
/*...*/
/*Youcanaddyourcodeunderhere.*/
return0;
}

3.3.5 靜態脫離定時器

注意: 會將timer從定時器鏈表中移除。必須為靜態方式創建的定時器對象。

booltk_timer_detach(structtk_timer*timer);

參數 描述
timer 要脫離的定時器對象
返回值 true:脫離成功;false:脫離失敗

3.3.6 定時器啟動

booltk_timer_start(structtk_timer*timer,tk_timer_modemode,uint32_tdelay_tick);

參數 描述
timer 要啟動的定時器對象
mode 工作模式,單次:TIMER_MODE_SINGLE;循環:TIMER_MODE_LOOP
delay_tick 定時器時長(單位tick)
返回值 true:啟動成功;false:啟動失敗

3.3.7 定時器停止

booltk_timer_stop(structtk_timer*timer);

參數 描述
timer 要停止的定時器對象
返回值 true:停止成功;false:停止失敗

3.3.8 定時器繼續

booltk_timer_continue(structtk_timer*timer);

參數 描述
timer 要繼續的定時器對象
返回值 true:繼續成功;false:繼續失敗

3.3.9 定時器重啟

注意:重啟時長為最后一次啟動定時器時配置的時長。

booltk_timer_restart(structtk_timer*timer);

參數 描述
timer 要重啟的定時器對象
返回值 true:重啟成功;false:重啟失敗

3.3.10 獲取定時器模式

tk_timer_modetk_timer_get_mode(structtk_timer*timer);

參數 描述
timer 要獲取的定時器對象
返回值 定時器模式
定時器模式 描述
TIMER_MODE_SINGLE 單次模式
TIMER_MODE_LOOP 循環模式

3.3.11 獲取定時器狀態

tk_timer_statetk_timer_get_state(structtk_timer*timer);

參數 描述
timer 要獲取的定時器對象
返回值 定時器狀態
定時器模式 描述
TIMER_STATE_RUNNING 運行狀態
TIMER_STATE_STOP 停止狀態
TIMER_STATE_TIMEOUT 超時狀態

3.3.12 定時器處理

booltk_timer_loop_handler(void);

參數 描述
返回值 true:正常;false:異常,在調用此函數前,未初始化定時器功能“tk_timer_func_init”

注意:tk_timer_loop_handler函數要不斷的循環調用。

3.3.13 超時回調函數

函數原型

typedefvoid(*timeout_callback)(structtk_timer*timer);

說明:超時回調函數可定義多個,即一個定時器對應一個回調函數,也可多個定時器對應一個回調函數。

一對一

/*定義兩個回調函數,對應定時器timer1和timer2*/
voidtimer1_timeout_callback(structtk_timer*timer){
printf("定時器1超時!
");
}
voidtimer2_timeout_callback(structtk_timer*timer){
printf("定時器2超時!
");
}
/*創建兩個定時器,配置單獨超時回調函數*/
timer1=tk_timer_create((timeout_callback*)timer1_timeout_callback);
timer2=tk_timer_create((timeout_callback*)timer2_timeout_callback);

多對一

/*定時器timer1和timer2共用一個回調函數,在回調函數做區分*/
voidtimer_timeout_callback(structtk_timer*timer){
if(timer==timer1)
printf("定時器1超時!
");
elseif(timer==timer2)
printf("定時器2超時!
");
}
/*創建兩個定時器,使用相同的超時回調函數*/
timer1=tk_timer_create((timeout_callback*)timer_timeout_callback);
timer2=tk_timer_create((timeout_callback*)timer_timeout_callback);

3.4 Event 事件集API函數

以下為詳細API說明及簡要示例程序,綜合demo可查看tk_event_samples.c示例。

3.4.1 動態創建一個事件

注意:當配置TOOLKIT_USING_EVENT后,才能使用此函數。此函數需要用到malloc

structtk_event*tk_event_create(void);

參數 描述
返回值 創建的事件對象(NULL為創建失敗)

3.4.2 動態刪除一個事件

當配置TOOLKIT_USING_TIMER后,才能使用此函數。此函數需要用到free。必須為動態方式創建的事件對象。

booltk_event_delete(structtk_event*event);

參數 描述
event 要刪除的事件對象
返回值 true:刪除成功;false:刪除失敗

3.4.3 靜態初始化一個事件

booltk_event_init(structtk_event*event);

參數 描述
event 要初始化的事件對象
返回值 true:創建成功;false:創建失敗

3.4.4 發送事件標志

booltk_event_send(structtk_event*event,uint32_tevent_set);

參數 描述
event 發送目標事件對象
event_set 事件標志,每個標志占1Bit,發送多個標志可“|”
返回值 true:發送成功;false:發送失敗

3.4.5 接收事件

booltk_event_recv(structtk_event*event,uint32_tevent_set,uint8_toption,uint32_t*recved);

參數 描述
event 接收目標事件對象
event_set 感興趣的標志,每個標志占1Bit,多個標志可“|”
option 操作,標志與:TK_EVENT_OPTION_AND;標志或:TK_EVENT_OPTION_OR;清除標志:TK_EVENT_OPTION_CLEAR
返回值 true:發送成功;false:發送失敗

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5071

    文章

    19026

    瀏覽量

    303494
  • 定時器
    +關注

    關注

    23

    文章

    3241

    瀏覽量

    114511
  • 軟件框架
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9858
  • 工具包
    +關注

    關注

    0

    文章

    46

    瀏覽量

    9525
  • GitHub
    +關注

    關注

    3

    文章

    467

    瀏覽量

    16389

原文標題:搭建一套優秀的嵌入式軟件框架必備的通用工具包

文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LabVIEW 2011模塊和工具包嵌入式設計)

    `借助NI LabVIEW,將嵌入式應用程序設計、建模并部署到各類處理目標(包括:現成的實時系統和基于FPGA的系統,以及自定義微處理器與微控制器設備)。包括LabVIEW RT模塊、LabVIEW FPGA 模塊、FPGA編譯器工具包`
    發表于 08-02 15:32

    促進ARM嵌入式發展的工具包簡介

    促進ARM嵌入式發展的工具包簡介
    發表于 07-31 21:55

    java開源工具包-Jodd框架

    Jodd是個Java工具包和微型框架,Jodd 工具包些實用的工具類和小型
    發表于 03-19 16:13

    分享一套通用的開發環境搭建教程

    針對嵌入式的開發,不同的開發者使用不同的操作系統,可能是Windows 或者 Linux,隨之而來所搭建的開發環境亦不同。所以在這里希望分享一套通用的開發環境
    發表于 11-05 06:23

    介紹一套完整的針對嵌入式系統的自動化動態確認測試平臺

    常用嵌入式系統軟件仿真自動化黑盒測試平臺 、 ETest 簡介 通用嵌入式系統測試平臺(Embedded System Interface
    發表于 12-17 06:58

    通用裝備嵌入式軟件測試工具怎么樣

    系統裝備軟件的研發與生產質量,解決具有復雜交聯環境裝備嵌入式軟件測試環境搭建和測試開發的難題;還可以提高測試人員在承擔軟件測試任務的標準化、
    發表于 12-24 06:22

    使用C++構建嵌入式開發框架

    框架作為種大粒度的重用技術在桌面軟件開發中得到了廣泛應用,而在嵌入式開發領域,目前還沒有一套完整的標準
    發表于 05-15 15:42 ?12次下載

    SCADE為嵌入式軟件提供了一套基于模型的開發方式

    嵌入式技術是計算機發展的趨勢之,被廣泛應用于工業和軍事領域。SCADE(高安全性的應用程序開發環境)為嵌入式軟件提供了一套基于模型的開發方
    發表于 10-17 10:09 ?5次下載
    SCADE為<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>提供了<b class='flag-5'>一套</b>基于模型的開發方式

    如何使用PIC32MZ嵌入式連接(EC)入門工具包的詳細使用說明

    本文檔介紹了如何使用PIC32MZ嵌入式連接(EC)入門工具包(也稱為“入門工具包”)開發工具在目標板上仿真和調試固件。
    發表于 06-07 11:28 ?25次下載

    嵌入式系統移植-01嵌入式基本概念,嵌入式開發環境搭建,目標機搭建,TFTP服務搭建,NFS服務搭建

    文章目錄系統移植概述及環境搭建嵌入式基本概念嵌入式系統的應用領域什么是嵌入式系統用嵌入式系統硬件組成部分
    發表于 10-20 17:21 ?10次下載
    <b class='flag-5'>嵌入式</b>系統移植-01<b class='flag-5'>嵌入式</b>基本概念,<b class='flag-5'>嵌入式</b>開發環境<b class='flag-5'>搭建</b>,目標機<b class='flag-5'>搭建</b>,TFTP服務<b class='flag-5'>搭建</b>,NFS服務<b class='flag-5'>搭建</b>

    嵌入式系統框架----軟件

    1.overview 圖1-1 嵌入式框架嵌入式系統分為硬件以及軟件兩大部分,大多數人參與的是
    發表于 10-20 19:21 ?5次下載
    <b class='flag-5'>嵌入式</b>系統<b class='flag-5'>框架</b>----<b class='flag-5'>軟件</b>篇

    Arm?ML處理器 嵌入式評估工具包介紹

    Arm Ethos-U55是世界上第款microNPU。這是種新型的ML處理器,旨在加速嵌入式和物聯網設備上的ML推理。 評估工具包概述 此評估
    的頭像 發表于 03-30 14:39 ?8079次閱讀

    嵌入式通用軟件包:ToolKit

    ToolKit是一套應用于嵌入式系統的通用工具包,可靈活應用到有無RTOS的程序中,采用C語言面向對象的思路實現各個功能,盡可能最大化的復用代碼,目前為止工具包包含:循環隊列、
    的頭像 發表于 04-17 09:32 ?1053次閱讀

    ToolKit是一套應用于嵌入式系統的通用工具包

    ToolKit是一套應用于嵌入式系統的通用工具包,可靈活應用到有無RTOS的程序中,采用C語言面向對象的思路實現各個功能,盡可能最大化的復用代碼,目前為止工具包包含:循環隊列、
    的頭像 發表于 04-17 10:04 ?2754次閱讀

    基于Toolkit的嵌入式軟件框架搭建方法

    ToolKit是一套應用于嵌入式系統的通用工具包,可靈活應用到有無RTOS的程序中,采用C語言面向對象的思路實現各個功能,盡可能最大化的復用代碼,目前為止工具包包含:循環隊列、
    發表于 04-25 14:29 ?369次閱讀