mbed-os for GR-LYCHEE
Dependents: mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more
features/frameworks/utest/source/utest_shim.cpp@0:f782d9c66c49, 2018-02-02 (annotated)
- Committer:
- dkato
- Date:
- Fri Feb 02 05:42:23 2018 +0000
- Revision:
- 0:f782d9c66c49
mbed-os for GR-LYCHEE
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 0:f782d9c66c49 | 1 | /**************************************************************************** |
dkato | 0:f782d9c66c49 | 2 | * Copyright (c) 2015, ARM Limited, All Rights Reserved |
dkato | 0:f782d9c66c49 | 3 | * SPDX-License-Identifier: Apache-2.0 |
dkato | 0:f782d9c66c49 | 4 | * |
dkato | 0:f782d9c66c49 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
dkato | 0:f782d9c66c49 | 6 | * not use this file except in compliance with the License. |
dkato | 0:f782d9c66c49 | 7 | * You may obtain a copy of the License at |
dkato | 0:f782d9c66c49 | 8 | * |
dkato | 0:f782d9c66c49 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
dkato | 0:f782d9c66c49 | 10 | * |
dkato | 0:f782d9c66c49 | 11 | * Unless required by applicable law or agreed to in writing, software |
dkato | 0:f782d9c66c49 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
dkato | 0:f782d9c66c49 | 13 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
dkato | 0:f782d9c66c49 | 14 | * See the License for the specific language governing permissions and |
dkato | 0:f782d9c66c49 | 15 | * limitations under the License. |
dkato | 0:f782d9c66c49 | 16 | **************************************************************************** |
dkato | 0:f782d9c66c49 | 17 | */ |
dkato | 0:f782d9c66c49 | 18 | |
dkato | 0:f782d9c66c49 | 19 | #include "utest/utest_shim.h" |
dkato | 0:f782d9c66c49 | 20 | #include "utest/utest_stack_trace.h" |
dkato | 0:f782d9c66c49 | 21 | |
dkato | 0:f782d9c66c49 | 22 | #if UTEST_SHIM_SCHEDULER_USE_MINAR |
dkato | 0:f782d9c66c49 | 23 | #include "minar/minar.h" |
dkato | 0:f782d9c66c49 | 24 | |
dkato | 0:f782d9c66c49 | 25 | static int32_t utest_minar_init() |
dkato | 0:f782d9c66c49 | 26 | { |
dkato | 0:f782d9c66c49 | 27 | return 0; |
dkato | 0:f782d9c66c49 | 28 | } |
dkato | 0:f782d9c66c49 | 29 | static void *utest_minar_post(const utest_v1_harness_callback_t callback, const uint32_t delay_ms) |
dkato | 0:f782d9c66c49 | 30 | { |
dkato | 0:f782d9c66c49 | 31 | void *handle = minar::Scheduler::postCallback(callback).delay(minar::milliseconds(delay_ms)).getHandle(); |
dkato | 0:f782d9c66c49 | 32 | return handle; |
dkato | 0:f782d9c66c49 | 33 | } |
dkato | 0:f782d9c66c49 | 34 | static int32_t utest_minar_cancel(void *handle) |
dkato | 0:f782d9c66c49 | 35 | { |
dkato | 0:f782d9c66c49 | 36 | int32_t ret = minar::Scheduler::cancelCallback(handle); |
dkato | 0:f782d9c66c49 | 37 | return ret; |
dkato | 0:f782d9c66c49 | 38 | } |
dkato | 0:f782d9c66c49 | 39 | static int32_t utest_minar_run() |
dkato | 0:f782d9c66c49 | 40 | { |
dkato | 0:f782d9c66c49 | 41 | return 0; |
dkato | 0:f782d9c66c49 | 42 | } |
dkato | 0:f782d9c66c49 | 43 | extern "C" { |
dkato | 0:f782d9c66c49 | 44 | static const utest_v1_scheduler_t utest_v1_scheduler = |
dkato | 0:f782d9c66c49 | 45 | { |
dkato | 0:f782d9c66c49 | 46 | utest_minar_init, |
dkato | 0:f782d9c66c49 | 47 | utest_minar_post, |
dkato | 0:f782d9c66c49 | 48 | utest_minar_cancel, |
dkato | 0:f782d9c66c49 | 49 | utest_minar_run |
dkato | 0:f782d9c66c49 | 50 | }; |
dkato | 0:f782d9c66c49 | 51 | utest_v1_scheduler_t utest_v1_get_scheduler() |
dkato | 0:f782d9c66c49 | 52 | { |
dkato | 0:f782d9c66c49 | 53 | return utest_v1_scheduler; |
dkato | 0:f782d9c66c49 | 54 | } |
dkato | 0:f782d9c66c49 | 55 | } |
dkato | 0:f782d9c66c49 | 56 | |
dkato | 0:f782d9c66c49 | 57 | #elif UTEST_SHIM_SCHEDULER_USE_US_TICKER |
dkato | 0:f782d9c66c49 | 58 | #ifdef YOTTA_MBED_HAL_VERSION_STRING |
dkato | 0:f782d9c66c49 | 59 | # include "mbed-hal/us_ticker_api.h" |
dkato | 0:f782d9c66c49 | 60 | #else |
dkato | 0:f782d9c66c49 | 61 | # include "mbed.h" |
dkato | 0:f782d9c66c49 | 62 | #endif |
dkato | 0:f782d9c66c49 | 63 | |
dkato | 0:f782d9c66c49 | 64 | // only one callback is active at any given time |
dkato | 0:f782d9c66c49 | 65 | static volatile utest_v1_harness_callback_t minimal_callback; |
dkato | 0:f782d9c66c49 | 66 | static volatile utest_v1_harness_callback_t ticker_callback; |
dkato | 0:f782d9c66c49 | 67 | |
dkato | 0:f782d9c66c49 | 68 | // Timeout object used to control the scheduling of test case callbacks |
dkato | 0:f782d9c66c49 | 69 | SingletonPtr<Timeout> utest_timeout_object; |
dkato | 0:f782d9c66c49 | 70 | |
dkato | 0:f782d9c66c49 | 71 | static void ticker_handler() |
dkato | 0:f782d9c66c49 | 72 | { |
dkato | 0:f782d9c66c49 | 73 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 74 | minimal_callback = ticker_callback; |
dkato | 0:f782d9c66c49 | 75 | } |
dkato | 0:f782d9c66c49 | 76 | |
dkato | 0:f782d9c66c49 | 77 | static int32_t utest_us_ticker_init() |
dkato | 0:f782d9c66c49 | 78 | { |
dkato | 0:f782d9c66c49 | 79 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 80 | // initialize the Timeout object to makes sure it is not initialized in |
dkato | 0:f782d9c66c49 | 81 | // interrupt context. |
dkato | 0:f782d9c66c49 | 82 | utest_timeout_object.get(); |
dkato | 0:f782d9c66c49 | 83 | return 0; |
dkato | 0:f782d9c66c49 | 84 | } |
dkato | 0:f782d9c66c49 | 85 | static void *utest_us_ticker_post(const utest_v1_harness_callback_t callback, timestamp_t delay_ms) |
dkato | 0:f782d9c66c49 | 86 | { |
dkato | 0:f782d9c66c49 | 87 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 88 | timestamp_t delay_us = delay_ms *1000; |
dkato | 0:f782d9c66c49 | 89 | |
dkato | 0:f782d9c66c49 | 90 | if (delay_ms) { |
dkato | 0:f782d9c66c49 | 91 | ticker_callback = callback; |
dkato | 0:f782d9c66c49 | 92 | // fire the interrupt in 1000us * delay_ms |
dkato | 0:f782d9c66c49 | 93 | utest_timeout_object->attach_us(ticker_handler, delay_us); |
dkato | 0:f782d9c66c49 | 94 | |
dkato | 0:f782d9c66c49 | 95 | } |
dkato | 0:f782d9c66c49 | 96 | else { |
dkato | 0:f782d9c66c49 | 97 | minimal_callback = callback; |
dkato | 0:f782d9c66c49 | 98 | } |
dkato | 0:f782d9c66c49 | 99 | |
dkato | 0:f782d9c66c49 | 100 | // return a bogus handle |
dkato | 0:f782d9c66c49 | 101 | return (void*)1; |
dkato | 0:f782d9c66c49 | 102 | } |
dkato | 0:f782d9c66c49 | 103 | static int32_t utest_us_ticker_cancel(void *handle) |
dkato | 0:f782d9c66c49 | 104 | { |
dkato | 0:f782d9c66c49 | 105 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 106 | (void) handle; |
dkato | 0:f782d9c66c49 | 107 | utest_timeout_object->detach(); |
dkato | 0:f782d9c66c49 | 108 | return 0; |
dkato | 0:f782d9c66c49 | 109 | } |
dkato | 0:f782d9c66c49 | 110 | static int32_t utest_us_ticker_run() |
dkato | 0:f782d9c66c49 | 111 | { |
dkato | 0:f782d9c66c49 | 112 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 113 | while(1) |
dkato | 0:f782d9c66c49 | 114 | { |
dkato | 0:f782d9c66c49 | 115 | // check if a new callback has been set |
dkato | 0:f782d9c66c49 | 116 | if (minimal_callback) |
dkato | 0:f782d9c66c49 | 117 | { |
dkato | 0:f782d9c66c49 | 118 | // copy the callback |
dkato | 0:f782d9c66c49 | 119 | utest_v1_harness_callback_t callback = minimal_callback; |
dkato | 0:f782d9c66c49 | 120 | // reset the shared callback |
dkato | 0:f782d9c66c49 | 121 | minimal_callback = NULL; |
dkato | 0:f782d9c66c49 | 122 | // execute the copied callback |
dkato | 0:f782d9c66c49 | 123 | callback(); |
dkato | 0:f782d9c66c49 | 124 | } |
dkato | 0:f782d9c66c49 | 125 | } |
dkato | 0:f782d9c66c49 | 126 | } |
dkato | 0:f782d9c66c49 | 127 | |
dkato | 0:f782d9c66c49 | 128 | |
dkato | 0:f782d9c66c49 | 129 | extern "C" { |
dkato | 0:f782d9c66c49 | 130 | static const utest_v1_scheduler_t utest_v1_scheduler = |
dkato | 0:f782d9c66c49 | 131 | { |
dkato | 0:f782d9c66c49 | 132 | utest_us_ticker_init, |
dkato | 0:f782d9c66c49 | 133 | utest_us_ticker_post, |
dkato | 0:f782d9c66c49 | 134 | utest_us_ticker_cancel, |
dkato | 0:f782d9c66c49 | 135 | utest_us_ticker_run |
dkato | 0:f782d9c66c49 | 136 | }; |
dkato | 0:f782d9c66c49 | 137 | utest_v1_scheduler_t utest_v1_get_scheduler() |
dkato | 0:f782d9c66c49 | 138 | { |
dkato | 0:f782d9c66c49 | 139 | UTEST_LOG_FUNCTION(); |
dkato | 0:f782d9c66c49 | 140 | return utest_v1_scheduler; |
dkato | 0:f782d9c66c49 | 141 | } |
dkato | 0:f782d9c66c49 | 142 | } |
dkato | 0:f782d9c66c49 | 143 | #endif |
dkato | 0:f782d9c66c49 | 144 | |
dkato | 0:f782d9c66c49 | 145 | #ifdef YOTTA_CORE_UTIL_VERSION_STRING |
dkato | 0:f782d9c66c49 | 146 | // their functionality is implemented using the CriticalSectionLock class |
dkato | 0:f782d9c66c49 | 147 | void utest_v1_enter_critical_section(void) {} |
dkato | 0:f782d9c66c49 | 148 | void utest_v1_leave_critical_section(void) {} |
dkato | 0:f782d9c66c49 | 149 | #endif |