Skip to content

Commit 08df0b8

Browse files
committed
prepare v3.1.3 release
1 parent b2ae7d7 commit 08df0b8

File tree

4 files changed

+51
-46
lines changed

4 files changed

+51
-46
lines changed

include/rtdef.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern "C" {
5454
(RT_SUBVERSION * 100) + RT_REVISION)
5555

5656
/* RT-Thread basic data type definitions */
57+
#ifndef RT_USING_ARCH_DATA_TYPE
5758
typedef signed char rt_int8_t; /**< 8bit integer type */
5859
typedef signed short rt_int16_t; /**< 16bit integer type */
5960
typedef signed long rt_int32_t; /**< 32bit integer type */
@@ -62,6 +63,7 @@ typedef unsigned char rt_uint8_t; /**< 8bit unsigned inte
6263
typedef unsigned short rt_uint16_t; /**< 16bit unsigned integer type */
6364
typedef unsigned long rt_uint32_t; /**< 32bit unsigned integer type */
6465
typedef unsigned long long rt_uint64_t; /**< 64bit unsigned integer type */
66+
#endif
6567
typedef int rt_bool_t; /**< boolean type */
6668

6769
/* 32bit CPU */
@@ -481,9 +483,10 @@ typedef siginfo_t rt_siginfo_t;
481483
#define RT_THREAD_CLOSE 0x04 /**< Closed status */
482484
#define RT_THREAD_STAT_MASK 0x0f
483485

484-
#define RT_THREAD_STAT_SIGNAL 0x10
486+
#define RT_THREAD_STAT_SIGNAL 0x10 /**< task hold signals */
485487
#define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
486-
#define RT_THREAD_STAT_SIGNAL_WAIT 0x20
488+
#define RT_THREAD_STAT_SIGNAL_WAIT 0x20 /**< task is waiting for signals */
489+
#define RT_THREAD_STAT_SIGNAL_PENDING 0x40 /**< signals is held and it has not been procressed */
487490
#define RT_THREAD_STAT_SIGNAL_MASK 0xf0
488491

489492
/**

src/components.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ extern int $Super$$main(void);
137137
/* re-define main function */
138138
int $Sub$$main(void)
139139
{
140-
rt_hw_interrupt_disable();
141140
rtthread_startup();
142141
return 0;
143142
}
@@ -149,7 +148,6 @@ int __low_level_init(void)
149148
{
150149
// call IAR table copy function.
151150
__iar_data_init3();
152-
rt_hw_interrupt_disable();
153151
rtthread_startup();
154152
return 0;
155153
}
@@ -158,7 +156,6 @@ extern int main(void);
158156
/* Add -eentry to arm-none-eabi-gcc argument */
159157
int entry(void)
160158
{
161-
rt_hw_interrupt_disable();
162159
rtthread_startup();
163160
return 0;
164161
}

src/scheduler.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ void rt_schedule(void)
193193
struct rt_thread *from_thread;
194194

195195
/* disable interrupt */
196-
level = rt_hw_interrupt_disable();
196+
level = rt_hw_interrupt_disable();
197197

198198
/* check the scheduler is enabled or not */
199199
if (rt_scheduler_lock_nest == 0)
@@ -238,18 +238,30 @@ void rt_schedule(void)
238238

239239
if (rt_interrupt_nest == 0)
240240
{
241-
extern void rt_thread_handle_sig(void);
242-
243241
rt_hw_context_switch((rt_uint32_t)&from_thread->sp,
244242
(rt_uint32_t)&to_thread->sp);
245243

244+
#ifdef RT_USING_SIGNALS
245+
if (rt_current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING)
246+
{
247+
extern void rt_thread_handle_sig(rt_bool_t clean_state);
248+
249+
rt_current_thread->stat &= ~RT_THREAD_STAT_SIGNAL_PENDING;
250+
251+
rt_hw_interrupt_enable(level);
252+
253+
/* check signal status */
254+
rt_thread_handle_sig(RT_TRUE);
255+
}
256+
else
257+
{
258+
rt_hw_interrupt_enable(level);
259+
}
260+
#else
246261
/* enable interrupt */
247262
rt_hw_interrupt_enable(level);
248-
249-
#ifdef RT_USING_SIGNALS
250-
/* handle signal */
251-
rt_thread_handle_sig();
252263
#endif
264+
253265
return ;
254266
}
255267
else

src/signal.c

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
#define RT_SIG_INFO_MAX 32
2222
#endif
2323

