summaryrefslogtreecommitdiff
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
parentb2ae7d72f923e1638f72d8eba5c2131389b741b0 (diff)
prepare v3.1.3 release
-rw-r--r--include/rtdef.h7
-rw-r--r--src/components.c3
-rw-r--r--src/scheduler.c26
-rw-r--r--src/signal.c61
4 files changed, 51 insertions, 46 deletions
diff --git a/include/rtdef.h b/include/rtdef.h
index f928ffb407..2b6150fa41 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 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);