From 48dd217fea20caf84e5fb0b475f88b7da4613c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=81=E5=B9=B4=E4=B8=80=E5=89=91?= <1306026910@qq.com> Date: Sun, 31 May 2026 20:34:37 +0800 Subject: [PATCH] Weakly typed function with thread stack size check --- include/rtthread.h | 1 + libcpu/arm/cortex-m3/cpuport.c | 12 ++++++++++++ src/thread.c | 26 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/include/rtthread.h b/include/rtthread.h index 177ea87783..17b0928194 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -157,6 +157,7 @@ rt_thread_t rt_thread_self(void); rt_thread_t rt_thread_find(char *name); rt_err_t rt_thread_startup(rt_thread_t thread); rt_err_t rt_thread_yield(void); +rt_err_t rt_thread_check_stack_size(rt_uint32_t stack_size); rt_err_t rt_thread_delay(rt_tick_t tick); rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick); rt_err_t rt_thread_mdelay(rt_int32_t ms); diff --git a/libcpu/arm/cortex-m3/cpuport.c b/libcpu/arm/cortex-m3/cpuport.c index 3409b6264a..1ad4a88b8d 100644 --- a/libcpu/arm/cortex-m3/cpuport.c +++ b/libcpu/arm/cortex-m3/cpuport.c @@ -352,6 +352,18 @@ void rt_hw_cpu_reset(void) SCB_AIRCR = SCB_RESET_VALUE; } +rt_err_t rt_thread_check_stack_size(rt_uint32_t stack_size) +{ + rt_uint32_t stack_min_size; + + stack_min_size = 16 * 4 + (8 * 4); + + if (stack_size < stack_min_size) + return RT_EINVAL; + + return RT_EOK; +} + #ifdef RT_USING_CPU_FFS /** * This function finds the first bit set (beginning with the least significant bit) diff --git a/src/thread.c b/src/thread.c index 745e3f774f..49df282db8 100644 --- a/src/thread.c +++ b/src/thread.c @@ -76,6 +76,15 @@ void rt_thread_resume_sethook(void (*hook)(rt_thread_t thread)) RT_OBJECT_HOOKLIST_DEFINE(rt_thread_inited); #endif /* defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) */ +/** + * @brief This function Check whether the stack size of the thread meets the minimum stack size requirement specified by the architecture. + * + */ +rt_weak rt_err_t rt_thread_check_stack_size(rt_uint32_t stack_size) +{ + return RT_EOK; +} + #ifdef RT_USING_MUTEX static void _thread_detach_from_mutex(rt_thread_t thread) { @@ -352,11 +361,18 @@ rt_err_t rt_thread_init(struct rt_thread *thread, rt_uint8_t priority, rt_uint32_t tick) { + rt_err_t ret = RT_EOK; + /* parameter check */ RT_ASSERT(thread != RT_NULL); RT_ASSERT(stack_start != RT_NULL); RT_ASSERT(tick != 0); + /* check stack size */ + ret = rt_thread_check_stack_size(stack_size); + if (ret != RT_EOK) + return ret; + /* clean memory data of thread */ rt_memset(thread, 0x0, sizeof(struct rt_thread)); @@ -561,6 +577,8 @@ rt_thread_t rt_thread_create(const char *name, rt_uint8_t priority, rt_uint32_t tick) { + rt_err_t ret = RT_EOK; + /* parameter check */ RT_ASSERT(tick != 0); @@ -572,6 +590,14 @@ rt_thread_t rt_thread_create(const char *name, if (thread == RT_NULL) return RT_NULL; + /* check stack size */ + ret = rt_thread_check_stack_size(stack_size); + if (ret != RT_EOK) + { + rt_object_delete((rt_object_t)thread); + return RT_NULL; + } + stack_start = (void *)RT_KERNEL_MALLOC(stack_size); if (stack_start == RT_NULL) { -- Gitee