提交 08df0b8e 编写于 作者: B Bernard Xiong

prepare v3.1.3 release

上级 b2ae7d72
...@@ -54,6 +54,7 @@ extern "C" { ...@@ -54,6 +54,7 @@ extern "C" {
(RT_SUBVERSION * 100) + RT_REVISION) (RT_SUBVERSION * 100) + RT_REVISION)
/* RT-Thread basic data type definitions */ /* RT-Thread basic data type definitions */
#ifndef RT_USING_ARCH_DATA_TYPE
typedef signed char rt_int8_t; /**< 8bit integer type */ typedef signed char rt_int8_t; /**< 8bit integer type */
typedef signed short rt_int16_t; /**< 16bit integer type */ typedef signed short rt_int16_t; /**< 16bit integer type */
typedef signed long rt_int32_t; /**< 32bit integer type */ typedef signed long rt_int32_t; /**< 32bit integer type */
...@@ -62,6 +63,7 @@ typedef unsigned char rt_uint8_t; /**< 8bit unsigned inte ...@@ -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 short rt_uint16_t; /**< 16bit unsigned integer type */
typedef unsigned long rt_uint32_t; /**< 32bit unsigned integer type */ typedef unsigned long rt_uint32_t; /**< 32bit unsigned integer type */
typedef unsigned long long rt_uint64_t; /**< 64bit unsigned integer type */ typedef unsigned long long rt_uint64_t; /**< 64bit unsigned integer type */
#endif
typedef int rt_bool_t; /**< boolean type */ typedef int rt_bool_t; /**< boolean type */
/* 32bit CPU */ /* 32bit CPU */
...@@ -481,9 +483,10 @@ typedef siginfo_t rt_siginfo_t; ...@@ -481,9 +483,10 @@ typedef siginfo_t rt_siginfo_t;
#define RT_THREAD_CLOSE 0x04 /**< Closed status */ #define RT_THREAD_CLOSE 0x04 /**< Closed status */
#define RT_THREAD_STAT_MASK 0x0f #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_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 #define RT_THREAD_STAT_SIGNAL_MASK 0xf0
/** /**
......
...@@ -137,7 +137,6 @@ extern int $Super$$main(void); ...@@ -137,7 +137,6 @@ extern int $Super$$main(void);
/* re-define main function */ /* re-define main function */
int $Sub$$main(void) int $Sub$$main(void)
{ {
rt_hw_interrupt_disable();
rtthread_startup(); rtthread_startup();
return 0; return 0;
} }
...@@ -149,7 +148,6 @@ int __low_level_init(void) ...@@ -149,7 +148,6 @@ int __low_level_init(void)
{ {
// call IAR table copy function. // call IAR table copy function.
__iar_data_init3(); __iar_data_init3();
rt_hw_interrupt_disable();
rtthread_startup(); rtthread_startup();
return 0; return 0;
} }
...@@ -158,7 +156,6 @@ extern int main(void); ...@@ -158,7 +156,6 @@ extern int main(void);
/* Add -eentry to arm-none-eabi-gcc argument */ /* Add -eentry to arm-none-eabi-gcc argument */
int entry(void) int entry(void)
{ {
rt_hw_interrupt_disable();
rtthread_startup(); rtthread_startup();
return 0; return 0;
} }
......
...@@ -193,7 +193,7 @@ void rt_schedule(void) ...@@ -193,7 +193,7 @@ void rt_schedule(void)
struct rt_thread *from_thread; struct rt_thread *from_thread;
/* disable interrupt */ /* disable interrupt */
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
/* check the scheduler is enabled or not */ /* check the scheduler is enabled or not */
if (rt_scheduler_lock_nest == 0) if (rt_scheduler_lock_nest == 0)
...@@ -238,18 +238,30 @@ void rt_schedule(void) ...@@ -238,18 +238,30 @@ void rt_schedule(void)
if (rt_interrupt_nest == 0) if (rt_interrupt_nest == 0)
{ {
extern void rt_thread_handle_sig(void);
rt_hw_context_switch((rt_uint32_t)&from_thread->sp, rt_hw_context_switch((rt_uint32_t)&from_thread->sp,
(rt_uint32_t)&to_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 */ /* enable interrupt */
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
#ifdef RT_USING_SIGNALS
/* handle signal */
rt_thread_handle_sig();
#endif #endif
return ; return ;
} }
else else
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
#define RT_SIG_INFO_MAX 32 #define RT_SIG_INFO_MAX 32
#endif #endif
#define DBG_SECTION_NAME "SIGN" #define DBG_TAG "SIGN"
#define DBG_LEVEL DBG_INFO #define DBG_LVL DBG_WARNING
#include <rtdbg.h> #include <rtdbg.h>
#define sig_mask(sig_no) (1u << sig_no) #define sig_mask(sig_no) (1u << sig_no)
...@@ -36,7 +36,7 @@ struct siginfo_node ...@@ -36,7 +36,7 @@ struct siginfo_node
static struct rt_mempool *_rt_siginfo_pool; static struct rt_mempool *_rt_siginfo_pool;
static void _signal_deliver(rt_thread_t tid); 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) static void _signal_default_handler(int signo)
{ {
...@@ -46,36 +46,19 @@ static void _signal_default_handler(int signo) ...@@ -46,36 +46,19 @@ static void _signal_default_handler(int signo)
static void _signal_entry(void *parameter) static void _signal_entry(void *parameter)
{ {
register rt_base_t level;
rt_thread_t tid = rt_thread_self(); rt_thread_t tid = rt_thread_self();
while (1) /* handle signal */
{ rt_thread_handle_sig(RT_FALSE);
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;
}
}
/* never come back... */ /* return to thread */
tid->sp = tid->sig_ret; tid->sp = tid->sig_ret;
tid->sig_ret = RT_NULL; tid->sig_ret = RT_NULL;
LOG_D("switch back to: 0x%08x", tid->sp); LOG_D("switch back to: 0x%08x\n", tid->sp);
rt_hw_context_switch_to((rt_uint32_t) & (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) ...@@ -106,7 +89,7 @@ static void _signal_deliver(rt_thread_t tid)
/* resume thread to handle signal */ /* resume thread to handle signal */
rt_thread_resume(tid); rt_thread_resume(tid);
/* add signal state */ /* 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); rt_hw_interrupt_enable(level);
...@@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid) ...@@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid)
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
/* do signal action in self thread context */ /* 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)) else if (!((tid->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL))
{ {
/* add signal state */ /* 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 */ /* point to the signal handle entry */
tid->stat &= ~RT_THREAD_STAT_SIGNAL_PENDING;
tid->sig_ret = tid->sp; tid->sig_ret = tid->sp;
tid->sp = rt_hw_stack_init((void *)_signal_entry, RT_NULL, tid->sp = rt_hw_stack_init((void *)_signal_entry, RT_NULL,
(void *)((char *)tid->sig_ret - 32), RT_NULL); (void *)((char *)tid->sig_ret - 32), RT_NULL);
...@@ -327,7 +314,7 @@ __done_return: ...@@ -327,7 +314,7 @@ __done_return:
return ret; return ret;
} }
void rt_thread_handle_sig(void) void rt_thread_handle_sig(rt_bool_t clean_state)
{ {
rt_base_t level; rt_base_t level;
...@@ -335,7 +322,6 @@ void rt_thread_handle_sig(void) ...@@ -335,7 +322,6 @@ void rt_thread_handle_sig(void)
struct siginfo_node *si_node; struct siginfo_node *si_node;
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
if (tid->sig_pending & tid->sig_mask) if (tid->sig_pending & tid->sig_mask)
{ {
/* if thread is not waiting for signal */ /* if thread is not waiting for signal */
...@@ -371,8 +357,15 @@ void rt_thread_handle_sig(void) ...@@ -371,8 +357,15 @@ void rt_thread_handle_sig(void)
tid->error = error; tid->error = error;
} }
/* clean state */ /* whether clean signal status */
tid->stat &= ~RT_THREAD_STAT_SIGNAL; if (clean_state == RT_TRUE)
{
tid->stat &= ~RT_THREAD_STAT_SIGNAL;
}
else
{
return;
}
} }
} }
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册