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

prepare v3.1.3 release

上级 b2ae7d72
......@@ -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
/**
......
......@@ -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;
}
......
......@@ -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
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册