takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /* mbed Microcontroller Library
kadonotakashi 0:8fdf9a60065b 2 * Copyright (c) 2006-2012 ARM Limited
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
kadonotakashi 0:8fdf9a60065b 5 * of this software and associated documentation files (the "Software"), to deal
kadonotakashi 0:8fdf9a60065b 6 * in the Software without restriction, including without limitation the rights
kadonotakashi 0:8fdf9a60065b 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kadonotakashi 0:8fdf9a60065b 8 * copies of the Software, and to permit persons to whom the Software is
kadonotakashi 0:8fdf9a60065b 9 * furnished to do so, subject to the following conditions:
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * The above copyright notice and this permission notice shall be included in
kadonotakashi 0:8fdf9a60065b 12 * all copies or substantial portions of the Software.
kadonotakashi 0:8fdf9a60065b 13 *
kadonotakashi 0:8fdf9a60065b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kadonotakashi 0:8fdf9a60065b 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kadonotakashi 0:8fdf9a60065b 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kadonotakashi 0:8fdf9a60065b 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kadonotakashi 0:8fdf9a60065b 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kadonotakashi 0:8fdf9a60065b 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
kadonotakashi 0:8fdf9a60065b 20 * SOFTWARE.
kadonotakashi 0:8fdf9a60065b 21 */
kadonotakashi 0:8fdf9a60065b 22 #include "rtos/Mutex.h"
kadonotakashi 0:8fdf9a60065b 23 #include "rtos/Kernel.h"
kadonotakashi 0:8fdf9a60065b 24
kadonotakashi 0:8fdf9a60065b 25 #include <string.h>
kadonotakashi 0:8fdf9a60065b 26 #include "mbed_error.h"
kadonotakashi 0:8fdf9a60065b 27 #include "mbed_assert.h"
kadonotakashi 0:8fdf9a60065b 28
kadonotakashi 0:8fdf9a60065b 29 namespace rtos {
kadonotakashi 0:8fdf9a60065b 30
kadonotakashi 0:8fdf9a60065b 31 Mutex::Mutex(): _count(0)
kadonotakashi 0:8fdf9a60065b 32 {
kadonotakashi 0:8fdf9a60065b 33 constructor();
kadonotakashi 0:8fdf9a60065b 34 }
kadonotakashi 0:8fdf9a60065b 35
kadonotakashi 0:8fdf9a60065b 36 Mutex::Mutex(const char *name)
kadonotakashi 0:8fdf9a60065b 37 {
kadonotakashi 0:8fdf9a60065b 38 constructor(name);
kadonotakashi 0:8fdf9a60065b 39 }
kadonotakashi 0:8fdf9a60065b 40
kadonotakashi 0:8fdf9a60065b 41 void Mutex::constructor(const char *name)
kadonotakashi 0:8fdf9a60065b 42 {
kadonotakashi 0:8fdf9a60065b 43 memset(&_obj_mem, 0, sizeof(_obj_mem));
kadonotakashi 0:8fdf9a60065b 44 osMutexAttr_t attr =
kadonotakashi 0:8fdf9a60065b 45 { 0 };
kadonotakashi 0:8fdf9a60065b 46 attr.name = name ? name : "aplication_unnamed_mutex";
kadonotakashi 0:8fdf9a60065b 47 attr.cb_mem = &_obj_mem;
kadonotakashi 0:8fdf9a60065b 48 attr.cb_size = sizeof(_obj_mem);
kadonotakashi 0:8fdf9a60065b 49 attr.attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust;
kadonotakashi 0:8fdf9a60065b 50 _id = osMutexNew(&attr);
kadonotakashi 0:8fdf9a60065b 51 MBED_ASSERT(_id);
kadonotakashi 0:8fdf9a60065b 52 }
kadonotakashi 0:8fdf9a60065b 53
kadonotakashi 0:8fdf9a60065b 54 osStatus Mutex::lock(void)
kadonotakashi 0:8fdf9a60065b 55 {
kadonotakashi 0:8fdf9a60065b 56 osStatus status = osMutexAcquire(_id, osWaitForever);
kadonotakashi 0:8fdf9a60065b 57 if (osOK == status) {
kadonotakashi 0:8fdf9a60065b 58 _count++;
kadonotakashi 0:8fdf9a60065b 59 }
kadonotakashi 0:8fdf9a60065b 60
kadonotakashi 0:8fdf9a60065b 61 if (status != osOK) {
kadonotakashi 0:8fdf9a60065b 62 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_KERNEL, MBED_ERROR_CODE_MUTEX_LOCK_FAILED), "Mutex lock failed", status);
kadonotakashi 0:8fdf9a60065b 63 }
kadonotakashi 0:8fdf9a60065b 64
kadonotakashi 0:8fdf9a60065b 65 return osOK;
kadonotakashi 0:8fdf9a60065b 66 }
kadonotakashi 0:8fdf9a60065b 67
kadonotakashi 0:8fdf9a60065b 68 osStatus Mutex::lock(uint32_t millisec)
kadonotakashi 0:8fdf9a60065b 69 {
kadonotakashi 0:8fdf9a60065b 70 osStatus status = osMutexAcquire(_id, millisec);
kadonotakashi 0:8fdf9a60065b 71 if (osOK == status) {
kadonotakashi 0:8fdf9a60065b 72 _count++;
kadonotakashi 0:8fdf9a60065b 73 }
kadonotakashi 0:8fdf9a60065b 74
kadonotakashi 0:8fdf9a60065b 75 bool success = (status == osOK ||
kadonotakashi 0:8fdf9a60065b 76 (status == osErrorResource && millisec == 0) ||
kadonotakashi 0:8fdf9a60065b 77 (status == osErrorTimeout && millisec != osWaitForever));
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 if (!success) {
kadonotakashi 0:8fdf9a60065b 80 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_KERNEL, MBED_ERROR_CODE_MUTEX_LOCK_FAILED), "Mutex lock failed", status);
kadonotakashi 0:8fdf9a60065b 81 }
kadonotakashi 0:8fdf9a60065b 82
kadonotakashi 0:8fdf9a60065b 83 return status;
kadonotakashi 0:8fdf9a60065b 84 }
kadonotakashi 0:8fdf9a60065b 85
kadonotakashi 0:8fdf9a60065b 86 bool Mutex::trylock()
kadonotakashi 0:8fdf9a60065b 87 {
kadonotakashi 0:8fdf9a60065b 88 return trylock_for(0);
kadonotakashi 0:8fdf9a60065b 89 }
kadonotakashi 0:8fdf9a60065b 90
kadonotakashi 0:8fdf9a60065b 91 bool Mutex::trylock_for(uint32_t millisec)
kadonotakashi 0:8fdf9a60065b 92 {
kadonotakashi 0:8fdf9a60065b 93 osStatus status = osMutexAcquire(_id, millisec);
kadonotakashi 0:8fdf9a60065b 94 if (status == osOK) {
kadonotakashi 0:8fdf9a60065b 95 return true;
kadonotakashi 0:8fdf9a60065b 96 }
kadonotakashi 0:8fdf9a60065b 97
kadonotakashi 0:8fdf9a60065b 98 bool success = (status == osOK ||
kadonotakashi 0:8fdf9a60065b 99 (status == osErrorResource && millisec == 0) ||
kadonotakashi 0:8fdf9a60065b 100 (status == osErrorTimeout && millisec != osWaitForever));
kadonotakashi 0:8fdf9a60065b 101
kadonotakashi 0:8fdf9a60065b 102 if (!success) {
kadonotakashi 0:8fdf9a60065b 103 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_KERNEL, MBED_ERROR_CODE_MUTEX_LOCK_FAILED), "Mutex lock failed", status);
kadonotakashi 0:8fdf9a60065b 104 }
kadonotakashi 0:8fdf9a60065b 105
kadonotakashi 0:8fdf9a60065b 106 return false;
kadonotakashi 0:8fdf9a60065b 107 }
kadonotakashi 0:8fdf9a60065b 108
kadonotakashi 0:8fdf9a60065b 109 bool Mutex::trylock_until(uint64_t millisec)
kadonotakashi 0:8fdf9a60065b 110 {
kadonotakashi 0:8fdf9a60065b 111 uint64_t now = Kernel::get_ms_count();
kadonotakashi 0:8fdf9a60065b 112
kadonotakashi 0:8fdf9a60065b 113 if (now >= millisec) {
kadonotakashi 0:8fdf9a60065b 114 return trylock();
kadonotakashi 0:8fdf9a60065b 115 } else if (millisec - now >= osWaitForever) {
kadonotakashi 0:8fdf9a60065b 116 // API permits early return
kadonotakashi 0:8fdf9a60065b 117 return trylock_for(osWaitForever - 1);
kadonotakashi 0:8fdf9a60065b 118 } else {
kadonotakashi 0:8fdf9a60065b 119 return trylock_for(millisec - now);
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121 }
kadonotakashi 0:8fdf9a60065b 122
kadonotakashi 0:8fdf9a60065b 123 osStatus Mutex::unlock()
kadonotakashi 0:8fdf9a60065b 124 {
kadonotakashi 0:8fdf9a60065b 125 _count--;
kadonotakashi 0:8fdf9a60065b 126
kadonotakashi 0:8fdf9a60065b 127 osStatus status = osMutexRelease(_id);
kadonotakashi 0:8fdf9a60065b 128
kadonotakashi 0:8fdf9a60065b 129 if (status != osOK) {
kadonotakashi 0:8fdf9a60065b 130 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_KERNEL, MBED_ERROR_CODE_MUTEX_UNLOCK_FAILED), "Mutex unlock failed", status);
kadonotakashi 0:8fdf9a60065b 131 }
kadonotakashi 0:8fdf9a60065b 132
kadonotakashi 0:8fdf9a60065b 133 return osOK;
kadonotakashi 0:8fdf9a60065b 134 }
kadonotakashi 0:8fdf9a60065b 135
kadonotakashi 0:8fdf9a60065b 136 osThreadId Mutex::get_owner()
kadonotakashi 0:8fdf9a60065b 137 {
kadonotakashi 0:8fdf9a60065b 138 return osMutexGetOwner(_id);
kadonotakashi 0:8fdf9a60065b 139 }
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 Mutex::~Mutex()
kadonotakashi 0:8fdf9a60065b 142 {
kadonotakashi 0:8fdf9a60065b 143 osMutexDelete(_id);
kadonotakashi 0:8fdf9a60065b 144 }
kadonotakashi 0:8fdf9a60065b 145
kadonotakashi 0:8fdf9a60065b 146 }