Pārlūkot izejas kodu

Merge pull request #2661 from BernardXiong/pre-release_v4.0.1

Pre-release for v4.0.1
Bernard Xiong 6 gadi atpakaļ
vecāks
revīzija
2bf9ba0675

+ 0 - 13
examples/nanopb/SConscript

@@ -1,13 +0,0 @@
-Import('RTT_ROOT')
-Import('rtconfig')
-from building import *
-
-src	= Split('''
-simple.c
-simple.pb.c
-''')
-CPPPATH = [RTT_ROOT + '/examples/nanopb']
-
-group = DefineGroup('Nanopb_test', src, depend = ['RT_USING_NANOPB'], CPPPATH = CPPPATH)
-
-Return('group')

+ 0 - 73
examples/nanopb/simple.c

@@ -1,73 +0,0 @@
-#include <rthw.h>
-#include <stm32f10x.h>
-#include <pb_encode.h>
-#include <pb_decode.h>
-#include "simple.pb.h"
-
-int nanopb_test()
-{
-    /* This is the buffer where we will store our message. */
-    uint8_t buffer[128];
-    size_t message_length;
-    bool status;
-
-    /* Encode our message */
-    {
-        /* Allocate space on the stack to store the message data.
-         *
-         * Nanopb generates simple struct definitions for all the messages.
-         * - check out the contents of simple.pb.h! */
-        SimpleMessage message = SimpleMessage_init_zero;
-
-        /* Create a stream that will write to our buffer. */
-        pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
-
-        /* Fill in the lucky number */
-        message.lucky_number = 13;
-
-        /* Now we are ready to encode the message! */
-        status = pb_encode(&stream, SimpleMessage_fields, &message);
-        message_length = stream.bytes_written;
-
-        /* Then just check for any errors.. */
-        if (!status)
-        {
-            rt_kprintf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
-            return 1;
-        }
-    }
-
-    /* Now we could transmit the message over network, store it in a file or
-     * wrap it to a pigeon's leg.
-     */
-
-    /* But because we are lazy, we will just decode it immediately. */
-
-    {
-        /* Allocate space for the decoded message. */
-        SimpleMessage message;
-
-        /* Create a stream that reads from the buffer. */
-        pb_istream_t stream = pb_istream_from_buffer(buffer, message_length);
-
-        /* Now we are ready to decode the message. */
-        status = pb_decode(&stream, SimpleMessage_fields, &message);
-
-        /* Check for errors... */
-        if (!status)
-        {
-            rt_kprintf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
-            return 1;
-        }
-
-        /* Print the data contained in the message. */
-        rt_kprintf("Your lucky number was %d!\n", message.lucky_number);
-    }
-
-    return 0;
-}
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-FINSH_FUNCTION_EXPORT(nanopb_test, nanopb encode/decode test.)
-#endif

+ 0 - 1
examples/nanopb/simple.options

@@ -1 +0,0 @@
-SimpleMessage.name		max_size:16

+ 0 - 18
examples/nanopb/simple.pb.c

@@ -1,18 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */
-
-#include "simple.pb.h"
-
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-
-
-const pb_field_t SimpleMessage_fields[3] = {
-    PB_FIELD(  1, INT32   , REQUIRED, STATIC  , FIRST, SimpleMessage, lucky_number, lucky_number, 0),
-    PB_FIELD(  2, BYTES   , REQUIRED, STATIC  , OTHER, SimpleMessage, name, lucky_number, 0),
-    PB_LAST_FIELD
-};
-
-

+ 0 - 45
examples/nanopb/simple.pb.h

@@ -1,45 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */
-
-#ifndef PB_SIMPLE_PB_H_INCLUDED
-#define PB_SIMPLE_PB_H_INCLUDED
-#include <pb.h>
-
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Enum definitions */
-/* Struct definitions */
-typedef PB_BYTES_ARRAY_T(16) SimpleMessage_name_t;
-
-typedef struct _SimpleMessage {
-    int32_t lucky_number;
-    SimpleMessage_name_t name;
-} SimpleMessage;
-
-/* Default values for struct fields */
-
-/* Initializer values for message structs */
-#define SimpleMessage_init_default               {0, {0, {0}}}
-#define SimpleMessage_init_zero                  {0, {0, {0}}}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define SimpleMessage_lucky_number_tag           1
-#define SimpleMessage_name_tag                   2
-
-/* Struct field encoding specification for nanopb */
-extern const pb_field_t SimpleMessage_fields[3];
-
-/* Maximum encoded size of messages (where known) */
-#define SimpleMessage_size                       29
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 10
examples/nanopb/simple.proto

