mcu_hi3321_watch/kernel/osal/include/time/osal_timer.h
2025-05-26 20:15:20 +08:00

358 lines
9.3 KiB
C

/*
* Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
* Description: OS Abstract Layer.
*/
/**
* @defgroup osal_timer osal_timer
*/
#ifndef __OSAL_TIMER_H__
#define __OSAL_TIMER_H__
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
typedef struct {
void *timer;
void (*handler)(unsigned long);
unsigned long data; // data for handler
unsigned int interval; // timer timing duration, unit: ms.
} osal_timer;
typedef struct {
long tv_sec;
long tv_usec;
} osal_timeval;
typedef struct {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
} osal_rtc_time;
/**
* @ingroup osal_timer
* @brief Initialize the timer.
*
* @par Description:
* Initialize the timer.
*
* @param timer [in/out] The timer to be initialized.
* Assign values to timer->handler and timer->data before calling this interface,
* because you will not be able to change them after that.
*
* @attention
* When mod exit, must call osal_timer_destroy to free the timer, otherwise will lead to memory leak;
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux liteos freertos.
*/
int osal_timer_init(osal_timer *timer);
/**
* @ingroup osal_timer
* @brief start a timer.
*
* @par Description:
* start a timer.
*
* @attention
* The kernel will do a ->function(@timer) callback from the timer interrupt at the ->expires point in the future.
* The timer's ->expires, ->function fields must be set prior calling this function.
* Timers with an ->expires field in the past will be executed in the next timer tick.
*
* @param timer [in] the timer to be start.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux liteos freertos.
*/
int osal_timer_start(osal_timer *timer);
/**
* @ingroup osal_timer
* @brief modify a timer's timeout.
*
* @par Description:
* modify a timer's timeout. This API is a more efficient way to update the expire field of an active timer
* (if the timer is inactive it will be activated).
*
* @param timer [in] the timer to be modified.
* @param interval [in] new timeout, unit: ms.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux liteos freertos.
*/
int osal_timer_mod(osal_timer *timer, unsigned int interval);
/**
* @ingroup osal_timer
* @brief Start a timer on a particular CPU.
*
* @par Description:
* Start a timer on a particular CPU.
*
* @param timer [in] the timer to be added.
* @param cpu [in] the CPU to start it on.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux.
*/
int osal_timer_start_on(osal_timer *timer, unsigned long delay, int cpu);
/**
* @ingroup osal_timer
* @brief Deactivate a timer.
*
* @par Description:
* Deactivate a timer. This works on both active and inactive timers.
*
* @param timer [in] the timer to be deactivated.
*
* @retval 1 stop success, timer is pengding. (Only Linux and LiteOS are supported return 1)
* @retval OSAL_SUCCESS stop success, timer is already stoped.
* @retval OSAL_FAILURE
*
* @par Support System:
* linux liteos freertos.
*/
int osal_timer_stop(osal_timer *timer);
/**
* @ingroup osal_timer
* @brief destroy the timer.
*
* @par Description:
* destroy the timer.
*
* @param timer [in] The timer to be destroyed.
*
* @attention
* When mod exit, this function must be called to free the timer, otherwise will lead to memory leak;
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux liteos freertos.
*/
int osal_timer_destroy(osal_timer *timer);
/**
* @ingroup osal_timer
* @brief get_private_data by timer.
*
* @par Description:
* The parameters of the timer callback function cannot be directly used.
* You need to invoke this interface in the callback function to obtain the parameters that can be used.
*
* @param sys_data [in] Parameters passed to the callback function.
*
* @return Returns the parameters that can be used directly.
*
* @par Support System:
* linux liteos freertos.
*/
unsigned long osal_timer_get_private_data(const void *sys_data);
/**
* @ingroup osal_timer
* @brief deactivate a timer and wait for the handler to finish.
*
* @par Description:
* This function only differs from del_timer() on SMP,
* besides deactivating the timer it also makes sure the handler has finished executing on other CPUs.
*
* @attention
* Synchronization rules: Callers must prevent restarting of the timer, otherwise this function is meaningless.
* It must not be called from interrupt contexts unless the timer is an irqsafe one.
* The caller must not hold locks which would prevent completion of the timer's handler.
* The timer's handler must not call add_timer_on().
* Upon exit the timer is not queued and the handler is not running on any CPU.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux.
*/
int osal_timer_destroy_sync(osal_timer *timer);
/**
* @ingroup osal_timer
* @brief Obtain system time in nanoseconds.
*
* @par Description:
* Obtain system time in nanoseconds.
*
* @return returns current time in nanoseconds.
*
* @par Support System:
* linux liteos.
*/
unsigned long long osal_sched_clock(void);
/**
* @ingroup osal_timer
* @brief Obtain the number of Ticks(in liteos) or jiffies(in linux).
*
* @par Description:
* Obtain the number of Ticks(in liteos) or jiffies(in linux).
*
* @return Return the number of Ticks(in liteos) or jiffies(in linux).
*
* @par Support System:
* linux liteos freertos.
*/
unsigned long long osal_get_jiffies(void);
/**
* @ingroup osal_timer
* @brief Convert milliseconds to Ticks/jiffies.
*
* @par Description:
* Convert milliseconds to Ticks/jiffies.
*
* @param m [in] The time to be converted. Unit: ms.
* @return Ticks/jiffies after conversion
*
* @par Support System:
* linux liteos freertos.
*/
unsigned long osal_msecs_to_jiffies(const unsigned int m);
/**
* @ingroup osal_timer
* @brief Convert Ticks/jiffies to milliseconds.
*
* @par Description:
* Convert Ticks/jiffies to milliseconds.
*
* @return Milliseconds obtained through the conversion,
* if value > 0xFFFFFFFF, the value will be 0xFFFFFFFF.
*
* @param n [in] Number of Ticks/jiffies be converted.
*
* @par Support System:
* linux liteos freertos.
*/
unsigned int osal_jiffies_to_msecs(const unsigned int n);
/**
* @ingroup osal_timer
* @brief Obtain the number of cycles in one tick.
*
* @par Description:
* This API is used to obtain the number of cycles in one tick.
*
* @return Number of cycles in one tick.
*
* @par Support System:
* liteos.
*/
unsigned int osal_get_cycle_per_tick(void);
/**
* @ingroup osal_timer
* @brief Obtaining the Current System Kernel Time.
*
* @par Description:
* Obtaining the Current System Kernel Time.
*
* @param tv [out] Obtained Current System Kernel Time.
*
* @par Support System:
* linux liteos freertos.
*/
void osal_gettimeofday(osal_timeval *tv);
/* Return values for the timer callback function */
typedef enum {
OSAL_HRTIMER_NORESTART, /* < The timer will not be restarted. */
OSAL_HRTIMER_RESTART /* < The timer must be restarted. */
} osal_hrtimer_restart;
/* hrtimer struct */
typedef struct osal_hrtimer {
void *timer;
osal_hrtimer_restart (*handler)(void *timer);
unsigned long interval; /* Unit ms */
} osal_hrtimer;
/**
* @ingroup osal_timer
* @brief Create a high-resolution timer.
*
* @par Description:
* This API is used to create a high-resolution timer node and initialize timer parameters.
*
* @param hrtimer [in/out] The hrtimer to be initialized.
* Assign values to hrtimer->handler and hrtimer->interval before calling this interface,
* because you will not be able to change them after that.
*
* @attention
* When mod exit, must call osal_hrtimer_destroy to free the timer, otherwise will lead to memory leak;
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* liteos.
*/
int osal_hrtimer_create(osal_hrtimer *hrtimer);
/**
* @ingroup osal_timer
* @brief Start a high-resolution timer.
*
* @par Description:
* This API is used to add a high-resolution timer node to the global linked list and start timing.
*
* @retval -1 The high-resolution timer fails to be started.
* @retval 0 The high-resolution timer is successfully started.
* @retval 1 The high-resolution timer node is already in the linked list.
*
* @par Support System:
* liteos.
*/
int osal_hrtimer_start(osal_hrtimer *hrtimer);
/**
* @ingroup osal_timer
* @brief Delete an existing high-resolution timer.
*
* @par Description:
* Delete an existing high-resolution timer.
*
* @attention
* If the pointer to the high-resolution timer is null or the timer node does not exist,
* the high-resolution timer fails to be deleted.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* liteos.
*/
int osal_hrtimer_destroy(osal_hrtimer *hrtimer);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif /* __OSAL_TIMER_H__ */