From 08df0b8ea1cef35f45ee86ad2656257226cc7961 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 22 May 2019 00:45:53 +0800 Subject: [PATCH] prepare v3.1.3 release --- include/rtdef.h | 7 ++++-- src/components.c | 3 --- src/scheduler.c | 26 +++++++++++++++------ src/signal.c | 61 +++++++++++++++++++++--------------------------- 4 files changed, 51 insertions(+), 46 deletions(-) diff --git a/include/rtdef.h b/include/rtdef.h index f928ffb40..2b6150fa4 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -54,6 +54,7 @@ extern "C" { (RT_SUBVERSION * 100) + RT_REVISION) /* RT-Thread basic data type definitions */ +#ifndef RT_USING_ARCH_DATA_TYPE typedef signed char rt_int8_t; /**< 8bit integer type */ typedef signed short rt_int16_t; /**< 16bit integer type */ typedef signed long rt_int32_t; /**< 32bit integer type */ @@ -62,6 +63,7 @@ typedef unsigned char rt_uint8_t; /**< 8bit unsigned inte typedef unsigned short rt_uint16_t; /**< 16bit unsigned integer type */ typedef unsigned long rt_uint32_t; /**< 32bit unsigned integer type */ typedef unsigned long long rt_uint64_t; /**< 64bit unsigned integer type */ +#endif typedef int rt_bool_t; /**< boolean type */ /* 32bit CPU */ @@ -481,9 +483,10 @@ typedef siginfo_t rt_siginfo_t; #define RT_THREAD_CLOSE 0x04 /**< Closed status */ #define RT_THREAD_STAT_MASK 0x0f -#define RT_THREAD_STAT_SIGNAL 0x10 +#define RT_THREAD_STAT_SIGNAL 0x10 /**< task hold signals */ #define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY) -#define RT_THREAD_STAT_SIGNAL_WAIT 0x20 +#define RT_THREAD_STAT_SIGNAL_WAIT 0x20 /**< task is waiting for signals */ +#define RT_THREAD_STAT_SIGNAL_PENDING 0x40 /**< signals is held and it has not been procressed */ #define RT_THREAD_STAT_SIGNAL_MASK 0xf0 /** diff --git a/src/components.c b/src/components.c index 68e5799f5..67658afde 100644 --- a/src/components.c +++ b/src/components.c @@ -137,7 +137,6 @@ extern int $Super$$main(void); /* re-define main function */ int $Sub$$main(void) { - rt_hw_interrupt_disable(); rtthread_startup(); return 0; } @@ -149,7 +148,6 @@ int __low_level_init(void) { // call IAR table copy function. __iar_data_init3(); - rt_hw_interrupt_disable(); rtthread_startup(); return 0; } @@ -158,7 +156,6 @@ extern int main(void); /* Add -eentry to arm-none-eabi-gcc argument */ int entry(void) { - rt_hw_interrupt_disable(); rtthread_startup(); return 0; } diff --git a/src/scheduler.c b/src/scheduler.c index 4bb82bd95..07ea0e7fb 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -193,7 +193,7 @@ void rt_schedule(void) struct rt_thread *from_thread; /* disable interrupt */ - level = rt_hw_interrupt_disable(); + level = rt_hw_interrupt_disable(); /* check the scheduler is enabled or not */ if (rt_scheduler_lock_nest == 0) @@ -238,18 +238,30 @@ void rt_schedule(void) if (rt_interrupt_nest == 0) { - extern void rt_thread_handle_sig(void); - rt_hw_context_switch((rt_uint32_t)&from_thread->sp, (rt_uint32_t)&to_thread->sp); +#ifdef RT_USING_SIGNALS + if (rt_current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING) + { + extern void rt_thread_handle_sig(rt_bool_t clean_state); + + rt_current_thread->stat &= ~RT_THREAD_STAT_SIGNAL_PENDING; + + rt_hw_interrupt_enable(level); + + /* check signal status */ + rt_thread_handle_sig(RT_TRUE); + } + else + { + rt_hw_interrupt_enable(level); + } +#else /* enable interrupt */ rt_hw_interrupt_enable(level); - -#ifdef RT_USING_SIGNALS - /* handle signal */ - rt_thread_handle_sig(); #endif + return ; } else diff --git a/src/signal.c b/src/signal.c index 8ffcf13ec..02a975ee6 100644 --- a/src/signal.c +++ b/src/signal.c @@ -21,8 +21,8 @@ #define RT_SIG_INFO_MAX 32 #endif -#define DBG_SECTION_NAME "SIGN" -#define DBG_LEVEL DBG_INFO +#define DBG_TAG "SIGN" +#define DBG_LVL DBG_WARNING #include #define sig_mask(sig_no) (1u << sig_no) @@ -36,7 +36,7 @@ struct siginfo_node static struct rt_mempool *_rt_siginfo_pool; static void _signal_deliver(rt_thread_t tid); -void rt_thread_handle_sig(void); +void rt_thread_handle_sig(rt_bool_t clean_state); static void _signal_default_handler(int signo) { @@ -46,36 +46,19 @@ static void _signal_default_handler(int signo) static void _signal_entry(void *parameter) { - register rt_base_t level; rt_thread_t tid = rt_thread_self(); - while (1) - { - level = rt_hw_interrupt_disable(); - if (tid->stat & RT_THREAD_STAT_SIGNAL) - { - rt_hw_interrupt_enable(level); - - /* handle signal */ - rt_thread_handle_sig(); - } - else - { - /* - * Note: interrupt is disabled and no reentrant issue. - * - * no signal status in tid->stat. - */ - break; - } - } + /* handle signal */ + rt_thread_handle_sig(RT_FALSE); - /* never come back... */ + /* return to thread */ tid->sp = tid->sig_ret; tid->sig_ret = RT_NULL; - LOG_D("switch back to: 0x%08x", tid->sp); - rt_hw_context_switch_to((rt_uint32_t) & (tid->sp)); + LOG_D("switch back to: 0x%08x\n", tid->sp); + tid->stat &= ~RT_THREAD_STAT_SIGNAL; + + rt_hw_context_switch_to((rt_ubase_t)&(tid->sp)); } /* @@ -106,7 +89,7 @@ static void _signal_deliver(rt_thread_t tid) /* resume thread to handle signal */ rt_thread_resume(tid); /* add signal state */ - tid->stat |= RT_THREAD_STAT_SIGNAL; + tid->stat |= (RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING); rt_hw_interrupt_enable(level); @@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid) rt_hw_interrupt_enable(level); /* do signal action in self thread context */ - rt_thread_handle_sig(); + if (rt_interrupt_get_nest() == 0) + { + rt_thread_handle_sig(RT_TRUE); + } } else if (!((tid->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL)) { /* add signal state */ - tid->stat |= RT_THREAD_STAT_SIGNAL; + tid->stat |= (RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING); /* point to the signal handle entry */ + tid->stat &= ~RT_THREAD_STAT_SIGNAL_PENDING; tid->sig_ret = tid->sp; tid->sp = rt_hw_stack_init((void *)_signal_entry, RT_NULL, (void *)((char *)tid->sig_ret - 32), RT_NULL); @@ -327,7 +314,7 @@ __done_return: return ret; } -void rt_thread_handle_sig(void) +void rt_thread_handle_sig(rt_bool_t clean_state) { rt_base_t level; @@ -335,7 +322,6 @@ void rt_thread_handle_sig(void) struct siginfo_node *si_node; level = rt_hw_interrupt_disable(); - if (tid->sig_pending & tid->sig_mask) { /* if thread is not waiting for signal */ @@ -371,8 +357,15 @@ void rt_thread_handle_sig(void) tid->error = error; } - /* clean state */ - tid->stat &= ~RT_THREAD_STAT_SIGNAL; + /* whether clean signal status */ + if (clean_state == RT_TRUE) + { + tid->stat &= ~RT_THREAD_STAT_SIGNAL; + } + else + { + return; + } } } rt_hw_interrupt_enable(level); -- GitLab