游戏王对战板,目前code还是空的

Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WFKnight 0:9b3d4731edbb 1 /* mbed Microcontroller Library
WFKnight 0:9b3d4731edbb 2 * Copyright (c) 2015 ARM Limited
WFKnight 0:9b3d4731edbb 3 *
WFKnight 0:9b3d4731edbb 4 * Licensed under the Apache License, Version 2.0 (the "License");
WFKnight 0:9b3d4731edbb 5 * you may not use this file except in compliance with the License.
WFKnight 0:9b3d4731edbb 6 * You may obtain a copy of the License at
WFKnight 0:9b3d4731edbb 7 *
WFKnight 0:9b3d4731edbb 8 * http://www.apache.org/licenses/LICENSE-2.0
WFKnight 0:9b3d4731edbb 9 *
WFKnight 0:9b3d4731edbb 10 * Unless required by applicable law or agreed to in writing, software
WFKnight 0:9b3d4731edbb 11 * distributed under the License is distributed on an "AS IS" BASIS,
WFKnight 0:9b3d4731edbb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WFKnight 0:9b3d4731edbb 13 * See the License for the specific language governing permissions and
WFKnight 0:9b3d4731edbb 14 * limitations under the License.
WFKnight 0:9b3d4731edbb 15 */
WFKnight 0:9b3d4731edbb 16 #ifndef MBED_CIRCULARBUFFER_H
WFKnight 0:9b3d4731edbb 17 #define MBED_CIRCULARBUFFER_H
WFKnight 0:9b3d4731edbb 18
WFKnight 0:9b3d4731edbb 19 #include "platform/mbed_critical.h"
WFKnight 0:9b3d4731edbb 20 #include "platform/mbed_assert.h"
WFKnight 0:9b3d4731edbb 21
WFKnight 0:9b3d4731edbb 22 namespace mbed {
WFKnight 0:9b3d4731edbb 23
WFKnight 0:9b3d4731edbb 24 namespace internal {
WFKnight 0:9b3d4731edbb 25 /* Detect if CounterType of the Circular buffer is of unsigned type. */
WFKnight 0:9b3d4731edbb 26 template<typename T>
WFKnight 0:9b3d4731edbb 27 struct is_unsigned { static const bool value = false; };
WFKnight 0:9b3d4731edbb 28 template<>
WFKnight 0:9b3d4731edbb 29 struct is_unsigned<unsigned char> { static const bool value = true; };
WFKnight 0:9b3d4731edbb 30 template<>
WFKnight 0:9b3d4731edbb 31 struct is_unsigned<unsigned short> { static const bool value = true; };
WFKnight 0:9b3d4731edbb 32 template<>
WFKnight 0:9b3d4731edbb 33 struct is_unsigned<unsigned int> { static const bool value = true; };
WFKnight 0:9b3d4731edbb 34 template<>
WFKnight 0:9b3d4731edbb 35 struct is_unsigned<unsigned long> { static const bool value = true; };
WFKnight 0:9b3d4731edbb 36 template<>
WFKnight 0:9b3d4731edbb 37 struct is_unsigned<unsigned long long> { static const bool value = true; };
WFKnight 0:9b3d4731edbb 38 };
WFKnight 0:9b3d4731edbb 39
WFKnight 0:9b3d4731edbb 40 /** \addtogroup platform */
WFKnight 0:9b3d4731edbb 41 /** @{*/
WFKnight 0:9b3d4731edbb 42 /**
WFKnight 0:9b3d4731edbb 43 * \defgroup platform_CircularBuffer CircularBuffer functions
WFKnight 0:9b3d4731edbb 44 * @{
WFKnight 0:9b3d4731edbb 45 */
WFKnight 0:9b3d4731edbb 46
WFKnight 0:9b3d4731edbb 47 /** Templated Circular buffer class
WFKnight 0:9b3d4731edbb 48 *
WFKnight 0:9b3d4731edbb 49 * @note Synchronization level: Interrupt safe
WFKnight 0:9b3d4731edbb 50 * @note CounterType must be unsigned and consistent with BufferSize
WFKnight 0:9b3d4731edbb 51 */
WFKnight 0:9b3d4731edbb 52 template<typename T, uint32_t BufferSize, typename CounterType = uint32_t>
WFKnight 0:9b3d4731edbb 53 class CircularBuffer {
WFKnight 0:9b3d4731edbb 54 public:
WFKnight 0:9b3d4731edbb 55 CircularBuffer() : _head(0), _tail(0), _full(false) {
WFKnight 0:9b3d4731edbb 56 MBED_STATIC_ASSERT(
WFKnight 0:9b3d4731edbb 57 internal::is_unsigned<CounterType>::value,
WFKnight 0:9b3d4731edbb 58 "CounterType must be unsigned"
WFKnight 0:9b3d4731edbb 59 );
WFKnight 0:9b3d4731edbb 60
WFKnight 0:9b3d4731edbb 61 MBED_STATIC_ASSERT(
WFKnight 0:9b3d4731edbb 62 (sizeof(CounterType) >= sizeof(uint32_t)) ||
WFKnight 0:9b3d4731edbb 63 (BufferSize < (((uint64_t) 1) << (sizeof(CounterType) * 8))),
WFKnight 0:9b3d4731edbb 64 "Invalid BufferSize for the CounterType"
WFKnight 0:9b3d4731edbb 65 );
WFKnight 0:9b3d4731edbb 66 }
WFKnight 0:9b3d4731edbb 67
WFKnight 0:9b3d4731edbb 68 ~CircularBuffer() {
WFKnight 0:9b3d4731edbb 69 }
WFKnight 0:9b3d4731edbb 70
WFKnight 0:9b3d4731edbb 71 /** Push the transaction to the buffer. This overwrites the buffer if it's
WFKnight 0:9b3d4731edbb 72 * full
WFKnight 0:9b3d4731edbb 73 *
WFKnight 0:9b3d4731edbb 74 * @param data Data to be pushed to the buffer
WFKnight 0:9b3d4731edbb 75 */
WFKnight 0:9b3d4731edbb 76 void push(const T& data) {
WFKnight 0:9b3d4731edbb 77 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 78 if (full()) {
WFKnight 0:9b3d4731edbb 79 _tail++;
WFKnight 0:9b3d4731edbb 80 _tail %= BufferSize;
WFKnight 0:9b3d4731edbb 81 }
WFKnight 0:9b3d4731edbb 82 _pool[_head++] = data;
WFKnight 0:9b3d4731edbb 83 _head %= BufferSize;
WFKnight 0:9b3d4731edbb 84 if (_head == _tail) {
WFKnight 0:9b3d4731edbb 85 _full = true;
WFKnight 0:9b3d4731edbb 86 }
WFKnight 0:9b3d4731edbb 87 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 88 }
WFKnight 0:9b3d4731edbb 89
WFKnight 0:9b3d4731edbb 90 /** Pop the transaction from the buffer
WFKnight 0:9b3d4731edbb 91 *
WFKnight 0:9b3d4731edbb 92 * @param data Data to be popped from the buffer
WFKnight 0:9b3d4731edbb 93 * @return True if the buffer is not empty and data contains a transaction, false otherwise
WFKnight 0:9b3d4731edbb 94 */
WFKnight 0:9b3d4731edbb 95 bool pop(T& data) {
WFKnight 0:9b3d4731edbb 96 bool data_popped = false;
WFKnight 0:9b3d4731edbb 97 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 98 if (!empty()) {
WFKnight 0:9b3d4731edbb 99 data = _pool[_tail++];
WFKnight 0:9b3d4731edbb 100 _tail %= BufferSize;
WFKnight 0:9b3d4731edbb 101 _full = false;
WFKnight 0:9b3d4731edbb 102 data_popped = true;
WFKnight 0:9b3d4731edbb 103 }
WFKnight 0:9b3d4731edbb 104 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 105 return data_popped;
WFKnight 0:9b3d4731edbb 106 }
WFKnight 0:9b3d4731edbb 107
WFKnight 0:9b3d4731edbb 108 /** Check if the buffer is empty
WFKnight 0:9b3d4731edbb 109 *
WFKnight 0:9b3d4731edbb 110 * @return True if the buffer is empty, false if not
WFKnight 0:9b3d4731edbb 111 */
WFKnight 0:9b3d4731edbb 112 bool empty() const {
WFKnight 0:9b3d4731edbb 113 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 114 bool is_empty = (_head == _tail) && !_full;
WFKnight 0:9b3d4731edbb 115 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 116 return is_empty;
WFKnight 0:9b3d4731edbb 117 }
WFKnight 0:9b3d4731edbb 118
WFKnight 0:9b3d4731edbb 119 /** Check if the buffer is full
WFKnight 0:9b3d4731edbb 120 *
WFKnight 0:9b3d4731edbb 121 * @return True if the buffer is full, false if not
WFKnight 0:9b3d4731edbb 122 */
WFKnight 0:9b3d4731edbb 123 bool full() const {
WFKnight 0:9b3d4731edbb 124 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 125 bool full = _full;
WFKnight 0:9b3d4731edbb 126 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 127 return full;
WFKnight 0:9b3d4731edbb 128 }
WFKnight 0:9b3d4731edbb 129
WFKnight 0:9b3d4731edbb 130 /** Reset the buffer
WFKnight 0:9b3d4731edbb 131 *
WFKnight 0:9b3d4731edbb 132 */
WFKnight 0:9b3d4731edbb 133 void reset() {
WFKnight 0:9b3d4731edbb 134 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 135 _head = 0;
WFKnight 0:9b3d4731edbb 136 _tail = 0;
WFKnight 0:9b3d4731edbb 137 _full = false;
WFKnight 0:9b3d4731edbb 138 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 139 }
WFKnight 0:9b3d4731edbb 140
WFKnight 0:9b3d4731edbb 141 /** Get the number of elements currently stored in the circular_buffer */
WFKnight 0:9b3d4731edbb 142 CounterType size() const {
WFKnight 0:9b3d4731edbb 143 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 144 CounterType elements;
WFKnight 0:9b3d4731edbb 145 if (!_full) {
WFKnight 0:9b3d4731edbb 146 if (_head < _tail) {
WFKnight 0:9b3d4731edbb 147 elements = BufferSize + _head - _tail;
WFKnight 0:9b3d4731edbb 148 } else {
WFKnight 0:9b3d4731edbb 149 elements = _head - _tail;
WFKnight 0:9b3d4731edbb 150 }
WFKnight 0:9b3d4731edbb 151 } else {
WFKnight 0:9b3d4731edbb 152 elements = BufferSize;
WFKnight 0:9b3d4731edbb 153 }
WFKnight 0:9b3d4731edbb 154 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 155 return elements;
WFKnight 0:9b3d4731edbb 156 }
WFKnight 0:9b3d4731edbb 157
WFKnight 0:9b3d4731edbb 158 /** Peek into circular buffer without popping
WFKnight 0:9b3d4731edbb 159 *
WFKnight 0:9b3d4731edbb 160 * @param data Data to be peeked from the buffer
WFKnight 0:9b3d4731edbb 161 * @return True if the buffer is not empty and data contains a transaction, false otherwise
WFKnight 0:9b3d4731edbb 162 */
WFKnight 0:9b3d4731edbb 163 bool peek(T& data) const {
WFKnight 0:9b3d4731edbb 164 bool data_updated = false;
WFKnight 0:9b3d4731edbb 165 core_util_critical_section_enter();
WFKnight 0:9b3d4731edbb 166 if (!empty()) {
WFKnight 0:9b3d4731edbb 167 data = _pool[_tail];
WFKnight 0:9b3d4731edbb 168 data_updated = true;
WFKnight 0:9b3d4731edbb 169 }
WFKnight 0:9b3d4731edbb 170 core_util_critical_section_exit();
WFKnight 0:9b3d4731edbb 171 return data_updated;
WFKnight 0:9b3d4731edbb 172 }
WFKnight 0:9b3d4731edbb 173
WFKnight 0:9b3d4731edbb 174 private:
WFKnight 0:9b3d4731edbb 175 T _pool[BufferSize];
WFKnight 0:9b3d4731edbb 176 volatile CounterType _head;
WFKnight 0:9b3d4731edbb 177 volatile CounterType _tail;
WFKnight 0:9b3d4731edbb 178 volatile bool _full;
WFKnight 0:9b3d4731edbb 179 };
WFKnight 0:9b3d4731edbb 180
WFKnight 0:9b3d4731edbb 181 /**@}*/
WFKnight 0:9b3d4731edbb 182
WFKnight 0:9b3d4731edbb 183 /**@}*/
WFKnight 0:9b3d4731edbb 184
WFKnight 0:9b3d4731edbb 185 }
WFKnight 0:9b3d4731edbb 186
WFKnight 0:9b3d4731edbb 187 #endif