一个应用于嵌入式的通用工具包!

2023-05-16

已剪辑自: https://mp.weixin.qq.com/s/fsVpIRmPOIkIT5lVOqt5xw

来源:https://github.com/cproape/toolkit

1、介绍

ToolKit是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:循环队列、软件定时器、事件集

  • Queue 循环队列

    1. \1. 支持动态、静态方式进行队列的创建与删除。
    2. \2. 可独立配置缓冲区大小。
    3. \3. 支持数据最新保持功能,当配置此模式并且缓冲区已满,若有新的数据存入,将会移除最早数据,并保持缓冲区已满。
  • Timer 软件定时器

    1. \1. 支持动态、静态方式进行定时器的创建与删除。
    2. \2. 支持循环单次模式。
    3. \3. 可配置有无超时回调函数。
    4. \4. 可配置定时器工作在周期间隔模式。
    5. \5. 使用双向链表,超时统一管理,不会因为增加定时器而增加超时判断代码。
  • Event 事件集

    1. \1. 支持动态、静态方式进行事件集的创建与删除。
    2. \2. 每个事件最大支持32个标志位。
    3. \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_ASSERTToolKit使用断言功能
    TOOLKIT_USING_QUEUEToolKit使用循环队列功能
    TOOLKIT_USING_TIMERToolKit使用软件定时器功能
    TOOLKIT_USING_EVENTToolKit使用事件集功能
  • Queue 循环队列配置项

    宏定义描述
    TK_QUEUE_USING_CREATEQueue 循环队列使用动态创建和删除
  • Timer 软件定时器配置项

    宏定义描述
    TK_TIMER_USING_CREATETimer 软件定时器使用动态创建和删除
    TK_TIMER_USING_INTERVALTimer 软件定时器使用间隔模式
    TK_TIMER_USING_TIMEOUT_CALLBACKTimer 软件定时器使用超时回调函数
  • Event 事件集配置项

    宏定义描述
    TK_EVENT_USING_CREATEEvent 事件集使用动态创建和删除

说明:当配置TOOLKIT_USING_ASSERT后,所有功能都将会启动参数检查。

3.2 Queue 循环队列API函数

以下为详细API说明及简要示例程序,综合demo可查看tk_queue_samples.c示例。

3.2.1 动态创建队列

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

struct tk_queue *tk_queue_create(uint16_t queue_size, uint16_t max_queues, bool keep_fresh);
参数描述
queue_size缓存区大小(单位字节)
max_queues最大队列个数
keep_fresh是否为保持最新模式,true:保持最新;false:默认(存满不能再存)
返回值创建的队列对象(NULL为创建失败)

队列创建示例:

int main(int argc, char *argv[])
{
    /* 动态方式创建一个循环队"queue",缓冲区大小50字节,不保持最新 */
    struct tk_queue *queue = tk_queue_create(50, 1, false);
    if( queue == NULL){
        printf("队列创建失败!\n");
    }
    /* ... */
    /* You can add your code under here. */
    return 0;
}

3.2.2 动态删除队列

注意:当配置TOOLKIT_USING_QUEUE后,才能使用此函数。此函数需要用到free。必须为动态方式创建的队列对象。

bool tk_queue_delete(struct tk_queue *queue);
参数描述
queue要删除的队列对象
返回值true:删除成功;false:删除失败

3.2.3 静态初始化队列

bool tk_queue_init(struct tk_queue *queue, void *queuepool, uint16_t pool_size, uint16_t queue_size, bool keep_fresh);
参数描述
queue要初始化的队列对象
*queuepool队列缓存区
pool_size缓存区大小(单位字节)
queue_size队列元素大小(单位字节)
keep_fresh是否为保持最新模式,true:保持最新;false:默认(存满不能再存)
返回值true:初始化成功;false:初始化失败

队列创建示例:

int main(int argc, char *argv[])
{
    /* 定义一个循环队列 */
    struct tk_queue queue;
    /* 定义循环队列缓冲区 */
    uint8_t queue_pool[100];
    /* 静态方式创建一个循环队列"queue",缓存区为queue_pool,大小为queue_pool的大小,模式为保持最新 */
    if( tk_queue_init(&queue, queue_pool, sizeof(queue_pool), 
                      sizeof(queue_pool[0]), true) == false){
        printf("队列创建失败!\n");
    }
    /* ... */
    /* You can add your code under here. */
}

3.2.4 静态脱离队列

注意: 会使缓存区脱离与队列的关联。必须为静态方式创建的队列对象。

bool tk_queue_detach(struct tk_queue *queue);
参数描述
queue要脱离的队列对象
返回值true:脱离成功;false:脱离失败

3.2.5 清空队列

bool tk_queue_clean(struct tk_queue *queue);
参数描述
queue要清空的队列对象
返回值true:清除成功;false:清除失败

