diff --git a/include/rtthread.h b/include/rtthread.h index 177ea877831eb85fec132add328a2e960eee0197..17b0928194b21da4269b74a619355a4f9dda50e9 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 3409b6264a94fbd5c8e287bd80c1b87802bd62e4..1ad4a88b8d26382ee02d0f110135a6ce2c7840ca 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 745e3f774f22b6c25145fb12d4b3d25da107a8ad..49df282db890777d8ab2a4cb9c9ce19b43ed18f5 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) {