Selaa lähdekoodia

prepare v3.1.3 release

Bernard Xiong 6 vuotta sitten
vanhempi
commit
08df0b8ea1
4 muutettua tiedostoa jossa 51 lisäystä ja 46 poistoa
  1. 5 2
      include/rtdef.h
  2. 0 3
      src/components.c
  3. 19 7
      src/scheduler.c
  4. 27 34
      src/signal.c

+ 5 - 2
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
 
 /**

+ 0 - 3
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;
 }

+ 19 - 7
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

+ 27 - 34
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);