mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2006-2017 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 167:e84263d55307 4 *
AnnaBridge 167:e84263d55307 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 6 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 7 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 8 *
AnnaBridge 167:e84263d55307 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 10 *
AnnaBridge 167:e84263d55307 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 14 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 15 * limitations under the License.
AnnaBridge 167:e84263d55307 16 */
AnnaBridge 188:bcfe06ba3d64 17 #include "drivers/UARTSerial.h"
AnnaBridge 167:e84263d55307 18
AnnaBridge 168:9672193075cf 19 #if (DEVICE_SERIAL && DEVICE_INTERRUPTIN)
AnnaBridge 167:e84263d55307 20
AnnaBridge 167:e84263d55307 21 #include "platform/mbed_poll.h"
AnnaBridge 176:447f873cad2f 22
AnnaBridge 176:447f873cad2f 23 #if MBED_CONF_RTOS_PRESENT
AnnaBridge 189:f392fc9709a3 24 #include "rtos/ThisThread.h"
AnnaBridge 176:447f873cad2f 25 #else
AnnaBridge 167:e84263d55307 26 #include "platform/mbed_wait_api.h"
AnnaBridge 176:447f873cad2f 27 #endif
AnnaBridge 167:e84263d55307 28
AnnaBridge 167:e84263d55307 29 namespace mbed {
AnnaBridge 167:e84263d55307 30
AnnaBridge 167:e84263d55307 31 UARTSerial::UARTSerial(PinName tx, PinName rx, int baud) :
AnnaBridge 187:0387e8f68319 32 SerialBase(tx, rx, baud),
AnnaBridge 187:0387e8f68319 33 _blocking(true),
AnnaBridge 187:0387e8f68319 34 _tx_irq_enabled(false),
AnnaBridge 187:0387e8f68319 35 _rx_irq_enabled(true),
AnnaBridge 187:0387e8f68319 36 _dcd_irq(NULL)
AnnaBridge 167:e84263d55307 37 {
AnnaBridge 167:e84263d55307 38 /* Attatch IRQ routines to the serial device. */
AnnaBridge 167:e84263d55307 39 SerialBase::attach(callback(this, &UARTSerial::rx_irq), RxIrq);
AnnaBridge 167:e84263d55307 40 }
AnnaBridge 167:e84263d55307 41
AnnaBridge 167:e84263d55307 42 UARTSerial::~UARTSerial()
AnnaBridge 167:e84263d55307 43 {
AnnaBridge 167:e84263d55307 44 delete _dcd_irq;
AnnaBridge 167:e84263d55307 45 }
AnnaBridge 167:e84263d55307 46
AnnaBridge 167:e84263d55307 47 void UARTSerial::dcd_irq()
AnnaBridge 167:e84263d55307 48 {
AnnaBridge 167:e84263d55307 49 wake();
AnnaBridge 167:e84263d55307 50 }
AnnaBridge 167:e84263d55307 51
Kojto 170:19eb464bc2be 52 void UARTSerial::set_baud(int baud)
Kojto 170:19eb464bc2be 53 {
Kojto 170:19eb464bc2be 54 SerialBase::baud(baud);
Kojto 170:19eb464bc2be 55 }
Kojto 170:19eb464bc2be 56
AnnaBridge 167:e84263d55307 57 void UARTSerial::set_data_carrier_detect(PinName dcd_pin, bool active_high)
AnnaBridge 167:e84263d55307 58 {
AnnaBridge 187:0387e8f68319 59 delete _dcd_irq;
AnnaBridge 167:e84263d55307 60 _dcd_irq = NULL;
AnnaBridge 167:e84263d55307 61
AnnaBridge 167:e84263d55307 62 if (dcd_pin != NC) {
AnnaBridge 167:e84263d55307 63 _dcd_irq = new InterruptIn(dcd_pin);
AnnaBridge 167:e84263d55307 64 if (active_high) {
AnnaBridge 167:e84263d55307 65 _dcd_irq->fall(callback(this, &UARTSerial::dcd_irq));
AnnaBridge 167:e84263d55307 66 } else {
AnnaBridge 167:e84263d55307 67 _dcd_irq->rise(callback(this, &UARTSerial::dcd_irq));
AnnaBridge 167:e84263d55307 68 }
AnnaBridge 167:e84263d55307 69 }
AnnaBridge 167:e84263d55307 70 }
AnnaBridge 167:e84263d55307 71
Anna Bridge 180:96ed750bd169 72 void UARTSerial::set_format(int bits, Parity parity, int stop_bits)
Anna Bridge 180:96ed750bd169 73 {
Anna Bridge 180:96ed750bd169 74 api_lock();
Anna Bridge 180:96ed750bd169 75 SerialBase::format(bits, parity, stop_bits);
Anna Bridge 180:96ed750bd169 76 api_unlock();
Anna Bridge 180:96ed750bd169 77 }
Anna Bridge 180:96ed750bd169 78
Anna Bridge 180:96ed750bd169 79 #if DEVICE_SERIAL_FC
Anna Bridge 180:96ed750bd169 80 void UARTSerial::set_flow_control(Flow type, PinName flow1, PinName flow2)
Anna Bridge 180:96ed750bd169 81 {
Anna Bridge 180:96ed750bd169 82 api_lock();
Anna Bridge 180:96ed750bd169 83 SerialBase::set_flow_control(type, flow1, flow2);
Anna Bridge 180:96ed750bd169 84 api_unlock();
Anna Bridge 180:96ed750bd169 85 }
Anna Bridge 180:96ed750bd169 86 #endif
Anna Bridge 180:96ed750bd169 87
AnnaBridge 167:e84263d55307 88 int UARTSerial::close()
AnnaBridge 167:e84263d55307 89 {
AnnaBridge 167:e84263d55307 90 /* Does not let us pass a file descriptor. So how to close ?
AnnaBridge 167:e84263d55307 91 * Also, does it make sense to close a device type file descriptor*/
AnnaBridge 167:e84263d55307 92 return 0;
AnnaBridge 167:e84263d55307 93 }
AnnaBridge 167:e84263d55307 94
AnnaBridge 167:e84263d55307 95 int UARTSerial::isatty()
AnnaBridge 167:e84263d55307 96 {
AnnaBridge 167:e84263d55307 97 return 1;
AnnaBridge 167:e84263d55307 98
AnnaBridge 167:e84263d55307 99 }
AnnaBridge 167:e84263d55307 100
AnnaBridge 167:e84263d55307 101 off_t UARTSerial::seek(off_t offset, int whence)
AnnaBridge 167:e84263d55307 102 {
AnnaBridge 167:e84263d55307 103 /*XXX lseek can be done theoratically, but is it sane to mark positions on a dynamically growing/shrinking
AnnaBridge 167:e84263d55307 104 * buffer system (from an interrupt context) */
AnnaBridge 167:e84263d55307 105 return -ESPIPE;
AnnaBridge 167:e84263d55307 106 }
AnnaBridge 167:e84263d55307 107
AnnaBridge 167:e84263d55307 108 int UARTSerial::sync()
AnnaBridge 167:e84263d55307 109 {
AnnaBridge 168:9672193075cf 110 api_lock();
AnnaBridge 167:e84263d55307 111
AnnaBridge 167:e84263d55307 112 while (!_txbuf.empty()) {
AnnaBridge 168:9672193075cf 113 api_unlock();
AnnaBridge 167:e84263d55307 114 // Doing better than wait would require TxIRQ to also do wake() when becoming empty. Worth it?
AnnaBridge 167:e84263d55307 115 wait_ms(1);
AnnaBridge 168:9672193075cf 116 api_lock();
AnnaBridge 167:e84263d55307 117 }
AnnaBridge 167:e84263d55307 118
AnnaBridge 168:9672193075cf 119 api_unlock();
AnnaBridge 167:e84263d55307 120
AnnaBridge 167:e84263d55307 121 return 0;
AnnaBridge 167:e84263d55307 122 }
AnnaBridge 167:e84263d55307 123
AnnaBridge 187:0387e8f68319 124 void UARTSerial::sigio(Callback<void()> func)
AnnaBridge 187:0387e8f68319 125 {
AnnaBridge 167:e84263d55307 126 core_util_critical_section_enter();
AnnaBridge 167:e84263d55307 127 _sigio_cb = func;
AnnaBridge 167:e84263d55307 128 if (_sigio_cb) {
AnnaBridge 167:e84263d55307 129 short current_events = poll(0x7FFF);
AnnaBridge 167:e84263d55307 130 if (current_events) {
AnnaBridge 167:e84263d55307 131 _sigio_cb();
AnnaBridge 167:e84263d55307 132 }
AnnaBridge 167:e84263d55307 133 }
AnnaBridge 167:e84263d55307 134 core_util_critical_section_exit();
AnnaBridge 167:e84263d55307 135 }
AnnaBridge 167:e84263d55307 136
AnnaBridge 189:f392fc9709a3 137 /* Special synchronous write designed to work from critical section, such
AnnaBridge 189:f392fc9709a3 138 * as in mbed_error_vprintf.
AnnaBridge 189:f392fc9709a3 139 */
AnnaBridge 189:f392fc9709a3 140 ssize_t UARTSerial::write_unbuffered(const char *buf_ptr, size_t length)
AnnaBridge 189:f392fc9709a3 141 {
AnnaBridge 189:f392fc9709a3 142 while (!_txbuf.empty()) {
AnnaBridge 189:f392fc9709a3 143 tx_irq();
AnnaBridge 189:f392fc9709a3 144 }
AnnaBridge 189:f392fc9709a3 145
AnnaBridge 189:f392fc9709a3 146 for (size_t data_written = 0; data_written < length; data_written++) {
AnnaBridge 189:f392fc9709a3 147 SerialBase::_base_putc(*buf_ptr++);
AnnaBridge 189:f392fc9709a3 148 data_written++;
AnnaBridge 189:f392fc9709a3 149 }
AnnaBridge 189:f392fc9709a3 150
AnnaBridge 189:f392fc9709a3 151 return length;
AnnaBridge 189:f392fc9709a3 152 }
AnnaBridge 189:f392fc9709a3 153
AnnaBridge 187:0387e8f68319 154 ssize_t UARTSerial::write(const void *buffer, size_t length)
AnnaBridge 167:e84263d55307 155 {
AnnaBridge 167:e84263d55307 156 size_t data_written = 0;
AnnaBridge 167:e84263d55307 157 const char *buf_ptr = static_cast<const char *>(buffer);
AnnaBridge 167:e84263d55307 158
Anna Bridge 180:96ed750bd169 159 if (length == 0) {
Anna Bridge 180:96ed750bd169 160 return 0;
AnnaBridge 167:e84263d55307 161 }
AnnaBridge 167:e84263d55307 162
AnnaBridge 189:f392fc9709a3 163 if (core_util_in_critical_section()) {
AnnaBridge 189:f392fc9709a3 164 return write_unbuffered(buf_ptr, length);
AnnaBridge 189:f392fc9709a3 165 }
AnnaBridge 189:f392fc9709a3 166
Anna Bridge 180:96ed750bd169 167 api_lock();
Anna Bridge 180:96ed750bd169 168
Anna Bridge 180:96ed750bd169 169 // Unlike read, we should write the whole thing if blocking. POSIX only
Anna Bridge 180:96ed750bd169 170 // allows partial as a side-effect of signal handling; it normally tries to
Anna Bridge 180:96ed750bd169 171 // write everything if blocking. Without signals we can always write all.
Anna Bridge 180:96ed750bd169 172 while (data_written < length) {
AnnaBridge 167:e84263d55307 173
Anna Bridge 180:96ed750bd169 174 if (_txbuf.full()) {
Anna Bridge 180:96ed750bd169 175 if (!_blocking) {
Anna Bridge 180:96ed750bd169 176 break;
Anna Bridge 180:96ed750bd169 177 }
Anna Bridge 180:96ed750bd169 178 do {
Anna Bridge 180:96ed750bd169 179 api_unlock();
Anna Bridge 180:96ed750bd169 180 wait_ms(1); // XXX todo - proper wait, WFE for non-rtos ?
Anna Bridge 180:96ed750bd169 181 api_lock();
Anna Bridge 180:96ed750bd169 182 } while (_txbuf.full());
AnnaBridge 167:e84263d55307 183 }
Anna Bridge 180:96ed750bd169 184
Anna Bridge 180:96ed750bd169 185 while (data_written < length && !_txbuf.full()) {
Anna Bridge 180:96ed750bd169 186 _txbuf.push(*buf_ptr++);
Anna Bridge 180:96ed750bd169 187 data_written++;
Anna Bridge 180:96ed750bd169 188 }
Anna Bridge 180:96ed750bd169 189
Anna Bridge 180:96ed750bd169 190 core_util_critical_section_enter();
Anna Bridge 180:96ed750bd169 191 if (!_tx_irq_enabled) {
Anna Bridge 180:96ed750bd169 192 UARTSerial::tx_irq(); // only write to hardware in one place
Anna Bridge 180:96ed750bd169 193 if (!_txbuf.empty()) {
Anna Bridge 180:96ed750bd169 194 SerialBase::attach(callback(this, &UARTSerial::tx_irq), TxIrq);
Anna Bridge 180:96ed750bd169 195 _tx_irq_enabled = true;
Anna Bridge 180:96ed750bd169 196 }
Anna Bridge 180:96ed750bd169 197 }
Anna Bridge 180:96ed750bd169 198 core_util_critical_section_exit();
AnnaBridge 167:e84263d55307 199 }
AnnaBridge 167:e84263d55307 200
AnnaBridge 168:9672193075cf 201 api_unlock();
AnnaBridge 167:e84263d55307 202
AnnaBridge 187:0387e8f68319 203 return data_written != 0 ? (ssize_t) data_written : (ssize_t) - EAGAIN;
AnnaBridge 167:e84263d55307 204 }
AnnaBridge 167:e84263d55307 205
AnnaBridge 187:0387e8f68319 206 ssize_t UARTSerial::read(void *buffer, size_t length)
AnnaBridge 167:e84263d55307 207 {
AnnaBridge 167:e84263d55307 208 size_t data_read = 0;
AnnaBridge 167:e84263d55307 209
AnnaBridge 167:e84263d55307 210 char *ptr = static_cast<char *>(buffer);
AnnaBridge 167:e84263d55307 211
Anna Bridge 180:96ed750bd169 212 if (length == 0) {
Anna Bridge 180:96ed750bd169 213 return 0;
Anna Bridge 180:96ed750bd169 214 }
Anna Bridge 180:96ed750bd169 215
AnnaBridge 168:9672193075cf 216 api_lock();
AnnaBridge 167:e84263d55307 217
AnnaBridge 167:e84263d55307 218 while (_rxbuf.empty()) {
AnnaBridge 167:e84263d55307 219 if (!_blocking) {
AnnaBridge 168:9672193075cf 220 api_unlock();
AnnaBridge 167:e84263d55307 221 return -EAGAIN;
AnnaBridge 167:e84263d55307 222 }
AnnaBridge 168:9672193075cf 223 api_unlock();
AnnaBridge 167:e84263d55307 224 wait_ms(1); // XXX todo - proper wait, WFE for non-rtos ?
AnnaBridge 168:9672193075cf 225 api_lock();
AnnaBridge 167:e84263d55307 226 }
AnnaBridge 167:e84263d55307 227
AnnaBridge 167:e84263d55307 228 while (data_read < length && !_rxbuf.empty()) {
AnnaBridge 167:e84263d55307 229 _rxbuf.pop(*ptr++);
AnnaBridge 167:e84263d55307 230 data_read++;
AnnaBridge 167:e84263d55307 231 }
AnnaBridge 167:e84263d55307 232
Anna Bridge 180:96ed750bd169 233 core_util_critical_section_enter();
Anna Bridge 180:96ed750bd169 234 if (!_rx_irq_enabled) {
Anna Bridge 180:96ed750bd169 235 UARTSerial::rx_irq(); // only read from hardware in one place
Anna Bridge 180:96ed750bd169 236 if (!_rxbuf.full()) {
Anna Bridge 180:96ed750bd169 237 SerialBase::attach(callback(this, &UARTSerial::rx_irq), RxIrq);
Anna Bridge 180:96ed750bd169 238 _rx_irq_enabled = true;
Anna Bridge 180:96ed750bd169 239 }
Anna Bridge 180:96ed750bd169 240 }
Anna Bridge 180:96ed750bd169 241 core_util_critical_section_exit();
Anna Bridge 180:96ed750bd169 242
AnnaBridge 168:9672193075cf 243 api_unlock();
AnnaBridge 167:e84263d55307 244
AnnaBridge 167:e84263d55307 245 return data_read;
AnnaBridge 167:e84263d55307 246 }
AnnaBridge 167:e84263d55307 247
AnnaBridge 167:e84263d55307 248 bool UARTSerial::hup() const
AnnaBridge 167:e84263d55307 249 {
AnnaBridge 167:e84263d55307 250 return _dcd_irq && _dcd_irq->read() != 0;
AnnaBridge 167:e84263d55307 251 }
AnnaBridge 167:e84263d55307 252
AnnaBridge 167:e84263d55307 253 void UARTSerial::wake()
AnnaBridge 167:e84263d55307 254 {
AnnaBridge 167:e84263d55307 255 if (_sigio_cb) {
AnnaBridge 167:e84263d55307 256 _sigio_cb();
AnnaBridge 167:e84263d55307 257 }
AnnaBridge 167:e84263d55307 258 }
AnnaBridge 167:e84263d55307 259
AnnaBridge 187:0387e8f68319 260 short UARTSerial::poll(short events) const
AnnaBridge 187:0387e8f68319 261 {
AnnaBridge 167:e84263d55307 262
AnnaBridge 167:e84263d55307 263 short revents = 0;
AnnaBridge 167:e84263d55307 264 /* Check the Circular Buffer if space available for writing out */
AnnaBridge 167:e84263d55307 265
AnnaBridge 167:e84263d55307 266
AnnaBridge 167:e84263d55307 267 if (!_rxbuf.empty()) {
AnnaBridge 167:e84263d55307 268 revents |= POLLIN;
AnnaBridge 167:e84263d55307 269 }
AnnaBridge 167:e84263d55307 270
AnnaBridge 167:e84263d55307 271 /* POLLHUP and POLLOUT are mutually exclusive */
AnnaBridge 167:e84263d55307 272 if (hup()) {
AnnaBridge 167:e84263d55307 273 revents |= POLLHUP;
AnnaBridge 167:e84263d55307 274 } else if (!_txbuf.full()) {
AnnaBridge 167:e84263d55307 275 revents |= POLLOUT;
AnnaBridge 167:e84263d55307 276 }
AnnaBridge 167:e84263d55307 277
AnnaBridge 167:e84263d55307 278 /*TODO Handle other event types */
AnnaBridge 167:e84263d55307 279
AnnaBridge 167:e84263d55307 280 return revents;
AnnaBridge 167:e84263d55307 281 }
AnnaBridge 167:e84263d55307 282
AnnaBridge 168:9672193075cf 283 void UARTSerial::lock()
AnnaBridge 168:9672193075cf 284 {
AnnaBridge 168:9672193075cf 285 // This is the override for SerialBase.
AnnaBridge 168:9672193075cf 286 // No lock required as we only use SerialBase from interrupt or from
AnnaBridge 168:9672193075cf 287 // inside our own critical section.
AnnaBridge 168:9672193075cf 288 }
AnnaBridge 168:9672193075cf 289
AnnaBridge 168:9672193075cf 290 void UARTSerial::unlock()
AnnaBridge 168:9672193075cf 291 {
AnnaBridge 168:9672193075cf 292 // This is the override for SerialBase.
AnnaBridge 168:9672193075cf 293 }
AnnaBridge 168:9672193075cf 294
AnnaBridge 168:9672193075cf 295 void UARTSerial::api_lock(void)
AnnaBridge 167:e84263d55307 296 {
AnnaBridge 167:e84263d55307 297 _mutex.lock();
AnnaBridge 167:e84263d55307 298 }
AnnaBridge 167:e84263d55307 299
AnnaBridge 168:9672193075cf 300 void UARTSerial::api_unlock(void)
AnnaBridge 167:e84263d55307 301 {
AnnaBridge 167:e84263d55307 302 _mutex.unlock();
AnnaBridge 167:e84263d55307 303 }
AnnaBridge 167:e84263d55307 304
AnnaBridge 167:e84263d55307 305 void UARTSerial::rx_irq(void)
AnnaBridge 167:e84263d55307 306 {
AnnaBridge 167:e84263d55307 307 bool was_empty = _rxbuf.empty();
AnnaBridge 167:e84263d55307 308
AnnaBridge 167:e84263d55307 309 /* Fill in the receive buffer if the peripheral is readable
AnnaBridge 167:e84263d55307 310 * and receive buffer is not full. */
Anna Bridge 180:96ed750bd169 311 while (!_rxbuf.full() && SerialBase::readable()) {
AnnaBridge 167:e84263d55307 312 char data = SerialBase::_base_getc();
Anna Bridge 180:96ed750bd169 313 _rxbuf.push(data);
Anna Bridge 180:96ed750bd169 314 }
Anna Bridge 180:96ed750bd169 315
Anna Bridge 180:96ed750bd169 316 if (_rx_irq_enabled && _rxbuf.full()) {
Anna Bridge 180:96ed750bd169 317 SerialBase::attach(NULL, RxIrq);
Anna Bridge 180:96ed750bd169 318 _rx_irq_enabled = false;
AnnaBridge 167:e84263d55307 319 }
AnnaBridge 167:e84263d55307 320
AnnaBridge 167:e84263d55307 321 /* Report the File handler that data is ready to be read from the buffer. */
AnnaBridge 167:e84263d55307 322 if (was_empty && !_rxbuf.empty()) {
AnnaBridge 167:e84263d55307 323 wake();
AnnaBridge 167:e84263d55307 324 }
AnnaBridge 167:e84263d55307 325 }
AnnaBridge 167:e84263d55307 326
AnnaBridge 167:e84263d55307 327 // Also called from write to start transfer
AnnaBridge 167:e84263d55307 328 void UARTSerial::tx_irq(void)
AnnaBridge 167:e84263d55307 329 {
AnnaBridge 167:e84263d55307 330 bool was_full = _txbuf.full();
Anna Bridge 186:707f6e361f3e 331 char data;
AnnaBridge 167:e84263d55307 332
AnnaBridge 167:e84263d55307 333 /* Write to the peripheral if there is something to write
AnnaBridge 167:e84263d55307 334 * and if the peripheral is available to write. */
Anna Bridge 186:707f6e361f3e 335 while (SerialBase::writeable() && _txbuf.pop(data)) {
AnnaBridge 167:e84263d55307 336 SerialBase::_base_putc(data);
AnnaBridge 167:e84263d55307 337 }
AnnaBridge 167:e84263d55307 338
AnnaBridge 167:e84263d55307 339 if (_tx_irq_enabled && _txbuf.empty()) {
AnnaBridge 167:e84263d55307 340 SerialBase::attach(NULL, TxIrq);
AnnaBridge 167:e84263d55307 341 _tx_irq_enabled = false;
AnnaBridge 167:e84263d55307 342 }
AnnaBridge 167:e84263d55307 343
AnnaBridge 167:e84263d55307 344 /* Report the File handler that data can be written to peripheral. */
AnnaBridge 167:e84263d55307 345 if (was_full && !_txbuf.full() && !hup()) {
AnnaBridge 167:e84263d55307 346 wake();
AnnaBridge 167:e84263d55307 347 }
AnnaBridge 167:e84263d55307 348 }
AnnaBridge 167:e84263d55307 349
AnnaBridge 176:447f873cad2f 350 void UARTSerial::wait_ms(uint32_t millisec)
AnnaBridge 176:447f873cad2f 351 {
AnnaBridge 176:447f873cad2f 352 /* wait_ms implementation for RTOS spins until exact microseconds - we
AnnaBridge 176:447f873cad2f 353 * want to just sleep until next tick.
AnnaBridge 176:447f873cad2f 354 */
AnnaBridge 176:447f873cad2f 355 #if MBED_CONF_RTOS_PRESENT
AnnaBridge 189:f392fc9709a3 356 rtos::ThisThread::sleep_for(millisec);
AnnaBridge 176:447f873cad2f 357 #else
AnnaBridge 176:447f873cad2f 358 ::wait_ms(millisec);
AnnaBridge 176:447f873cad2f 359 #endif
AnnaBridge 176:447f873cad2f 360 }
AnnaBridge 167:e84263d55307 361 } //namespace mbed
AnnaBridge 167:e84263d55307 362
AnnaBridge 168:9672193075cf 363 #endif //(DEVICE_SERIAL && DEVICE_INTERRUPTIN)