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:发送失败

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19111

    浏览量

    304852
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114740
  • 软件框架
    +关注

    关注

    0

    文章

    21

    浏览量

    9864
  • 工具包
    +关注

    关注

    0

    文章

    46

    浏览量

    9530
  • GitHub
    +关注

    关注

    3

    文章

    469

    浏览量

    16430

原文标题:搭建一套优秀的嵌入式软件框架必备的通用工具包

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    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 8137次阅读

    嵌入式通用软件包:ToolKit

    ToolKit是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:循环队列、
    的头像 发表于 04-17 09:32 1099次阅读

    ToolKit是一套应用于嵌入式系统的通用工具包

    ToolKit是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:循环队列、
    的头像 发表于 04-17 10:04 2855次阅读

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

    ToolKit是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:循环队列、
    发表于 04-25 14:29 380次阅读