358 lines
9.3 KiB
C
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__ */
|