summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2019-05-22 00:45:53 +0800
committerBernard Xiong <[email protected]>2019-05-22 00:45:53 +0800
commit08df0b8ea1cef35f45ee86ad2656257226cc7961 (patch)
treee691dfd49a3a58de98599b378d8774a703778e3d /src
parentb2ae7d72f923e1638f72d8eba5c2131389b741b0 (diff)
prepare v3.1.3 release
Diffstat (limited to 'src')
-rw-r--r--src/components.c3
-rw-r--r--src/scheduler.c26
-rw-r--r--src/signal.c61
3 files changed, 46 insertions, 44 deletions
diff --git a/src/components.c b/src/components.c
index 68e5799f59..67658afde5 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 4bb82bd95c..07ea0e7fb1 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 8ffcf13ece..02a975ee6f 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 <rtdbg.h>
#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);