打印
[单片机芯片]

软件定时器框架

[复制链接]
845|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MacRsh|  楼主 | 2023-7-5 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
软件定时器文档
软件定时器是一种在软件层面实现计时功能的机制,通过软件定时器,可以在特定时间点或时间间隔触发特定的事件。软件定时器常用于实现周期性任务、超时处理、定时器中断等功能。

软件定时器包含两个主要组件:定时服务器和定时客户端。

定时服务器用于时间管理和定时器处理。
定时客户端用于处理特定的超时处理,它需要注册到定时服务器并提供一个回调函数。
软件定时器服务原型
/* 定时服务器 */
struct soft_timer_server
{
    uint32_t time;                                                  /* 当前时间 */
    struct soft_timer_list list;                                    /* 定时器链表 */
};
time:当前时间(从定时器启动到现在过去的时间)。
list:定时器链表(用于存储定时客户端)。
struct soft_timer_client
{
    struct soft_timer_list list;                                    /* 定时器链表 */
    soft_timer_server_t server;                                     /* 所属的服务器 */
    uint32_t interval;                                              /* 定时间隔时间 */
    uint32_t timeout;                                               /* 下次超时时间 */

    int (*cb)(soft_timer_client_t client, void *args);              /* 超时回调函数 */
    void *args;                                                     /* 超时回调函数参数 */        
};
list:定时器链表(用于挂载到服务器)。
server:所属的服务器。
interval:定时间隔时间(初始化时设置)。
timeout:下次超时时间。
cb:回调函数。
args:回调函数参数。
初始化服务器
void soft_timer_server_init(soft_timer_server_t server);
参数        描述
server        服务器句柄
更新服务器时间
void soft_timer_server_update(soft_timer_server_t server, uint32_t time);
参数        描述
server        服务器句柄
time        更新过去的时间
服务器检查超时定时器,唤醒客户端
void soft_timer_server_handle(soft_timer_server_t server);
参数        描述
server        服务器句柄
添加新客户端
int soft_timer_client_add(soft_timer_client_t client,
                          uint32_t time,
                          int (*cb)(soft_timer_client_t client, void *args),
                          void *args,
                          soft_timer_server_t server);
参数        描述
client        客户端句柄
time        客户端超时时间
cb        回调函数
args        回调函数参数
server        服务器句柄
返回       
SOFT_TIMER_ERR_OK        添加成功
错误码        添加失败
移除客户端
int soft_timer_client_remove(soft_timer_client_t client);
参数        描述
client        客户端句柄
返回       
SOFT_TIMER_ERR_OK        移除成功
错误码        移除失败
启动客户端
int soft_timer_client_start(soft_timer_client_t client);
参数        描述
client        客户端句柄
返回       
SOFT_TIMER_ERR_OK        启动成功
错误码        启动失败
暂停客户端
int soft_timer_client_stop(soft_timer_client_t client);
参数        描述
client        客户端句柄
返回       
SOFT_TIMER_ERR_OK        暂停成功
错误码        暂停失败
添加并启动新客户端
int soft_timer_client_add_then_start(soft_timer_client_t client,
                                     uint32_t time,
                                     int (*cb)(soft_timer_client_t client, void *args),
                                     void *args,
                                     soft_timer_server_t server);
参数        描述
client        客户端句柄
time        客户端超时时间
cb        回调函数
args        回调函数参数
server        服务器句柄
返回       
SOFT_TIMER_ERR_OK        添加成功
错误码        添加失败
使用示例:

/* 定义定时器服务器和客户端 */
struct soft_timer_server server;
struct soft_timer_client timer1, timer2, timer3;

int timer1_callback(soft_timer_client_t client, void *args)
{
    printf("timer1_callback\r\n");
    return MR_ERR_OK;
}

int timer2_callback(soft_timer_client_t client, void *args)
{
    printf("timer2_callback\r\n");
    return MR_ERR_OK;
}

int timer3_callback(soft_timer_client_t client, void *args)
{
    printf("timer3_callback\r\n");
    soft_timer_client_stop(client);
    return MR_ERR_OK;
}

int main(void)
{
    /* 初始化服务器 */
    soft_timer_server_init(&server);
   
    /* 添加客户端到服务器并启动 */
    soft_timer_client_add_then_start(&timer1, 5, timer1_callback, MR_NULL, &server);
    soft_timer_client_add_then_start(&timer2, 10, timer2_callback, MR_NULL, &server);
    soft_timer_client_add_then_start(&timer3, 15, timer3_callback, MR_NULL, &server);
        
    while (1)
    {
        /* 更新服务器时钟 */
        soft_timer_server_update(&server, 1);
        
        /* 服务器处理客户端超时(放在哪里,回调就将在哪里被调用) */
        soft_timer_server_handle(&server);
    }
}
下载代码(https://gitee.com/MacRsh/mr-library/tree/master/)(路径:mr-library/ package / soft_timer)
许可协议
遵循 Apache License 2.0 开源许可协议,可免费应用于商业产品,无需公开私有代码。

使用特权

评论回复
沙发
caigang13| | 2023-7-7 08:42 | 只看该作者
软件定时器就是利用硬件定时器时基来做

使用特权

评论回复
板凳
tpgf| | 2023-8-3 16:17 | 只看该作者
在低功耗下和不在低功耗的处理模式是不同的吧

使用特权

评论回复
地板
qcliu| | 2023-8-3 16:46 | 只看该作者
软件定时器的精度一般依靠什么来保证呢

使用特权

评论回复
5
drer| | 2023-8-3 17:15 | 只看该作者
为什么使用定时器会有这么多的错误码呢

使用特权

评论回复
6
coshi| | 2023-8-3 17:32 | 只看该作者
这些错误码都是咱们自己定义的吗

使用特权

评论回复
7
kxsi| | 2023-8-4 10:22 | 只看该作者
如果定时时间比较长的话 如何进行校对呢

使用特权

评论回复
8
wiba| | 2023-8-4 10:50 | 只看该作者
为什么要设定这么多的参数呀  基本的定时用不上吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

1

粉丝