91 lines
2.7 KiB
C
Executable File
91 lines
2.7 KiB
C
Executable File
/**
|
|
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
|
|
*
|
|
* Description: Timer Sample Source. \n
|
|
*
|
|
* History: \n
|
|
* 2023-07-18, Create file. \n
|
|
*/
|
|
#include "timer.h"
|
|
#include "tcxo.h"
|
|
#include "chip_core_irq.h"
|
|
#include "common_def.h"
|
|
#include "soc_osal.h"
|
|
#include "app_init.h"
|
|
|
|
#define TIMER_TIMERS_NUM 4
|
|
#define TIMER_INDEX 1
|
|
#define TIMER_PRIO 1
|
|
#define TIMER_DELAY_INT 5
|
|
#define TIMER1_DELAY_1000US 1000
|
|
#define TIMER2_DELAY_2000US 2000
|
|
#define TIMER3_DELAY_3000US 3000
|
|
#define TIMER4_DELAY_4000US 4000
|
|
#define TIMER_MS_2_US 1000
|
|
|
|
#define TIMER_TASK_PRIO 24
|
|
#define TIMER_TASK_STACK_SIZE 0x1000
|
|
|
|
typedef struct timer_info {
|
|
uint32_t start_time;
|
|
uint32_t end_time;
|
|
uint32_t delay_time;
|
|
} timer_info_t;
|
|
|
|
static uint32_t g_timer_int_count = 0;
|
|
static timer_info_t g_timers_info[TIMER_TIMERS_NUM] = {
|
|
{0, 0, TIMER1_DELAY_1000US},
|
|
{0, 0, TIMER2_DELAY_2000US},
|
|
{0, 0, TIMER3_DELAY_3000US},
|
|
{0, 0, TIMER4_DELAY_4000US}
|
|
};
|
|
|
|
/* Timed task callback function list. */
|
|
static void timer_timeout_callback(uintptr_t data)
|
|
{
|
|
uint32_t timer_index = (uint32_t)data;
|
|
g_timers_info[timer_index].end_time = uapi_tcxo_get_ms();
|
|
g_timer_int_count++;
|
|
}
|
|
|
|
static void *timer_task(const char *arg)
|
|
{
|
|
unused(arg);
|
|
timer_handle_t timer_index[TIMER_TIMERS_NUM] = { 0 };
|
|
uapi_timer_init();
|
|
uapi_timer_adapter(TIMER_INDEX, TIMER_1_IRQN, TIMER_PRIO);
|
|
|
|
for (uint32_t i = 0; i < TIMER_TIMERS_NUM; i++) {
|
|
uapi_timer_create(TIMER_INDEX, &timer_index[i]);
|
|
g_timers_info[i].start_time = uapi_tcxo_get_ms();
|
|
uapi_timer_start(timer_index[i], g_timers_info[i].delay_time, timer_timeout_callback, i);
|
|
osal_msleep(TIMER_DELAY_INT);
|
|
}
|
|
|
|
while (g_timer_int_count < TIMER_TIMERS_NUM) {
|
|
osal_msleep(TIMER_DELAY_INT);
|
|
}
|
|
|
|
for (uint32_t i = 0; i < TIMER_TIMERS_NUM; i++) {
|
|
uapi_timer_stop(timer_index[i]);
|
|
uapi_timer_delete(timer_index[i]);
|
|
osal_printk("real time[%d] = %dms ", i, (g_timers_info[i].end_time - g_timers_info[i].start_time));
|
|
osal_printk(" delay = %dms\r\n", g_timers_info[i].delay_time / TIMER_MS_2_US);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static void timer_entry(void)
|
|
{
|
|
osal_task *task_handle = NULL;
|
|
osal_kthread_lock();
|
|
task_handle = osal_kthread_create((osal_kthread_handler)timer_task, 0, "TimerTask", TIMER_TASK_STACK_SIZE);
|
|
if (task_handle != NULL) {
|
|
osal_kthread_set_priority(task_handle, TIMER_TASK_PRIO);
|
|
osal_kfree(task_handle);
|
|
}
|
|
osal_kthread_unlock();
|
|
}
|
|
|
|
/* Run the timer_entry. */
|
|
app_run(timer_entry); |