3.2.6 判断队列是否为空

bool tk_queue_empty(struct tk_queue *queue);
参数描述
queue要查询的队列对象
返回值true:空;false:不为空

3.2.7 判断队列是否已满

bool tk_queue_full(struct tk_queue *queue);
参数描述
queue要查询的队列对象
返回值true:满;false:不为满

3.2.8 从队列中读取一个元素(不从队列中删除)

bool tk_queue_peep(struct tk_queue *queue, void *pval);
参数描述
queue队列对象
*pval读取值地址
返回值true:读取成功;false:读取失败

3.2.9 移除一个元素

bool tk_queue_remove(struct tk_queue *queue);
参数描述
queue要移除元素的对象
返回值true:移除成功;false:移除失败

3.2.10 向队列压入(入队)1个元素数据

bool tk_queue_push(struct tk_queue *queue, void *val);
参数描述
queue要压入的队列对象
*val压入值
返回值true:成功;false:失败

3.2.11 从队列弹出(出队)1个元素数据

bool tk_queue_pop(struct tk_queue *queue, void *pval);
参数描述
queue要弹出的队列对象
*pval弹出值
返回值true:成功;false:失败

3.2.12 查询队列当前数据长度

uint16_t tk_queue_curr_len(struct tk_queue *queue);
参数描述
queue要查询的队列对象
返回值队列数据当前长度

3.2.13 向队列压入(入队)多个元素数据

uint16_t tk_queue_push_multi(struct tk_queue *queue, void *pval, uint16_t len);
参数描述
queue要压入的队列对象
*pval压入数据首地址
len压入元素个数
返回值实际压入个数

3.2.14 从队列弹出(出队)多个元素数据

uint16_t tk_queue_pop_multi(struct tk_queue *queue, void *pval, uint16_t len);
参数描述
queue要弹出的队列对象
*pval存放弹出数据的首地址
len希望弹出的数据个数
返回值实际弹出个数

3.3 Timer 软件定时器API函数

以下为详细API说明及简要示例程序,综合demo可查看tk_timer_samples.c示例。

3.3.1 软件定时器功能初始化

注意:此函数在使用定时器功能最初调用,目的是创建定时器列表头结点,和配置tick获取回调函数。

bool tk_timer_func_init(uint32_t (*get_tick_func)(void));
参数描述
get_tick_func获取系统tick回调函数
返回值true:初始化成功;false:初始化失败

3.3.2 动态创建定时器

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

struct tk_timer *tk_timer_create(void(*timeout_callback)(struct tk_timer *timer));
参数描述
timeout_callback定时器超时回调函数,不使用可配置为NULL
返回值创建的定时器对象(NULL为创建失败)

定时器创建示例:

/* 定义获取系统tick回调函数 */
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[])
{
    /* 初始化软件定时器功能,并配置tick获取回调函数*/
    tk_timer_func_init(get_sys_tick);
    
    /* 定义定时器指针 */
    tk_timer_t timer = NULL;
    /* 动态方式创建timer,并配置定时器超时回调函数 */
    timer = tk_timer_create((tk_timer_timeout_callback *)timer_timeout_callback);
    if (timer == NULL)
    {
        printf("定时器创建失败!\n");
        return 0;
    }
    /* ... */
    /* You can add your code under here. */
    return 0;
}

3.3.3 动态删除定时器

当配置TOOLKIT_USING_TIMER后,才能使用此函数。此函数需要用到free。必须为动态方式创建的定时器对象。

bool tk_timer_delete(struct tk_timer *timer);
参数描述
timer要删除的定时器对象
返回值true:删除成功;false:删除失败

3.3.4 静态初始化定时器

bool tk_timer_init(struct tk_timer *timer, void (*timeout_callback)(struct tk_timer *timer));
参数描述
timer要初始化的定时器对象
timeout_callback定时器超时回调函数,不使用可配置为NULL
返回值true:创建成功;false:创建失败

队列创建示例:

/* 定义获取系统tick回调函数 */
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[])
{
    /* 定义定时器timer */
    struct tk_timer timer;
    bool result = tk_timer_init( &timer,(tk_timer_timeout_callback *)timer_timeout_callback);
    if (result == NULL)
    {
        printf("定时器创建失败!\n");
        return 0;
    }
    /* ... */
    /* You can add your code under here. */
    return 0;
}

3.3.5 静态脱离定时器

注意: 会将timer从定时器链表中移除。必须为静态方式创建的定时器对象。

bool tk_timer_detach(struct tk_timer *timer);
参数描述
timer要脱离的定时器对象
返回值true:脱离成功;false:脱离失败

3.3.6 定时器启动

bool tk_timer_start(struct tk_timer *timer, tk_timer_mode mode, uint32_t delay_tick);
参数描述
timer要启动的定时器对象
mode工作模式,单次: TIMER_MODE_SINGLE;循环: TIMER_MODE_LOOP
delay_tick定时器时长(单位tick)
返回值true:启动成功;false:启动失败