24-
#define DBG_SECTION_NAME "SIGN"
25-
#define DBG_LEVEL DBG_INFO
24+
#define DBG_TAG "SIGN"
25+
#define DBG_LVL DBG_WARNING
2626
#include <rtdbg.h>
2727

2828
#define sig_mask(sig_no) (1u << sig_no)
@@ -36,7 +36,7 @@ struct siginfo_node
3636

3737
static struct rt_mempool *_rt_siginfo_pool;
3838
static void _signal_deliver(rt_thread_t tid);
39-
void rt_thread_handle_sig(void);
39+
void rt_thread_handle_sig(rt_bool_t clean_state);
4040

4141
static void _signal_default_handler(int signo)
4242
{
@@ -46,36 +46,19 @@ static void _signal_default_handler(int signo)
4646

4747
static void _signal_entry(void *parameter)
4848
{
49-
register rt_base_t level;
5049
rt_thread_t tid = rt_thread_self();
5150

52-
while (1)
53-
{
54-
level = rt_hw_interrupt_disable();
55-
if (tid->stat & RT_THREAD_STAT_SIGNAL)
56-
{
57-
rt_hw_interrupt_enable(level);
58-
59-
/* handle signal */
60-
rt_thread_handle_sig();
61-
}
62-
else
63-
{
64-
/*
65-
* Note: interrupt is disabled and no reentrant issue.
66-
*
67-
* no signal status in tid->stat.
68-
*/
69-
break;
70-
}
71-
}
51+
/* handle signal */
52+
rt_thread_handle_sig(RT_FALSE);
7253

73-
/* never come back... */
54+
/* return to thread */
7455
tid->sp = tid->sig_ret;
7556
tid->sig_ret = RT_NULL;
7657

77-
LOG_D("switch back to: 0x%08x", tid->sp);
78-
rt_hw_context_switch_to((rt_uint32_t) & (tid->sp));
58+
LOG_D("switch back to: 0x%08x\n", tid->sp);
59+
tid->stat &= ~RT_THREAD_STAT_SIGNAL;
60+
61+
rt_hw_context_switch_to((rt_ubase_t)&(tid->sp));
7962
}
8063

8164
/*
@@ -106,7 +89,7 @@ static void _signal_deliver(rt_thread_t tid)
10689
/* resume thread to handle signal */
10790
rt_thread_resume(tid);
10891
/* add signal state */
109-
tid->stat |= RT_THREAD_STAT_SIGNAL;
92+
tid->stat |= (RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING);
11093

11194
rt_hw_interrupt_enable(level);
11295

@@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid)
123106
rt_hw_interrupt_enable(level);
124107

125108
/* do signal action in self thread context */
126-
rt_thread_handle_sig();
109+
if (rt_interrupt_get_nest() == 0)
110+
{
111+
rt_thread_handle_sig(RT_TRUE);
112+
}
127113
}
128114
else if (!((tid->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL))
129115
{
130116
/* add signal state */
131-
tid->stat |= RT_THREAD_STAT_SIGNAL;
117+
tid->stat |= (RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING);
132118

133119
/* point to the signal handle entry */
120+
tid->stat &= ~RT_THREAD_STAT_SIGNAL_PENDING;
134121
tid->sig_ret = tid->sp;
135122
tid->sp = rt_hw_stack_init((void *)_signal_entry, RT_NULL,
136123
(void *)((char *)tid->sig_ret - 32), RT_NULL);
@@ -327,15 +314,14 @@ int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout)
327314
return ret;
328315
}
329316

330-
void rt_thread_handle_sig(void)
317+
void rt_thread_handle_sig(rt_bool_t clean_state)
331318
{
332319
rt_base_t level;
333320

334321
rt_thread_t tid = rt_thread_self();
335322
struct siginfo_node *si_node;
336323

337324
level = rt_hw_interrupt_disable();
338-
339325
if (tid->sig_pending & tid->sig_mask)
340326
{
341327
/* if thread is not waiting for signal */
@@ -371,8 +357,15 @@ void rt_thread_handle_sig(void)
371357
tid->error = error;
372358
}
373359

374-
/* clean state */
375-
tid->stat &= ~RT_THREAD_STAT_SIGNAL;
360+
/* whether clean signal status */
361+
if (clean_state == RT_TRUE)
362+
{
363+
tid->stat &= ~RT_THREAD_STAT_SIGNAL;
364+
}
365+
else
366+
{
367+
return;
368+
}
376369
}
377370
}
378371
rt_hw_interrupt_enable(level);

0 commit comments

Comments
 (0)