mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-28 04:27:07 +08:00
Merge pull request #2661 from BernardXiong/pre-release_v4.0.1
Pre-release for v4.0.1
This commit is contained in:
commit
2bf9ba0675
@ -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')
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||||||
SimpleMessage.name max_size:16
|
|
@ -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
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -154,9 +154,9 @@ extern rt_hw_spinlock_t _rt_critical_lock;
|
|||||||
#define __RT_HW_SPIN_LOCK_INITIALIZER(lockname) {0}
|
#define __RT_HW_SPIN_LOCK_INITIALIZER(lockname) {0}
|
||||||
|
|
||||||
#define __RT_HW_SPIN_LOCK_UNLOCKED(lockname) \
|
#define __RT_HW_SPIN_LOCK_UNLOCKED(lockname) \
|
||||||
(struct rt_hw_spinlock ) __RT_HW_SPIN_LOCK_INITIALIZER(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
|
* ipi function
|
||||||
|
@ -34,8 +34,9 @@ rt_hw_interrupt_enable:
|
|||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* void rt_hw_context_switch_to(rt_uint32 to);
|
* void rt_hw_context_switch_to(rt_uint32 to, struct rt_thread *to_thread);
|
||||||
* r0 --> to
|
* r0 --> to (thread stack)
|
||||||
|
* r1 --> to_thread
|
||||||
*/
|
*/
|
||||||
.globl rt_hw_context_switch_to
|
.globl rt_hw_context_switch_to
|
||||||
rt_hw_context_switch_to:
|
rt_hw_context_switch_to:
|
||||||
@ -64,9 +65,10 @@ _guest_switch_lvl:
|
|||||||
|
|
||||||
.section .text.isr, "ax"
|
.section .text.isr, "ax"
|
||||||
/*
|
/*
|
||||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to, struct rt_thread *to_thread);
|
||||||
* r0 --> from
|
* r0 --> from (from_thread stack)
|
||||||
* r1 --> to
|
* r1 --> to (to_thread stack)
|
||||||
|
* r2 --> to_thread
|
||||||
*/
|
*/
|
||||||
.globl rt_hw_context_switch
|
.globl rt_hw_context_switch
|
||||||
rt_hw_context_switch:
|
rt_hw_context_switch:
|
||||||
|
10
src/cpu.c
10
src/cpu.c
@ -42,12 +42,16 @@ rt_base_t rt_cpus_lock(void)
|
|||||||
pcpu = rt_cpu_self();
|
pcpu = rt_cpu_self();
|
||||||
if (pcpu->current_thread != RT_NULL)
|
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++;
|
pcpu->current_thread->scheduler_lock_nest++;
|
||||||
rt_hw_spin_lock(&_cpus_lock);
|
rt_hw_spin_lock(&_cpus_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
RTM_EXPORT(rt_cpus_lock);
|
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 != 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--;
|
pcpu->current_thread->scheduler_lock_nest--;
|
||||||
rt_hw_spin_unlock(&_cpus_lock);
|
rt_hw_spin_unlock(&_cpus_lock);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user