doubao_chat/include_lib/system/timer.h

314 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef SYS_TIMER_H
#define SYS_TIMER_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "system/spinlock.h"
/// \cond DO_NOT_DOCUMENT
struct static_sys_timer {
void (*func)(void *priv);
void *priv;
u32 msec;
u32 jiffies;
};
struct sys_usec_timer {
void (*func)(void *priv);
void *priv;
const char *owner;
struct sys_cpu_timer *timer;
u8 call_in_irq;
u8 once;
};
#define SYS_HI_TIMER_ADD(_func, _priv, _msec) \
static struct static_sys_timer hi_timer SEC_USED(.hi_timer) = { \
.func = _func, \
.priv = _priv, \
.msec = _msec, \
}
extern struct static_sys_timer static_hi_timer_begin[];
extern struct static_sys_timer static_hi_timer_end[];
#define list_for_each_static_hi_timer(p) \
for (p=static_hi_timer_begin; p<static_hi_timer_end; p++)
struct sys_cpu_timer {
u8 busy;
spinlock_t lock;
void *priv;
void (*set)(u32 usec);
void (*unset)(void);
};
#define DEFINE_SYS_CPU_TIMER(t) \
struct sys_cpu_timer t SEC_USED(.sys_cpu_timer);
#define REGISTER_SYS_CPU_TIMER(t) \
struct sys_cpu_timer t SEC_USED(.sys_cpu_timer)
extern struct sys_cpu_timer sys_cpu_timer_begin[];
extern struct sys_cpu_timer sys_cpu_timer_end[];
#define list_for_each_cpu_usec_timer(p) \
for (p = sys_cpu_timer_begin; p < sys_cpu_timer_end; p++)
/// \endcond
/*
* System Timer
*/
/**
* @brief sys_timer定时扫描增加接口
* @param priv 私有参数
* @param func 定时扫描回调函数
* @param msec 定时时间, 单位:毫秒
* @return 定时器分配的id号
* @note timer使用说明
* 1. 系统会进入低功耗,节拍不会丢失
* 2. sys_timer由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timer,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
* 3. 与sys_timer_del成对使用
*/
u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec);
/**
* @brief sys_timer定时扫描增加接口
* @param task_name 指定任务名称
* @param priv 私有参数
* @param func 定时回调函数
* @param msec 定时时间, 单位:毫秒
* @return 定时器分配的id号
* @note timer使用说明
* 1. 系统会进入低功耗,节拍不会丢失
* 2. sys_timer由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timer,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
* 3. 与sys_timer_del成对使用
*/
u16 sys_timer_add_to_task(const char *task_name, void *priv, void (*func)(void *priv), u32 msec);
/**
* @brief sys_timer定时扫描删除接口
* @param id sys_timer_add分配的id号
* @note 与sys_timer_add成对使用
*/
void sys_timer_del(u16 id);
/**
* @brief sys_timer超时增加接口
* @param priv 私有参数
* @param func 超时扫描回调函数
* @param msec 超时时间, 单位:毫秒
* @return 定时器分配的id号
* @note timer使用说明
* 1. 系统会进入低功耗,节拍不会丢失
* 2. sys_timeout由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timeout,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
* 3. timeout回调只会被执行一次
* 4. 与sys_timeout_del成对使用
*/
u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);
/**
* @brief sys_timer超时增加接口
* @param task_name 指定任务名称
* @param priv 私有参数
* @param func 超时回调函数
* @param msec 超时时间, 单位:毫秒
* @return 定时器分配的id号
* @note timer使用说明
* 1. 系统会进入低功耗,节拍不会丢失
* 2. sys_timeout由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timeout,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
* 3. timeout回调只会被执行一次
* 4. 与sys_timeout_del成对使用
*/
u16 sys_timeout_add_to_task(const char *task_name, void *priv, void (*func)(void *priv), u32 msec);
/**
* @brief sys_timer超时删除接口
* @param id sys_timeout_add分配的id号
* @note 与sys_timeout_add成对使用
*/
void sys_timeout_del(u16 id);
/**
* @brief sys_timer定时器重置
* @param id sys_timer和分sys_timeout配的id号
* @note 在定时时间到之前进行重置之后重新计时,sys_timeout定时到之后会被删除,re_run无效
*/
void sys_timer_re_run(u16 id);
/**
* @brief sys_timer定时器设置私有参数
* @param id sys_timer分配的id号
* @param priv 私有参数
*/
void sys_timer_set_user_data(u16 id, void *priv);
/**
* @brief sys_timer定时器获取私有参数
* @param id sys_timer分配的id号
* @return 返回add时的私有参数
* @note 如果有通过sys_timer_set_user_data重新设置私有参数,则返回的是设置后的私有参数
*/
void *sys_timer_get_user_data(u16 id);
/**
* @brief sys_timer修改定时扫描时间接口
* @param id sys_timer_add和sys_timeout_add分配的id号
* @param msec 定时时间, 单位:毫秒
* @return 0
*/
int sys_timer_modify(u16 id, u32 msec);
/**
* @brief 微秒级重复定时器添加
* @param priv 私有参数
* @param func 回调函数
* @param usec 定时时间, 单位:微秒
* @param call_in_irq 回调函数是否在中断里面执行
* @param once 是否只运行一次
* @return 定时器分配的id号
* @note 微秒级定时器同一时间只能运行一个
*/
int sys_usec_timer_add(void *priv, void (*func)(void *priv), u32 usec, u8 call_in_irq, u8 once);
/**
* @brief 微秒级定时器的定时时间修改
* @param id sys_usec_timer_add分配的id号
* @param usec 定时时间, 单位:微秒
*/
void sys_usec_timer_set(int id, u32 usec);
/**
* @brief 微秒级定时器删除接口
* @param id sys_usec_timer_add分配的id号
* @note 与sys_usec_timer_add成对使用
*/
void sys_usec_timer_del(int id);
/// \cond DO_NOT_DOCUMENT
void sys_usec_timer_schedule(struct sys_cpu_timer *);
void sys_timer_dump_time(void);
int sys_timer_task_init(void);
u32 sys_timer_get_ms(void);
void usr_timer_schedule(void);
/// \endcond
/**
* @brief usr_timer定时扫描增加接口
* @param priv 私有参数
* @param func 定时扫描回调函数
* @param msec 定时时间, 单位:毫秒
* @param priority 优先级,范围:0/1
* @return 定时器分配的id号
* @note timer使用说明
* 1. usr_timer的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗
* 2. usr_timer的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是周期会变
* 3. usr_timer属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。
* 4. 对应释放接口usr_timer_del
*/
u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
/**
* @brief usr_timer超时增加接口
* @param priv 私有参数
* @param func 超时回调函数
* @param msec 超时时间, 单位:毫秒
* @param priority 优先级,范围:0/1
* @return 定时器分配的id号
* @note timer使用说明
* 1. usr_timeout的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗
* 2. usr_timeout的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是周期会变
* 3. usr_timeout属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。
* 4. 对应释放接口usr_timerout_del
* 5. timeout回调只会被执行一次
*/
u16 usr_timeout_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
/**
* @brief usr_timer修改定时扫描时间接口
* @param id usr_timer_add时分配的id号
* @param msec 定时时间, 单位:毫秒
* @return 0
*/
int usr_timer_modify(u16 id, u32 msec);
/**
* @brief usr_timeout修改超时时间接口
* @param id usr_timeout_add时分配的id号
* @param msec 超时时间, 单位:毫秒
* @return 0
*/
int usr_timeout_modify(u16 id, u32 msec);
/**
* @brief usr_timer删除接口
* @param id usr_timer_add时分配的id号
* @note 注意与usr_timer_add成对使用
*/
void usr_timer_del(u16 id);
/**
* @brief usr_timeout删除接口
* @param id usr_timerout_add时分配的id号
* @note 注意与usr_timeout_add成对使用
*/
void usr_timeout_del(u16 id);
/**
* @brief usr_time输出调试信息
* @note 调试时可用,将输出所有被add定时器的id及其时间(msec)
*/
void usr_timer_dump(void);
/// \cond DO_NOT_DOCUMENT
#define sys_hi_timer_schedule()\
usr_timer_schedule()
#define sys_hi_timer_add(a, b, c)\
usr_timer_add(a, b, c, 1)
#define sys_hi_timeout_add(a, b, c)\
usr_timeout_add(a, b, c, 1)
#define sys_hi_timer_modify(a, b)\
usr_timer_modify(a, b)
#define sys_hi_timeout_modify(a, b)\
usr_timeout_modify(a, b)
#define sys_hi_timer_del(a)\
usr_timer_del(a)
#define sys_hi_timeout_del(a)\
usr_timeout_del(a)
#define sys_s_hi_timer_add(a, b, c)\
usr_timer_add(a, b, c, 0)
#define sys_s_hi_timerout_add(a, b, c)\
usr_timeout_add(a, b, c, 0)
#define sys_s_hi_timer_modify(a, b)\
usr_timer_modify(a, b)
#define sys_s_hi_timeout_modify(a, b)\
usr_timeout_modify(a, b)
#define sys_s_hi_timer_del(a)\
usr_timer_del(a)
#define sys_s_hi_timeout_del(a)\
usr_timeout_del(a)
/// \endcond
#endif