3.3.7 定时器停止

bool tk_timer_stop(struct tk_timer *timer);
参数描述
timer要停止的定时器对象
返回值true:停止成功;false:停止失败

3.3.8 定时器继续

bool tk_timer_continue(struct tk_timer *timer);
参数描述
timer要继续的定时器对象
返回值true:继续成功;false:继续失败

3.3.9 定时器重启

注意:重启时长为最后一次启动定时器时配置的时长。

bool tk_timer_restart(struct tk_timer *timer);
参数描述
timer要重启的定时器对象
返回值true:重启成功;false:重启失败

3.3.10 获取定时器模式

tk_timer_mode tk_timer_get_mode(struct tk_timer *timer);
参数描述
timer要获取的定时器对象
返回值定时器模式
定时器模式描述
TIMER_MODE_SINGLE单次模式
TIMER_MODE_LOOP循环模式

3.3.11 获取定时器状态

tk_timer_state tk_timer_get_state(struct tk_timer *timer);
参数描述
timer要获取的定时器对象
返回值定时器状态
定时器模式描述
TIMER_STATE_RUNNING运行状态
TIMER_STATE_STOP停止状态
TIMER_STATE_TIMEOUT超时状态

3.3.12 定时器处理

bool tk_timer_loop_handler(void);
参数描述
返回值true:正常;false:异常,在调用此函数前,未初始化定时器功能“tk_timer_func_init”

注意:tk_timer_loop_handler函数要不断的循环调用。

3.3.13 超时回调函数

函数原型

typedef void (*timeout_callback)(struct tk_timer *timer);

说明:超时回调函数可定义多个,即一个定时器对应一个回调函数,也可多个定时器对应一个回调函数。

一对一

/* 定义两个回调函数,对应定时器timer1和timer2 */
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);

多对一

/* 定时器timer1和timer2共用一个回调函数,在回调函数做区分 */
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函数

以下为详细API说明及简要示例程序,综合demo可查看tk_event_samples.c示例。

3.4.1 动态创建一个事件

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

struct tk_event *tk_event_create(void);
参数描述
返回值创建的事件对象(NULL为创建失败)

3.4.2 动态删除一个事件

当配置TOOLKIT_USING_TIMER后,才能使用此函数。此函数需要用到free。必须为动态方式创建的事件对象。

bool tk_event_delete(struct tk_event *event);
参数描述
event要删除的事件对象
返回值true:删除成功;false:删除失败

3.4.3 静态初始化一个事件

bool tk_event_init(struct tk_event *event);
参数描述
event要初始化的事件对象
返回值true:创建成功;false:创建失败

3.4.4 发送事件标志

bool tk_event_send(struct tk_event *event, uint32_t event_set);
参数描述
event发送目标事件对象
event_set事件标志,每个标志占1Bit,发送多个标志可“|”
返回值true:发送成功;false:发送失败

3.4.5 接收事件

bool tk_event_recv(struct tk_event *event, uint32_t event_set, uint8_t option, uint32_t *recved);
参数描述
event接收目标事件对象
event_set感兴趣的标志,每个标志占1Bit,多个标志可“|”
option操作,标志与:TK_EVENT_OPTION_AND; 标志或:TK_EVENT_OPTION_OR; 清除标志:TK_EVENT_OPTION_CLEAR
返回值true:发送成功;false:发送失败

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个应用于嵌入式的通用工具包! 的相关文章

