时间:2023-04-17 09:32
人气:
作者:admin
这里给大家分享一个嵌入式通用软件包:ToolKit.
ToolKit是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:循环队列、软件定时器、事件集。
•Queue循环队列
1. 支持动态、静态方式进行队列的创建与删除。
2. 可独立配置缓冲区大小。
3.支持数据最新保持功能,当配置此模式并且缓冲区已满,若有新的数据存入,将会移除最早数据,并保持缓冲区已满。
•Timer软件定时器
1. 支持动态、静态方式进行定时器的创建与删除。
2.支持循环、单次模式。
3. 可配置有无超时回调函数。
4.可配置定时器工作在周期或间隔模式。
5. 使用双向链表,超时统一管理,不会因为增加定时器而增加超时判断代码。
•Event事件集
1. 支持动态、静态方式进行事件集的创建与删除。
2.每个事件最大支持32个标志位。
3.事件的触发可配置为“标志与”和“标志或”。
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//说明文档
•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后,所有功能都将会启动参数检查。
以下为详细API说明及简要示例程序,综合demo可查看tk_queue_samples.c示例。
注意:当配置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;
}
注意:当配置TOOLKIT_USING_QUEUE后,才能使用此函数。此函数需要用到free。必须为动态方式创建的队列对象。
booltk_queue_delete(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要删除的队列对象 |
| 返回值 | true:删除成功;false:删除失败 |
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.*/
}
注意: 会使缓存区脱离与队列的关联。必须为静态方式创建的队列对象。
booltk_queue_detach(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要脱离的队列对象 |
| 返回值 | true:脱离成功;false:脱离失败 |
booltk_queue_clean(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要清空的队列对象 |
| 返回值 | true:清除成功;false:清除失败 |
booltk_queue_empty(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要查询的队列对象 |
| 返回值 | true:空;false:不为空 |
booltk_queue_full(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要查询的队列对象 |
| 返回值 | true:满;false:不为满 |
booltk_queue_peep(structtk_queue*queue,void*pval);
| 参数 | 描述 |
| queue | 队列对象 |
| *pval | 读取值地址 |
| 返回值 | true:读取成功;false:读取失败 |
booltk_queue_remove(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要移除元素的对象 |
| 返回值 | true:移除成功;false:移除失败 |
booltk_queue_push(structtk_queue*queue,void*val);
| 参数 | 描述 |
| queue | 要压入的队列对象 |
| *val | 压入值 |
| 返回值 | true:成功;false:失败 |
booltk_queue_pop(structtk_queue*queue,void*pval);
| 参数 | 描述 |
| queue | 要弹出的队列对象 |
| *pval | 弹出值 |
| 返回值 | true:成功;false:失败 |
uint16_ttk_queue_curr_len(structtk_queue*queue);
| 参数 | 描述 |
| queue | 要查询的队列对象 |
| 返回值 | 队列数据当前长度 |
uint16_ttk_queue_push_multi(structtk_queue*queue,void*pval,uint16_tlen);
| 参数 | 描述 |
| queue | 要压入的队列对象 |
| *pval | 压入数据首地址 |
| len | 压入元素个数 |
| 返回值 | 实际压入个数 |
uint16_ttk_queue_pop_multi(structtk_queue*queue,void*pval,uint16_tlen);
| 参数 | 描述 |
| queue | 要弹出的队列对象 |
| *pval | 存放弹出数据的首地址 |
| len | 希望弹出的数据个数 |
| 返回值 | 实际弹出个数 |
以下为详细API说明及简要示例程序,综合demo可查看tk_timer_samples.c示例。
注意:此函数在使用定时器功能最初调用,目的是创建定时器列表头结点,和配置tick获取回调函数。
booltk_timer_func_init(uint32_t(*get_tick_func)(void));
| 参数 | 描述 |
| get_tick_func | 获取系统tick回调函数 |
| 返回值 | true:初始化成功;false:初始化失败 |
注意:当配置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;
}
当配置TOOLKIT_USING_TIMER后,才能使用此函数。此函数需要用到free。必须为动态方式创建的定时器对象。
booltk_timer_delete(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要删除的定时器对象 |
| 返回值 | true:删除成功;false:删除失败 |
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;
}
注意: 会将timer从定时器链表中移除。必须为静态方式创建的定时器对象。
booltk_timer_detach(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要脱离的定时器对象 |
| 返回值 | true:脱离成功;false:脱离失败 |
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:启动失败 |
booltk_timer_stop(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要停止的定时器对象 |
| 返回值 | true:停止成功;false:停止失败 |
booltk_timer_continue(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要继续的定时器对象 |
| 返回值 | true:继续成功;false:继续失败 |
注意:重启时长为最后一次启动定时器时配置的时长。
booltk_timer_restart(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要重启的定时器对象 |
| 返回值 | true:重启成功;false:重启失败 |
tk_timer_modetk_timer_get_mode(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要获取的定时器对象 |
| 返回值 | 定时器模式 |
| 定时器模式 | 描述 |
| TIMER_MODE_SINGLE | 单次模式 |
| TIMER_MODE_LOOP | 循环模式 |
tk_timer_statetk_timer_get_state(structtk_timer*timer);
| 参数 | 描述 |
| timer | 要获取的定时器对象 |
| 返回值 | 定时器状态 |
| 定时器模式 | 描述 |
| TIMER_STATE_RUNNING | 运行状态 |
| TIMER_STATE_STOP | 停止状态 |
| TIMER_STATE_TIMEOUT | 超时状态 |
booltk_timer_loop_handler(void);
| 参数 | 描述 |
| 返回值 | true:正常;false:异常,在调用此函数前,未初始化定时器功能“tk_timer_func_init” |
注意:tk_timer_loop_handler函数要不断的循环调用。
函数原型:
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);
以下为详细API说明及简要示例程序,综合demo可查看tk_event_samples.c示例。
注意:当配置TOOLKIT_USING_EVENT后,才能使用此函数。此函数需要用到malloc。
structtk_event*tk_event_create(void);
| 参数 | 描述 |
| 返回值 | 创建的事件对象(NULL为创建失败) |
当配置TOOLKIT_USING_TIMER后,才能使用此函数。此函数需要用到free。必须为动态方式创建的事件对象。
booltk_event_delete(structtk_event*event);
| 参数 | 描述 |
| event | 要删除的事件对象 |
| 返回值 | true:删除成功;false:删除失败 |
booltk_event_init(structtk_event*event);
| 参数 | 描述 |
| event | 要初始化的事件对象 |
| 返回值 | true:创建成功;false:创建失败 |
booltk_event_send(structtk_event*event,uint32_tevent_set);
| 参数 | 描述 |
| event | 发送目标事件对象 |
| event_set | 事件标志,每个标志占1Bit,发送多个标志可“|” |
| 返回值 | true:发送成功;false:发送失败 |
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:发送失败 |
来源:https://github.com/cproape/toolkit审核编辑 :李倩