From f962cf6919d52bf5ea2c436c448c031aa275a131 Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Wed, 11 Oct 2023 09:34:14 +0800 Subject: [PATCH] fix timer bug in posix_support for XiZi kernel --- .../xizi/user_api/posix_support/timer.c | 8 +++----- .../XiZi_IIoT/kernel/kernel_service/xs_service.c | 13 +++++++++---- Ubiquitous/XiZi_IIoT/kernel/thread/softtimer.c | 4 +++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/timer.c b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/timer.c index ee061b545..e302c0a4a 100644 --- a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/timer.c +++ b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/timer.c @@ -57,7 +57,6 @@ int timer_create(clockid_t clockid, struct sigevent * evp, timer_t * timerid) { int timer_id; char timer_name[16]; - sem_t sem; if ((NULL == evp) || (NULL == timerid)) { errno = EINVAL; @@ -73,8 +72,7 @@ int timer_create(clockid_t clockid, struct sigevent * evp, timer_t * timerid) memset(timer_name, 0, sizeof(timer_name)); snprintf(timer_name, sizeof(timer_name), "timer_%ld", clockid); - sem = timer_sem[clockid]; - sem_init(&sem, 0, 0); + sem_init(&(timer_sem[clockid]), 0, 0); g_timer_func[clockid].value = evp->sigev_value; g_timer_func[clockid].user_timer_function = evp->sigev_notify_function; @@ -89,8 +87,8 @@ int timer_create(clockid_t clockid, struct sigevent * evp, timer_t * timerid) args.arg = &clockid; pthread_create(&(timer_task[clockid]), &attr, &timer_callback, (void *)&args); - - timer_id = UserTimerCreate(timer_name, NULL, (void *)&(timer_sem[clockid]), 1000, g_timer_func[clockid].timer_flags); + + timer_id = UserTimerCreate(timer_name, NULL, (void *)&(timer_sem[clockid]), clockid, g_timer_func[clockid].timer_flags); *timerid = timer_id; return timer_id; } diff --git a/Ubiquitous/XiZi_IIoT/kernel/kernel_service/xs_service.c b/Ubiquitous/XiZi_IIoT/kernel/kernel_service/xs_service.c index d857f2cd5..5e0e30a2b 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/kernel_service/xs_service.c +++ b/Ubiquitous/XiZi_IIoT/kernel/kernel_service/xs_service.c @@ -775,19 +775,24 @@ uint8_t UserGetTaskPriority(int32_t id) } #ifdef KERNEL_SOFTTIMER -static int32 timer_sem; +#define TIMER_NUM 20 +static int32 timer_sem[TIMER_NUM]; +static uint32_t timer_id[TIMER_NUM]; static void UserTimerCallback(void *parameter) { - KSemaphoreAbandon(timer_sem); + uint32_t timer_id = *((uint32_t *)parameter); + KSemaphoreAbandon(timer_sem[timer_id]); } int32 UserTimerCreate(const char *name, void (*timeout)(void *parameter), void *parameter, uint32_t time, uint8_t trigger_mode) { int32 ret; - timer_sem = *((int *)parameter); + timer_id[time] = time; + timer_sem[time] = *((int *)parameter); + + ret = KCreateTimer(name, UserTimerCallback, (void *)&(timer_id[time]), 1000, trigger_mode); - ret = KCreateTimer(name, UserTimerCallback, NONE, time, trigger_mode); return ret; } diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/softtimer.c b/Ubiquitous/XiZi_IIoT/kernel/thread/softtimer.c index f08f3d1cb..6ad68fd84 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/thread/softtimer.c +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/softtimer.c @@ -301,7 +301,9 @@ void CheckTimerList(void) ((WorkQueueDoneType *)sys_workq->done)->WorkSubmit((WorkqueueType *)sys_workq->property, t->t_work, 0); lock = CriticalAreaLock(); } else { - KPrintf("sortlist run unactive timer(%s), quit this timer\n", t->name); + // KPrintf("sortlist run unactive timer(%s), current %d deadline %d quit this timer\n", + // t->name, current_tick, t->deadline_timeslice); + break; } } else