Files
TAIXIN/sdk/osal/ohos/timer.c

151 lines
3.4 KiB
C
Raw Normal View History

#include "typesdef.h"
#include "errno.h"
#include "list.h"
#include "osal/string.h"
#include "osal/event.h"
#ifdef OHOS
#include "los_event.h"
#include "los_membox.h"
#include "los_memory.h"
#include "los_interrupt.h"
#include "los_mux.h"
#include "los_queue.h"
#include "los_sem.h"
#include "los_swtmr.h"
#include "los_task.h"
#include "los_timer.h"
#include "los_debug.h"
#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
#include "los_arch.h"
#endif
#include "osal/timer.h"
#define TIMER_MAGIC (0x6a7b3c4d)
static void _os_timer_cb(void *args)
{
uint64 t1, t2, t3;
os_timer_t *timer = (os_timer_t *)args;
timer->trigger_cnt++;
t1 = os_jiffies();
timer->cb(timer->data);
t2 = os_jiffies();
t3 = t2 - t1;
timer->total_time += t3;
if (t3 > timer->max_time) {
timer->max_time = t3;
}
if (timer->mode == OS_TIMER_MODE_ONCE) {
timer->hdl = NULL;
}
}
static int32 _os_timer_create(os_timer_t *timer, int32 interval)
{
int32 ret;
UINT32 hdl = 0;
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
ret = LOS_SwtmrCreate(interval, timer->mode, (SWTMR_PROC_FUNC)_os_timer_cb, &hdl, (UINT32)timer, 1, 0);
#else
ret = LOS_SwtmrCreate(interval, timer->mode, (SWTMR_PROC_FUNC)_os_timer_cb, &hdl, (UINT32)timer);
#endif
if (ret == LOS_OK) {
timer->hdl = (void *)(hdl + 1);
timer->magic = TIMER_MAGIC;
}
return ret;
}
int os_timer_init(os_timer_t *timer, os_timer_func_t func, enum OS_TIMER_MODE mode, void *arg)
{
int32 ret = RET_OK;
if(timer->magic == TIMER_MAGIC){
os_printf(KERN_WARNING"timer repeat initialization ????\r\n");
}
memset(timer, 0, sizeof(os_timer_t));
timer->cb = func;
timer->data = arg;
timer->mode = mode;
if (mode == OS_TIMER_MODE_PERIODIC) {
ret = _os_timer_create(timer, 1);
}
return ret;
}
int os_timer_start(os_timer_t *timer, unsigned long expires)
{
int ret = RET_ERR;
UINT32 intSave;
UINT32 hdl;
SWTMR_CTRL_S *swtmr = NULL;
intSave = LOS_IntLock();
switch (timer->mode) {
case OS_TIMER_MODE_ONCE:
if (timer->hdl) os_timer_del(timer);
ret = _os_timer_create(timer, LOS_MS2Tick(expires));
break;
case OS_TIMER_MODE_PERIODIC:
if (timer->hdl) {
hdl = (UINT32)timer->hdl;
swtmr = OS_SWT_FROM_SID(hdl - 1);
swtmr->uwInterval = LOS_MS2Tick(expires);
if (swtmr->uwInterval == 0) {
swtmr->uwInterval = 1;
}
ret = RET_OK;
}
break;
default:
break;
}
if (ret == LOS_OK) {
hdl = (UINT32)timer->hdl;
ret = LOS_SwtmrStart(hdl - 1);
}
LOS_IntRestore(intSave);
return ret;
}
int os_timer_stop(os_timer_t *timer)
{
int ret = 0;
UINT32 hdl = (UINT32)timer->hdl;
//ASSERT(timer->hdl);
if (timer->hdl) {
ret = LOS_SwtmrStop(hdl - 1);
}
return 0;
}
int os_timer_del(os_timer_t *timer)
{
int ret = 0;
UINT32 hdl = (UINT32)timer->hdl;
//ASSERT(timer->hdl);
if (timer->hdl) {
ret = LOS_SwtmrDelete(hdl - 1);
timer->hdl = 0;
timer->magic = 0;
}
return 0;
}
int os_timer_stat(os_timer_t *timer)
{
uint32 ticks = 0;
UINT32 hdl = (UINT32)timer->hdl;
if (timer->hdl) {
return LOS_SwtmrTimeGet(hdl - 1, &ticks);
}
return ticks ? 1 : 0;
}
#endif