@@ -1,10 +0,0 @@
-// A very simple protocol definition, consisting of only
-// one message.
-
-message SimpleMessage {
-    required int32 lucky_number = 1;
-	required bytes name = 2;
-}
-
-
-

+ 3 - 3
include/rthw.h

@@ -153,10 +153,10 @@ extern rt_hw_spinlock_t _rt_critical_lock;
 
 #define __RT_HW_SPIN_LOCK_INITIALIZER(lockname) {0}
 
-#define __RT_HW_SPIN_LOCK_UNLOCKED(lockname) \
- (struct rt_hw_spinlock ) __RT_HW_SPIN_LOCK_INITIALIZER(lockname)
+#define __RT_HW_SPIN_LOCK_UNLOCKED(lockname)    \
+    (rt_hw_spinlock_t) __RT_HW_SPIN_LOCK_INITIALIZER(lockname)
 
-#define RT_DEFINE_SPINLOCK(x)  struct rt_hw_spinlock x = __RT_HW_SPIN_LOCK_UNLOCKED(x)
+#define RT_DEFINE_SPINLOCK(x)  rt_hw_spinlock_t x = __RT_HW_SPIN_LOCK_UNLOCKED(x)
 
 /**
  *  ipi function

+ 8 - 6
libcpu/arm/cortex-a/context_gcc.S

@@ -34,8 +34,9 @@ rt_hw_interrupt_enable:
     bx  lr
 
 /*
- * void rt_hw_context_switch_to(rt_uint32 to);
- * r0 --> to
+ * void rt_hw_context_switch_to(rt_uint32 to, struct rt_thread *to_thread);
+ * r0 --> to (thread stack)
+ * r1 --> to_thread
  */
 .globl rt_hw_context_switch_to
 rt_hw_context_switch_to:
@@ -64,9 +65,10 @@ _guest_switch_lvl:
 
 .section .text.isr, "ax"
 /*
- * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
- * r0 --> from
- * r1 --> to
+ * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to, struct rt_thread *to_thread);
+ * r0 --> from (from_thread stack)
+ * r1 --> to (to_thread stack)
+ * r2 --> to_thread
  */
 .globl rt_hw_context_switch
 rt_hw_context_switch:
@@ -158,7 +160,7 @@ rt_hw_context_switch_interrupt:
     bl      rt_cpus_lock_status_restore
 
 #ifdef RT_USING_LWP
-    ldmfd sp, {r13,r14}^  @pop usr_sp usr_lr
+    ldmfd sp, {r13,r14}^    @pop usr_sp usr_lr
     add sp, #8
 #endif
 

+ 8 - 2
src/cpu.c

@@ -42,12 +42,16 @@ rt_base_t rt_cpus_lock(void)
     pcpu = rt_cpu_self();
     if (pcpu->current_thread != RT_NULL)
     {
-        if (pcpu->current_thread->cpus_lock_nest++ == 0)
+        register rt_uint16_t lock_nest = pcpu->current_thread->cpus_lock_nest;
+
+        pcpu->current_thread->cpus_lock_nest++;
+        if (lock_nest == 0)
         {
             pcpu->current_thread->scheduler_lock_nest++;
             rt_hw_spin_lock(&_cpus_lock);
         }
     }
+
     return level;
 }
 RTM_EXPORT(rt_cpus_lock);
@@ -61,7 +65,9 @@ void rt_cpus_unlock(rt_base_t level)
 
     if (pcpu->current_thread != RT_NULL)
     {
-        if (--pcpu->current_thread->cpus_lock_nest == 0)
+        pcpu->current_thread->cpus_lock_nest--;
+
+        if (pcpu->current_thread->cpus_lock_nest == 0)
         {
             pcpu->current_thread->scheduler_lock_nest--;
             rt_hw_spin_unlock(&_cpus_lock);

+ 2 - 2
src/ipc.c

@@ -753,8 +753,8 @@ __again:
 
                 if (thread->error != RT_EOK)
                 {
-                	/* interrupt by signal, try it again */
-                	if (thread->error == -RT_EINTR) goto __again;
+                    /* interrupt by signal, try it again */
+                    if (thread->error == -RT_EINTR) goto __again;
 
                     /* return error */
                     return thread->error;