随机推荐

  • 参数类型string和const char*哪个更合理?

    已剪辑自 https mp weixin qq com s AgJpfmbbCbsyo6oqQDjHNA 看一些C 43 43 项目时 xff0c 发现有些函数传递的参数类型是const char xff0c 我在想 xff0c 为什么一个
  • C语言如何实现动态扩容的string?

    众所周知 xff0c C 43 43 中的string使用比较方便 关于C 43 43 中的string源码实现 xff0c 可以参考这篇文章 xff1a 源码分析C 43 43 的string的实现 最近工作中使用C语言 xff0c 但又
  • 一文搞懂交叉编译,Windows和Linux的交叉编译

    文章目录 什么是交叉编译为什么要交叉编译工具链的种类 我们应该怎样建立交叉编译环境在Windows下交叉编译和调试树莓派软件一 Windows下编译树莓派程序二 用WSL来编译树莓派程序三 通过gdbserver远程调试 基于 MinGW
  • 结构体对齐为什么那么重要?

    已剪辑自 https mp weixin qq com s jPTXM809vxzEBhsPT9NzwA C语言结构体对齐问题 xff0c 是面试必备问题 我参与招聘技术面试的时候 xff0c 也喜欢问这个技术点 这不是在面试时要装B xf
  • 商用飞机表明符合性的10种方法

    已剪辑自 https www cannews com cn 2022 0818 348969 shtml 每一款新型号飞机投入市场之前 xff0c 申请人通常需要采用不同的方法来获得所需的证据资料 xff0c 以表明型号设计对适航条款的符合
  • 什么是项目管理?一文了解项目管理的概念、历史、内容和方法

    已剪辑自 https www 36dianping com dianping 17 项目 是个眼下炙手可热的词 熟人见面问一句 最近忙什么项目 xff0c 已经成为职场打招呼的基本操作 项目起源很久 xff0c 可以说有人类活动时就已经存在
  • 项目管理是什么

    文章目录 一 什么是项目二 什么是项目管理三 项目管理起源四 项目管理的十大知识领域五 项目管理的五大过程和49个子过程1 启动过程2 规划 https worktile com kb tag 规划 过程3 执行过程4 监控过程5 收尾过程
  • 这10种项目管理方法,PMP项目经理备考收藏

    文章目录 1 敏捷开发 2 Scrum 3 Dev O ps 4 Scrumban 5 项目管理的知识体系 6 受控环境下的项目管理 7 六西格玛 8 瀑布开发 9 能力成熟度模型集成 10 关键链项目管理 已剪辑自 https board
  • 符合性矩阵

    已剪辑自 https mp weixin qq com s KKOgk8aJVdcKf5mFasYkhQ 编者注 xff1a 本文作者翱坤科技是一家航空工程综合服务机构 适航思维 在此衷心感谢其无私的知识和经验分享 符合性矩阵 Compli
  • 椭圆曲线密码学(ECC)原理

    1 椭圆曲线的定义 满足以下形式二元三次方程的点集 y 2 43 a x y
  • 可追踪性矩阵和需求追溯性矩阵

    文章目录 可追踪性矩阵的维基百科解释 不同类型的需求可追溯性矩阵 什么是需求可追溯性矩阵 xff08 RTM xff09 xff1f 示例模板什么是可追溯性矩阵 xff1f xff08 TM 值 xff09 什么是需求追踪矩阵 xff1f
  • 软件测试入门

    文章目录 软件测试入门系列之一 xff1a 软件测试基础 测试基础 什么是软件测试为什么软件测试很重要 xff1f 软件测试有什么好处 xff1f 软件工程测试软件测试类型软件工程中的测试策略程序测试软件测试概要 软件测试入门系列之二 xf
  • 一款专业且全面的嵌入式开发调试工具

    已剪辑自 https mp weixin qq com s UH h kxdvYz7A6eUMoYbew 不知道大家平时做嵌入式开发时用调试工具进行调试 xff0c 今天给大家分享一款专业且全面的嵌入式调试工具集 xff1a Micro L
  • 城市空中交通,万亿蛋糕?

    已剪辑自 https mp weixin qq com s biz 61 MzkzMDIxMjY3Mg 61 61 amp mid 61 2247484941 amp idx 61 1 amp sn 61 d27a1ac4054f91a2e
  • EVTOL适航

    已剪辑自 https mp weixin qq com s biz 61 MzkzMDIxMjY3Mg 61 61 amp mid 61 2247491691 amp idx 61 1 amp sn 61 c3dea36069299d2de
  • 无人机适航

    文章目录 无人机适航 xff0c 你起跑了吗 xff1f 调查谁当其冲怎么做 无人机 适航审定新政来了 xff01 01新政解读02管理分类03管理要求 无人机适航 xff0c 你起跑了吗 xff1f 无人驾驶航空器飞行管理暂行条例 xff
  • CAAC、FAA和ICAO的适航法规文件体系

    文章目录 CAAC的适航法规文件体系适航审定管理的行政体系和法规体系FAA的适航法规文件体系ICAO的适航法规文件体系 CAAC的适航法规文件体系 已剪辑自 https mp weixin qq com s KJu3 qBX5AIvRnNI
  • 适航批准形式汇总

    以下内容 xff0c 总结于公众号适航思维 文章目录 田莉蓉老师的机载电子产品设计保证实践中的说明在中国 xff0c 适航 到底有多少种证件 xff1f CTSOA取证入门来自一位适航监察员的 避坑指南 xff1a CTSOA篇PMA取证入
  • 适航工作清单

    已剪辑自 https mp weixin qq com s g2AZCqnVjuI2AUezswfr2w 编者注 xff1a 本文作者翱坤科技是一家航空工程综合服务机构 适航思维 在此衷心感谢其无私的知识和经验分享 在民用航空制造单位 xf
  • 一个应用于嵌入式的通用工具包!

    已剪辑自 https mp weixin qq com s fsVpIRmPOIkIT5lVOqt5xw 来源 xff1a https github com cproape toolkit 1 介绍 ToolKit是一套应用于嵌入式系统的通