优化代码,修改 FALLTHROUGH 宏定义,增加递归互斥锁支持,改进调度器挂起和恢复逻辑,增强命令查找功能

This commit is contained in:
LokLiang
2025-05-20 09:00:06 +08:00
parent 66f799bd1c
commit 499994b239
6 changed files with 104 additions and 63 deletions

View File

@@ -267,14 +267,14 @@ typedef struct
__dlist_t event_list;
__slist_t ready_list[8];
__slist_t delayed_list;
unsigned priority_tab;
size_t priority_tab;
k_work_t *curr_work;
k_work_handle_t *yield_work;
k_work_q_fn work_q_resume;
void *work_q_resume_arg;
k_work_fn hook_entry;
k_tick_t timeout_early;
volatile unsigned resume_flag;
volatile size_t resume_flag;
} k_work_q_handle_t;
typedef struct
@@ -298,7 +298,7 @@ typedef struct
union
{
__slist_node_t state_node;
unsigned free_flag;
size_t free_flag;
} ctrl;
} k_fifo_handle_t;
@@ -316,7 +316,7 @@ typedef struct
union
{
__slist_node_t state_node;
unsigned free_flag;
size_t free_flag;
} ctrl;
k_queue_t *queue_handle;
} k_queue_data_t;
@@ -334,8 +334,8 @@ typedef struct
static struct
{
unsigned interrupt_call;
unsigned interrupt_nest;
size_t interrupt_call;
size_t interrupt_nest;
k_work_t *curr_hook;
k_work_t *curr_log;
@@ -862,8 +862,8 @@ static void _k_work_delete(k_work_t *work_handle)
#if (CONFIG_K_KIT_LOG_ON)
{
unsigned max_index = sizeof(s_cm_kit.work_log) / sizeof(s_cm_kit.work_log[0]);
unsigned index;
size_t max_index = sizeof(s_cm_kit.work_log) / sizeof(s_cm_kit.work_log[0]);
size_t index;
if (max_index > s_cm_kit.log_index)
{
@@ -874,7 +874,7 @@ static void _k_work_delete(k_work_t *work_handle)
{
if (s_cm_kit.work_log[index] == work_handle)
{
unsigned i;
size_t i;
for (i = index; i + 1 < max_index; i++)
{
s_cm_kit.work_log[i] = s_cm_kit.work_log[i + 1];
@@ -1136,7 +1136,7 @@ static void _k_work_log(void *arg)
k_work_q_t *work_q_handle;
k_work_t *work_handle;
unsigned max_index;
size_t max_index;
_K_DIS_SCHED();
@@ -1262,30 +1262,19 @@ static void _k_work_do_submit(k_work_q_t *work_q_handle, k_work_t *work_handle,
*
* @param resume_work 已注册的任务
* @param resume_delay 唤醒延时
* @param resume_mode 预留的。 resume_delay 为非 0 时有效:
* 0 - 计时从首次收到信号后开始;
* 1 - 计时从最后一次收到信号后开始;
*/
static void _k_ipc_resume(k_work_t *resume_work, k_tick_t resume_delay, int resume_mode)
static void _k_ipc_resume(k_work_t *resume_work, k_tick_t resume_delay)
{
if (resume_work != NULL)
{
k_work_handle_t *work = resume_work->hdl;
if (work != NULL && work->work_q_handle != NULL)
{
if (resume_delay == 0)
if (k_work_time_remain(resume_work) < resume_delay)
{
if (!k_work_is_pending(resume_work))
{
_k_work_do_submit(work->work_q_handle, resume_work, _K_PORT->get_sys_ticks(), _FALSE);
}
}
else
{
if (resume_mode != 0 || !k_work_is_pending(resume_work))
{
k_work_submit(work->work_q_handle, resume_work, resume_delay);
}
k_work_submit(work->work_q_handle, resume_work, resume_delay);
}
}
}
@@ -1521,7 +1510,7 @@ k_err_t k_work_q_create(k_work_q_t *work_q_handle)
work_q = _K_PORT->malloc(sizeof(k_work_q_handle_t));
if (work_q != NULL)
{
unsigned i;
size_t i;
memset(work_q, 0, sizeof(*work_q));
work_q_handle->hdl = work_q;
@@ -1714,6 +1703,28 @@ bool k_work_q_ready_state(k_work_q_t *work_q_handle)
}
}
k_err_t k_work_create_default(k_work_t *work_handle,
const char *name,
k_work_fn work_route,
void *arg,
uint8_t priority,
k_tick_t delay_ticks)
{
if (!k_work_is_valid(work_handle))
{
k_err_t ret = k_work_create(work_handle, name, work_route, arg, priority);
if (ret == 0)
{
k_work_submit(default_work_q_hdl, work_handle, delay_ticks);
}
return ret;
}
else
{
return 0;
}
}
/**
* @brief 创建由工作队列管理的任务
* 任务对象数据由堆内存自动分配
@@ -1868,6 +1879,8 @@ bool k_work_is_pending(k_work_t *work_handle)
*/
k_tick_t k_work_time_remain(k_work_t *work_handle)
{
_TEST_HANDLE(work_handle, return -1);
k_work_handle_t *work = work_handle->hdl;
k_tick_t ret = 0;
@@ -1900,7 +1913,7 @@ void k_work_submit(k_work_q_t *work_q_handle, k_work_t *work_handle, k_tick_t de
}
else
{
if ((unsigned)delay_ticks > _SIGNED_MAX(delay_ticks))
if ((size_t)delay_ticks > _SIGNED_MAX(delay_ticks))
{
delay_ticks = _SIGNED_MAX(delay_ticks);
}
@@ -1916,19 +1929,15 @@ void k_work_submit(k_work_q_t *work_q_handle, k_work_t *work_handle, k_tick_t de
*/
void k_work_resume(k_work_t *work_handle, k_tick_t delay_ticks)
{
_TEST_HANDLE(work_handle, return);
k_work_handle_t *work = work_handle->hdl;
if (work->work_q_handle == NULL)
if ((size_t)delay_ticks > _SIGNED_MAX(delay_ticks))
{
_DBG_WRN("you must using k_work_submit() to define one work_queue first");
}
else
{
if ((unsigned)delay_ticks > _SIGNED_MAX(delay_ticks))
{
delay_ticks = _SIGNED_MAX(delay_ticks);
}
k_work_submit(work->work_q_handle, work_handle, delay_ticks);
delay_ticks = _SIGNED_MAX(delay_ticks);
}
k_work_submit(work->work_q_handle, work_handle, delay_ticks);
}
/**
@@ -1941,7 +1950,7 @@ void k_work_later(k_tick_t delay_ticks)
k_work_q_t *work_q_handle;
k_work_t *work_handle;
_k_read_curr_handle(&work_q_handle, &work_handle);
if ((unsigned)delay_ticks > _SIGNED_MAX(delay_ticks))
if ((size_t)delay_ticks > _SIGNED_MAX(delay_ticks))
{
delay_ticks = _SIGNED_MAX(delay_ticks);
}
@@ -1996,7 +2005,7 @@ void k_work_later_until(k_tick_t delay_ticks)
_k_read_curr_handle(&work_q_handle, &work_handle);
work = work_handle->hdl;
if ((unsigned)delay_ticks > _SIGNED_MAX(delay_ticks))
if ((size_t)delay_ticks > _SIGNED_MAX(delay_ticks))
{
delay_ticks = _SIGNED_MAX(delay_ticks);
}
@@ -2048,7 +2057,7 @@ void k_work_sleep(k_tick_t delay_ticks)
_ASSERT_FALSE(s_kit_init_struct.malloc == NULL, "Never use 'k_init()' to initialize");
if ((unsigned)delay_ticks > _SIGNED_MAX(delay_ticks))
if ((size_t)delay_ticks > _SIGNED_MAX(delay_ticks))
{
delay_ticks = _SIGNED_MAX(delay_ticks);
}
@@ -2753,7 +2762,7 @@ void k_timer_set_period(k_timer_t *timer_handle, bool periodic, k_tick_t period)
k_work_handle_t *work = timer_handle->hdl;
if (work)
{
if ((unsigned)period > _SIGNED_MAX(period))
if ((size_t)period > _SIGNED_MAX(period))
{
period = _SIGNED_MAX(period);
}
@@ -2946,7 +2955,7 @@ void k_timer_cancel(k_timer_q_t *timer_q_handle, k_timer_fn timer_route)
do
{
unsigned i;
size_t i;
for (i = 0; i < sizeof(work_q->ready_list) / sizeof(work_q->ready_list[0]); i++)
{
__slist_t *test_list = &work_q->ready_list[i];
@@ -3323,7 +3332,7 @@ k_err_t k_fifo_put(k_fifo_t *fifo_handle, void *data)
if (resume_flag)
{
_k_ipc_resume(fifo_q->resume_work, fifo_q->resume_delay, 0);
_k_ipc_resume(fifo_q->resume_work, fifo_q->resume_delay);
}
return 0;
@@ -3745,7 +3754,7 @@ k_err_t k_queue_put(void *data)
if (resume_flag)
{
_k_ipc_resume(queue->resume_work, queue->resume_delay, 0);
_k_ipc_resume(queue->resume_work, queue->resume_delay);
}
return 0;
@@ -4026,7 +4035,7 @@ size_t k_pipe_poll_write(k_pipe_t *pipe_handle, uint8_t data)
if (resume_flag)
{
_k_ipc_resume(pipe->resume_work, pipe->resume_delay, 0);
_k_ipc_resume(pipe->resume_work, pipe->resume_delay);
}
return 1;
@@ -4096,7 +4105,7 @@ size_t k_pipe_fifo_fill(k_pipe_t *pipe_handle, const void *data, size_t size)
if (resume_flag && ret)
{
_k_ipc_resume(pipe->resume_work, pipe->resume_delay, 0);
_k_ipc_resume(pipe->resume_work, pipe->resume_delay);
}
return ret;
@@ -4366,7 +4375,7 @@ void k_log_sched(void)
#if (CONFIG_K_KIT_LOG_ON)
#define _WORK_NAME(WORK) ((k_work_handle_t *)WORK->hdl)->name
k_work_t *work = s_cm_kit.curr_hook;
unsigned flag;
size_t flag;
if (s_cm_kit.curr_log == work)
{
@@ -4383,9 +4392,9 @@ void k_log_sched(void)
do
{
unsigned index;
size_t index;
const char *arg;
unsigned max_index;
size_t max_index;
flag = 0;
@@ -4421,7 +4430,7 @@ void k_log_sched(void)
}
else
{
unsigned i;
size_t i;
CONFIG_K_KIT_PRINT(" ==> '" _COLOR_C "%s" _COLOR_END "'", arg);