Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HttpServer_snapshot_mbed-os
mbed-gr-libs/GraphicsFramework/ospl/inc/r_ospl.h@0:e9fd5575b10e, 2019-10-18 (annotated)
- Committer:
- anhtran
- Date:
- Fri Oct 18 03:09:43 2019 +0000
- Revision:
- 0:e9fd5575b10e
abc
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| anhtran | 0:e9fd5575b10e | 1 | /******************************************************************************* |
| anhtran | 0:e9fd5575b10e | 2 | * DISCLAIMER |
| anhtran | 0:e9fd5575b10e | 3 | * This software is supplied by Renesas Electronics Corporation and is only |
| anhtran | 0:e9fd5575b10e | 4 | * intended for use with Renesas products. No other uses are authorized. This |
| anhtran | 0:e9fd5575b10e | 5 | * software is owned by Renesas Electronics Corporation and is protected under |
| anhtran | 0:e9fd5575b10e | 6 | * all applicable laws, including copyright laws. |
| anhtran | 0:e9fd5575b10e | 7 | * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING |
| anhtran | 0:e9fd5575b10e | 8 | * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT |
| anhtran | 0:e9fd5575b10e | 9 | * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
| anhtran | 0:e9fd5575b10e | 10 | * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. |
| anhtran | 0:e9fd5575b10e | 11 | * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS |
| anhtran | 0:e9fd5575b10e | 12 | * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE |
| anhtran | 0:e9fd5575b10e | 13 | * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR |
| anhtran | 0:e9fd5575b10e | 14 | * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE |
| anhtran | 0:e9fd5575b10e | 15 | * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
| anhtran | 0:e9fd5575b10e | 16 | * Renesas reserves the right, without notice, to make changes to this software |
| anhtran | 0:e9fd5575b10e | 17 | * and to discontinue the availability of this software. By using this software, |
| anhtran | 0:e9fd5575b10e | 18 | * you agree to the additional terms and conditions found by accessing the |
| anhtran | 0:e9fd5575b10e | 19 | * following link: |
| anhtran | 0:e9fd5575b10e | 20 | * http://www.renesas.com/disclaimer |
| anhtran | 0:e9fd5575b10e | 21 | * Copyright (C) 2012 - 2015 Renesas Electronics Corporation. All rights reserved. |
| anhtran | 0:e9fd5575b10e | 22 | *******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 23 | /** |
| anhtran | 0:e9fd5575b10e | 24 | * @file r_ospl.h |
| anhtran | 0:e9fd5575b10e | 25 | * @brief OS Porting Layer. Main Header. Functions. |
| anhtran | 0:e9fd5575b10e | 26 | * |
| anhtran | 0:e9fd5575b10e | 27 | * $Module: OSPL $ $PublicVersion: 0.90 $ (=R_OSPL_VERSION) |
| anhtran | 0:e9fd5575b10e | 28 | * $Rev: 35 $ |
| anhtran | 0:e9fd5575b10e | 29 | * $Date:: 2014-04-15 21:38:18 +0900#$ |
| anhtran | 0:e9fd5575b10e | 30 | */ |
| anhtran | 0:e9fd5575b10e | 31 | |
| anhtran | 0:e9fd5575b10e | 32 | #ifndef R_OSPL_H |
| anhtran | 0:e9fd5575b10e | 33 | #define R_OSPL_H |
| anhtran | 0:e9fd5575b10e | 34 | |
| anhtran | 0:e9fd5575b10e | 35 | |
| anhtran | 0:e9fd5575b10e | 36 | /****************************************************************************** |
| anhtran | 0:e9fd5575b10e | 37 | Includes <System Includes> , "Project Includes" |
| anhtran | 0:e9fd5575b10e | 38 | ******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 39 | #include "Project_Config.h" |
| anhtran | 0:e9fd5575b10e | 40 | #include "ospl_platform.h" |
| anhtran | 0:e9fd5575b10e | 41 | #include "r_ospl_typedef.h" |
| anhtran | 0:e9fd5575b10e | 42 | #include "r_multi_compiler_typedef.h" |
| anhtran | 0:e9fd5575b10e | 43 | #include "locking.h" |
| anhtran | 0:e9fd5575b10e | 44 | #include "r_static_an_tag.h" |
| anhtran | 0:e9fd5575b10e | 45 | #include "r_ospl_debug.h" |
| anhtran | 0:e9fd5575b10e | 46 | #if ! R_OSPL_IS_PREEMPTION |
| anhtran | 0:e9fd5575b10e | 47 | #include "r_ospl_os_less.h" |
| anhtran | 0:e9fd5575b10e | 48 | #endif |
| anhtran | 0:e9fd5575b10e | 49 | |
| anhtran | 0:e9fd5575b10e | 50 | #ifdef __cplusplus |
| anhtran | 0:e9fd5575b10e | 51 | extern "C" { |
| anhtran | 0:e9fd5575b10e | 52 | #endif /* __cplusplus */ |
| anhtran | 0:e9fd5575b10e | 53 | |
| anhtran | 0:e9fd5575b10e | 54 | |
| anhtran | 0:e9fd5575b10e | 55 | /****************************************************************************** |
| anhtran | 0:e9fd5575b10e | 56 | Typedef definitions |
| anhtran | 0:e9fd5575b10e | 57 | ******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 58 | /* In "r_ospl_typedef.h" */ |
| anhtran | 0:e9fd5575b10e | 59 | |
| anhtran | 0:e9fd5575b10e | 60 | /****************************************************************************** |
| anhtran | 0:e9fd5575b10e | 61 | Macro definitions |
| anhtran | 0:e9fd5575b10e | 62 | ******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 63 | /* In "r_ospl_typedef.h" */ |
| anhtran | 0:e9fd5575b10e | 64 | |
| anhtran | 0:e9fd5575b10e | 65 | /****************************************************************************** |
| anhtran | 0:e9fd5575b10e | 66 | Variable Externs |
| anhtran | 0:e9fd5575b10e | 67 | ******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 68 | /* In "r_ospl_typedef.h" */ |
| anhtran | 0:e9fd5575b10e | 69 | |
| anhtran | 0:e9fd5575b10e | 70 | /****************************************************************************** |
| anhtran | 0:e9fd5575b10e | 71 | Functions Prototypes |
| anhtran | 0:e9fd5575b10e | 72 | ******************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 73 | |
| anhtran | 0:e9fd5575b10e | 74 | |
| anhtran | 0:e9fd5575b10e | 75 | /* Section: Version and initialize */ |
| anhtran | 0:e9fd5575b10e | 76 | /** |
| anhtran | 0:e9fd5575b10e | 77 | * @brief Returns version number of OSPL |
| anhtran | 0:e9fd5575b10e | 78 | * |
| anhtran | 0:e9fd5575b10e | 79 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 80 | * None |
| anhtran | 0:e9fd5575b10e | 81 | * @return Version number of OSPL |
| anhtran | 0:e9fd5575b10e | 82 | * |
| anhtran | 0:e9fd5575b10e | 83 | * @par Description |
| anhtran | 0:e9fd5575b10e | 84 | * Return value is same as "R_OSPL_VERSION" macro. |
| anhtran | 0:e9fd5575b10e | 85 | */ |
| anhtran | 0:e9fd5575b10e | 86 | int32_t R_OSPL_GetVersion(void); |
| anhtran | 0:e9fd5575b10e | 87 | |
| anhtran | 0:e9fd5575b10e | 88 | |
| anhtran | 0:e9fd5575b10e | 89 | /** |
| anhtran | 0:e9fd5575b10e | 90 | * @brief Returns whether the environment is supported preemption |
| anhtran | 0:e9fd5575b10e | 91 | * |
| anhtran | 0:e9fd5575b10e | 92 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 93 | * None |
| anhtran | 0:e9fd5575b10e | 94 | * @return Whether the environment is RTOS supported preemption |
| anhtran | 0:e9fd5575b10e | 95 | * |
| anhtran | 0:e9fd5575b10e | 96 | * @par Description |
| anhtran | 0:e9fd5575b10e | 97 | * Return value is same as "R_OSPL_IS_PREEMPTION" macro. |
| anhtran | 0:e9fd5575b10e | 98 | */ |
| anhtran | 0:e9fd5575b10e | 99 | bool_t R_OSPL_IsPreemption(void); |
| anhtran | 0:e9fd5575b10e | 100 | |
| anhtran | 0:e9fd5575b10e | 101 | |
| anhtran | 0:e9fd5575b10e | 102 | /** |
| anhtran | 0:e9fd5575b10e | 103 | * @brief Initializes the internal of OSPL |
| anhtran | 0:e9fd5575b10e | 104 | * |
| anhtran | 0:e9fd5575b10e | 105 | * @param NullConfig Specify NULL |
| anhtran | 0:e9fd5575b10e | 106 | * @return None |
| anhtran | 0:e9fd5575b10e | 107 | * |
| anhtran | 0:e9fd5575b10e | 108 | * @par Description |
| anhtran | 0:e9fd5575b10e | 109 | * Initializes internal mutual exclusion objects. |
| anhtran | 0:e9fd5575b10e | 110 | * However, "R_OSPL_Initialize" function does not have to be called for |
| anhtran | 0:e9fd5575b10e | 111 | * OSPL of "R_OSPL_IS_PREEMPTION = 0". |
| anhtran | 0:e9fd5575b10e | 112 | * "E_ACCESS_DENIED" error is raised, when the OSPL API that it is |
| anhtran | 0:e9fd5575b10e | 113 | * necessary to call "R_OSPL_Initialize" before calling the API was called. |
| anhtran | 0:e9fd5575b10e | 114 | */ |
| anhtran | 0:e9fd5575b10e | 115 | errnum_t R_OSPL_Initialize( const void *const NullConfig ); |
| anhtran | 0:e9fd5575b10e | 116 | |
| anhtran | 0:e9fd5575b10e | 117 | |
| anhtran | 0:e9fd5575b10e | 118 | /* Section: Standard functions */ |
| anhtran | 0:e9fd5575b10e | 119 | /** |
| anhtran | 0:e9fd5575b10e | 120 | * @brief No operation from C++ specification |
| anhtran | 0:e9fd5575b10e | 121 | * |
| anhtran | 0:e9fd5575b10e | 122 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 123 | * None |
| anhtran | 0:e9fd5575b10e | 124 | * @return None |
| anhtran | 0:e9fd5575b10e | 125 | * |
| anhtran | 0:e9fd5575b10e | 126 | * @par Description |
| anhtran | 0:e9fd5575b10e | 127 | * Compatible with __noop (MS C++). But our naming rule is not match. |
| anhtran | 0:e9fd5575b10e | 128 | */ |
| anhtran | 0:e9fd5575b10e | 129 | INLINE void R_NOOP(void) {} |
| anhtran | 0:e9fd5575b10e | 130 | |
| anhtran | 0:e9fd5575b10e | 131 | |
| anhtran | 0:e9fd5575b10e | 132 | /** |
| anhtran | 0:e9fd5575b10e | 133 | * @brief Returns element count of the array |
| anhtran | 0:e9fd5575b10e | 134 | * |
| anhtran | 0:e9fd5575b10e | 135 | * @param Array An array |
| anhtran | 0:e9fd5575b10e | 136 | * @return Count of specified array's element |
| anhtran | 0:e9fd5575b10e | 137 | * |
| anhtran | 0:e9fd5575b10e | 138 | * @par Description |
| anhtran | 0:e9fd5575b10e | 139 | * Compatible with _countof (MS C++) and ARRAY_SIZE (Linux). |
| anhtran | 0:e9fd5575b10e | 140 | * But our naming rule is not match. |
| anhtran | 0:e9fd5575b10e | 141 | * |
| anhtran | 0:e9fd5575b10e | 142 | * @par Example |
| anhtran | 0:e9fd5575b10e | 143 | * @code |
| anhtran | 0:e9fd5575b10e | 144 | * uint32_t array[10]; |
| anhtran | 0:e9fd5575b10e | 145 | * R_COUNT_OF( array ) // = 10 |
| anhtran | 0:e9fd5575b10e | 146 | * @endcode |
| anhtran | 0:e9fd5575b10e | 147 | * |
| anhtran | 0:e9fd5575b10e | 148 | * @par Example |
| anhtran | 0:e9fd5575b10e | 149 | * Array argument must not be specified the pointer using like array. |
| anhtran | 0:e9fd5575b10e | 150 | * @code |
| anhtran | 0:e9fd5575b10e | 151 | * uint32_t array[10]; |
| anhtran | 0:e9fd5575b10e | 152 | * func( array ); |
| anhtran | 0:e9fd5575b10e | 153 | * |
| anhtran | 0:e9fd5575b10e | 154 | * void func( uint32_t array[] ) // "array" is a pointer |
| anhtran | 0:e9fd5575b10e | 155 | * { |
| anhtran | 0:e9fd5575b10e | 156 | * R_COUNT_OF( array ) // NG |
| anhtran | 0:e9fd5575b10e | 157 | * } |
| anhtran | 0:e9fd5575b10e | 158 | * @endcode |
| anhtran | 0:e9fd5575b10e | 159 | */ |
| anhtran | 0:e9fd5575b10e | 160 | /* ->MISRA 19.7 : Cannot function */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 161 | #define R_COUNT_OF( Array ) ( sizeof( Array ) / sizeof( *(Array) ) ) |
| anhtran | 0:e9fd5575b10e | 162 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 163 | |
| anhtran | 0:e9fd5575b10e | 164 | |
| anhtran | 0:e9fd5575b10e | 165 | /* Section: Error handling and debugging (1) */ |
| anhtran | 0:e9fd5575b10e | 166 | |
| anhtran | 0:e9fd5575b10e | 167 | |
| anhtran | 0:e9fd5575b10e | 168 | /** |
| anhtran | 0:e9fd5575b10e | 169 | * @def IF |
| anhtran | 0:e9fd5575b10e | 170 | * @brief Breaks and transits to error state, if condition expression is not 0 |
| anhtran | 0:e9fd5575b10e | 171 | * @param Condition Condition expression |
| anhtran | 0:e9fd5575b10e | 172 | * @return None |
| anhtran | 0:e9fd5575b10e | 173 | * |
| anhtran | 0:e9fd5575b10e | 174 | * @par Example |
| anhtran | 0:e9fd5575b10e | 175 | * @code |
| anhtran | 0:e9fd5575b10e | 176 | * e= TestFunction(); IF(e){goto fin;} |
| anhtran | 0:e9fd5575b10e | 177 | * @endcode |
| anhtran | 0:e9fd5575b10e | 178 | * |
| anhtran | 0:e9fd5575b10e | 179 | * @par Description |
| anhtran | 0:e9fd5575b10e | 180 | * "IF" is as same as general "if", if "R_OSPL_ERROR_BREAK" macro was |
| anhtran | 0:e9fd5575b10e | 181 | * defined to be 0. The following descriptions are available, |
| anhtran | 0:e9fd5575b10e | 182 | * if "R_OSPL_ERROR_BREAK" macro was defined to be 1. |
| anhtran | 0:e9fd5575b10e | 183 | * |
| anhtran | 0:e9fd5575b10e | 184 | * "IF" macro supports to find the code raising an error. |
| anhtran | 0:e9fd5575b10e | 185 | * |
| anhtran | 0:e9fd5575b10e | 186 | * If the "if statement" that is frequently seen in guard condition and |
| anhtran | 0:e9fd5575b10e | 187 | * after calling functions was changed to "IF" macro, the CPU breaks |
| anhtran | 0:e9fd5575b10e | 188 | * at raising an error. Then the status (values of variables) can be |
| anhtran | 0:e9fd5575b10e | 189 | * looked immediately and the code (call stack) can be looked. Thus, |
| anhtran | 0:e9fd5575b10e | 190 | * debug work grows in efficiency. |
| anhtran | 0:e9fd5575b10e | 191 | * |
| anhtran | 0:e9fd5575b10e | 192 | * "IF" macro promotes recognizing normal code and exceptional code. |
| anhtran | 0:e9fd5575b10e | 193 | * Reading speed will grow up by skipping exceptional code. |
| anhtran | 0:e9fd5575b10e | 194 | * |
| anhtran | 0:e9fd5575b10e | 195 | * Call "R_OSPL_SET_BREAK_ERROR_ID" function, if set to break at the code |
| anhtran | 0:e9fd5575b10e | 196 | * raising an error. |
| anhtran | 0:e9fd5575b10e | 197 | * |
| anhtran | 0:e9fd5575b10e | 198 | * Whether the state was error state or the error raised count is stored |
| anhtran | 0:e9fd5575b10e | 199 | * in the thread local storage. In Release configuration, the variable |
| anhtran | 0:e9fd5575b10e | 200 | * of error state and the error raised count is deleted. Manage the error |
| anhtran | 0:e9fd5575b10e | 201 | * code using auto variable and so on at out of OSPL. |
| anhtran | 0:e9fd5575b10e | 202 | * |
| anhtran | 0:e9fd5575b10e | 203 | * The error state is resolved by calling "R_OSPL_CLEAR_ERROR" function. |
| anhtran | 0:e9fd5575b10e | 204 | * If "R_DEBUG_BREAK_IF_ERROR" macro was called with any error state, |
| anhtran | 0:e9fd5575b10e | 205 | * the process breaks at the macro. |
| anhtran | 0:e9fd5575b10e | 206 | */ |
| anhtran | 0:e9fd5575b10e | 207 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 208 | |
| anhtran | 0:e9fd5575b10e | 209 | /* ->MISRA 19.4 : Abnormal termination. Compliant with C language syntax. */ /* ->SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 210 | #define IF( Condition ) \ |
| anhtran | 0:e9fd5575b10e | 211 | if ( IS( R_OSPL_OnRaisingErrorForMISRA( \ |
| anhtran | 0:e9fd5575b10e | 212 | IS( (int_fast32_t)( Condition ) ), __FILE__, __LINE__ ) ) ) |
| anhtran | 0:e9fd5575b10e | 213 | /* (int_fast32_t) cast is for QAC warning of implicit cast unsigned to signed */ |
| anhtran | 0:e9fd5575b10e | 214 | /* != 0 is for QAC warning of MISRA 13.2 Advice */ |
| anhtran | 0:e9fd5575b10e | 215 | /* <-MISRA 19.4 */ /* <-SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 216 | |
| anhtran | 0:e9fd5575b10e | 217 | #else /* ! R_OSPL_ERROR_BREAK */ |
| anhtran | 0:e9fd5575b10e | 218 | |
| anhtran | 0:e9fd5575b10e | 219 | /* ->MISRA 19.4 : Abnormal termination. Compliant with C language syntax. */ /* ->SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 220 | #define IF if |
| anhtran | 0:e9fd5575b10e | 221 | /* <-MISRA 19.4 */ /* <-SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 222 | #endif |
| anhtran | 0:e9fd5575b10e | 223 | |
| anhtran | 0:e9fd5575b10e | 224 | |
| anhtran | 0:e9fd5575b10e | 225 | /** |
| anhtran | 0:e9fd5575b10e | 226 | * @def IF_D |
| anhtran | 0:e9fd5575b10e | 227 | * @brief It is same as "IF" (for Debug configuration only) |
| anhtran | 0:e9fd5575b10e | 228 | * @param Condition Condition expression |
| anhtran | 0:e9fd5575b10e | 229 | * @return None |
| anhtran | 0:e9fd5575b10e | 230 | * |
| anhtran | 0:e9fd5575b10e | 231 | * @par Description |
| anhtran | 0:e9fd5575b10e | 232 | * In Release configuration, the result of condition expression is always "false". |
| anhtran | 0:e9fd5575b10e | 233 | * The release configuration is the configuration defined "R_OSPL_NDEBUG". |
| anhtran | 0:e9fd5575b10e | 234 | */ |
| anhtran | 0:e9fd5575b10e | 235 | /* ->MISRA 19.4 : Compliant with C language syntax. */ /* ->SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 236 | /* ->MISRA 19.7 : Cannot function */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 237 | #ifndef R_OSPL_NDEBUG |
| anhtran | 0:e9fd5575b10e | 238 | #define IF_D( Condition ) IF ( Condition ) |
| anhtran | 0:e9fd5575b10e | 239 | #else |
| anhtran | 0:e9fd5575b10e | 240 | #define IF_D( Condition ) if ( false ) |
| anhtran | 0:e9fd5575b10e | 241 | #endif |
| anhtran | 0:e9fd5575b10e | 242 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 243 | /* <-MISRA 19.4 */ /* <-SEC M1.8.2 */ |
| anhtran | 0:e9fd5575b10e | 244 | |
| anhtran | 0:e9fd5575b10e | 245 | |
| anhtran | 0:e9fd5575b10e | 246 | /** |
| anhtran | 0:e9fd5575b10e | 247 | * @def ASSERT_R |
| anhtran | 0:e9fd5575b10e | 248 | * @brief Assertion (Programming By Contract) |
| anhtran | 0:e9fd5575b10e | 249 | * @param Condition The condition expression expected true |
| anhtran | 0:e9fd5575b10e | 250 | * @param goto_fin_Statement The operation doing at condition is false |
| anhtran | 0:e9fd5575b10e | 251 | * @return None |
| anhtran | 0:e9fd5575b10e | 252 | * |
| anhtran | 0:e9fd5575b10e | 253 | * @par Description |
| anhtran | 0:e9fd5575b10e | 254 | * It is possible to write complex sentence divided by ";" in |
| anhtran | 0:e9fd5575b10e | 255 | * "goto_fin_Statement" argument. |
| anhtran | 0:e9fd5575b10e | 256 | * |
| anhtran | 0:e9fd5575b10e | 257 | * @par - Case of defined "R_OSPL_ERROR_BREAK" to be 0 |
| anhtran | 0:e9fd5575b10e | 258 | * If the result of condition expression is 0(false), do "StatementsForError". |
| anhtran | 0:e9fd5575b10e | 259 | * If operations did nothing, write "R_NOOP()" at "StatementsForError" argument. |
| anhtran | 0:e9fd5575b10e | 260 | * |
| anhtran | 0:e9fd5575b10e | 261 | * @par - Case of defined "R_OSPL_ERROR_BREAK" to be 1 |
| anhtran | 0:e9fd5575b10e | 262 | * If the result of condition expression is 0(false), the error state |
| anhtran | 0:e9fd5575b10e | 263 | * will become active and the operation of "StatementForError" argument |
| anhtran | 0:e9fd5575b10e | 264 | * will be done. |
| anhtran | 0:e9fd5575b10e | 265 | */ |
| anhtran | 0:e9fd5575b10e | 266 | #ifndef __cplusplus |
| anhtran | 0:e9fd5575b10e | 267 | #define ASSERT_R( Condition, goto_fin_Statement ) \ |
| anhtran | 0:e9fd5575b10e | 268 | do{ IF(!(Condition)) { goto_fin_Statement; } } while(0) /* do-while is CERT standard PRE10-C */ |
| anhtran | 0:e9fd5575b10e | 269 | #else |
| anhtran | 0:e9fd5575b10e | 270 | #define ASSERT_R( Condition, goto_fin_Statement ) \ |
| anhtran | 0:e9fd5575b10e | 271 | { IF(!(Condition)) { goto_fin_Statement; } } /* no C5236(I) */ |
| anhtran | 0:e9fd5575b10e | 272 | #endif |
| anhtran | 0:e9fd5575b10e | 273 | |
| anhtran | 0:e9fd5575b10e | 274 | |
| anhtran | 0:e9fd5575b10e | 275 | /** |
| anhtran | 0:e9fd5575b10e | 276 | * @def ASSERT_D |
| anhtran | 0:e9fd5575b10e | 277 | * @brief Assertion (Programming By Contract) (for Debug configuration only) |
| anhtran | 0:e9fd5575b10e | 278 | * @param Condition The condition expression expected true |
| anhtran | 0:e9fd5575b10e | 279 | * @param goto_fin_Statement The operation doing at condition is false |
| anhtran | 0:e9fd5575b10e | 280 | * @return None |
| anhtran | 0:e9fd5575b10e | 281 | * |
| anhtran | 0:e9fd5575b10e | 282 | * @par Description |
| anhtran | 0:e9fd5575b10e | 283 | * This does nothing in Release configuration. |
| anhtran | 0:e9fd5575b10e | 284 | * Release configuration is the configuration defined "R_OSPL_NDEBUG" |
| anhtran | 0:e9fd5575b10e | 285 | * as same as standard library. |
| anhtran | 0:e9fd5575b10e | 286 | */ |
| anhtran | 0:e9fd5575b10e | 287 | #ifndef R_OSPL_NDEBUG |
| anhtran | 0:e9fd5575b10e | 288 | #define ASSERT_D ASSERT_R |
| anhtran | 0:e9fd5575b10e | 289 | #else |
| anhtran | 0:e9fd5575b10e | 290 | /* ->MISRA 19.7 : Function's argument can not get "goto_fin_Statement" */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 291 | #define ASSERT_D( Condition, goto_fin_Statement ) R_NOOP() |
| anhtran | 0:e9fd5575b10e | 292 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 293 | #endif |
| anhtran | 0:e9fd5575b10e | 294 | |
| anhtran | 0:e9fd5575b10e | 295 | |
| anhtran | 0:e9fd5575b10e | 296 | /** |
| anhtran | 0:e9fd5575b10e | 297 | * @brief Sub routine of IF macro |
| anhtran | 0:e9fd5575b10e | 298 | * |
| anhtran | 0:e9fd5575b10e | 299 | * @param Condition Condition in IF macro |
| anhtran | 0:e9fd5575b10e | 300 | * @param File File name |
| anhtran | 0:e9fd5575b10e | 301 | * @param Line Line number |
| anhtran | 0:e9fd5575b10e | 302 | * @return "Condition" argument |
| anhtran | 0:e9fd5575b10e | 303 | * |
| anhtran | 0:e9fd5575b10e | 304 | * @par Description |
| anhtran | 0:e9fd5575b10e | 305 | * - This part is for compliant to MISRA 2004 - 19.7. |
| anhtran | 0:e9fd5575b10e | 306 | */ |
| anhtran | 0:e9fd5575b10e | 307 | bool_t R_OSPL_OnRaisingErrorForMISRA( bool_t const Condition, const char_t *const File, |
| anhtran | 0:e9fd5575b10e | 308 | int_t const Line ); |
| anhtran | 0:e9fd5575b10e | 309 | |
| anhtran | 0:e9fd5575b10e | 310 | |
| anhtran | 0:e9fd5575b10e | 311 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 312 | * Class: r_ospl_thread_id_t |
| anhtran | 0:e9fd5575b10e | 313 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 314 | |
| anhtran | 0:e9fd5575b10e | 315 | /** |
| anhtran | 0:e9fd5575b10e | 316 | * @brief Get running thread ID (for OS less and OS-using environment) |
| anhtran | 0:e9fd5575b10e | 317 | * |
| anhtran | 0:e9fd5575b10e | 318 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 319 | * None |
| anhtran | 0:e9fd5575b10e | 320 | * @return The current running thread ID |
| anhtran | 0:e9fd5575b10e | 321 | * |
| anhtran | 0:e9fd5575b10e | 322 | * @par Description |
| anhtran | 0:e9fd5575b10e | 323 | * - It is possible to use this function for both OS less and OS - using environment. |
| anhtran | 0:e9fd5575b10e | 324 | * For OS less, returns thread ID passed to "R_OSPL_THREAD_SetCurrentId" function. |
| anhtran | 0:e9fd5575b10e | 325 | * "NULL" is returned, if in interrupt context. |
| anhtran | 0:e9fd5575b10e | 326 | */ |
| anhtran | 0:e9fd5575b10e | 327 | r_ospl_thread_id_t R_OSPL_THREAD_GetCurrentId(void); |
| anhtran | 0:e9fd5575b10e | 328 | |
| anhtran | 0:e9fd5575b10e | 329 | |
| anhtran | 0:e9fd5575b10e | 330 | /** |
| anhtran | 0:e9fd5575b10e | 331 | * @brief Set one or some bits to 1 |
| anhtran | 0:e9fd5575b10e | 332 | * |
| anhtran | 0:e9fd5575b10e | 333 | * @param ThreadId The thread ID attached the target event |
| anhtran | 0:e9fd5575b10e | 334 | * @param SetFlags The value of bit flags that target bit is 1 |
| anhtran | 0:e9fd5575b10e | 335 | * @return None |
| anhtran | 0:e9fd5575b10e | 336 | * |
| anhtran | 0:e9fd5575b10e | 337 | * @par Description |
| anhtran | 0:e9fd5575b10e | 338 | * For OS less, there is the area disabled all interrupts. |
| anhtran | 0:e9fd5575b10e | 339 | * |
| anhtran | 0:e9fd5575b10e | 340 | * - For OS - using environment, the thread waiting in "R_OSPL_EVENT_Wait" |
| anhtran | 0:e9fd5575b10e | 341 | * function might wake up soon. |
| anhtran | 0:e9fd5575b10e | 342 | * |
| anhtran | 0:e9fd5575b10e | 343 | * Do nothing, when "ThreadId" = "NULL" |
| anhtran | 0:e9fd5575b10e | 344 | */ |
| anhtran | 0:e9fd5575b10e | 345 | void R_OSPL_EVENT_Set( r_ospl_thread_id_t const ThreadId, bit_flags32_t const SetFlags ); |
| anhtran | 0:e9fd5575b10e | 346 | |
| anhtran | 0:e9fd5575b10e | 347 | |
| anhtran | 0:e9fd5575b10e | 348 | /** |
| anhtran | 0:e9fd5575b10e | 349 | * @brief Set one or some bits to 0 |
| anhtran | 0:e9fd5575b10e | 350 | * |
| anhtran | 0:e9fd5575b10e | 351 | * @param ThreadId The thread ID attached the target event |
| anhtran | 0:e9fd5575b10e | 352 | * @param ClearFlags1 The value of bit flags that clearing bit is 1 |
| anhtran | 0:e9fd5575b10e | 353 | * @return None |
| anhtran | 0:e9fd5575b10e | 354 | * |
| anhtran | 0:e9fd5575b10e | 355 | * @par Description |
| anhtran | 0:e9fd5575b10e | 356 | * It is not necessary to call this function after called "R_OSPL_EVENT_Wait" |
| anhtran | 0:e9fd5575b10e | 357 | * function. |
| anhtran | 0:e9fd5575b10e | 358 | * |
| anhtran | 0:e9fd5575b10e | 359 | * The way that all bit flags is cleared is setting "R_OSPL_EVENT_ALL_BITS" |
| anhtran | 0:e9fd5575b10e | 360 | * (=0x0000FFFF) at "ClearFlags1" argument. |
| anhtran | 0:e9fd5575b10e | 361 | * |
| anhtran | 0:e9fd5575b10e | 362 | * When other thread was nofied by calling "R_OSPL_EVENT_Set", "R_OSPL_EVENT_Clear" |
| anhtran | 0:e9fd5575b10e | 363 | * must not be called from caller (notifier) thread. |
| anhtran | 0:e9fd5575b10e | 364 | * |
| anhtran | 0:e9fd5575b10e | 365 | * For OS less, there is the area disabled all interrupts. |
| anhtran | 0:e9fd5575b10e | 366 | * |
| anhtran | 0:e9fd5575b10e | 367 | * Do nothing, when "ThreadId" = "NULL" |
| anhtran | 0:e9fd5575b10e | 368 | */ |
| anhtran | 0:e9fd5575b10e | 369 | void R_OSPL_EVENT_Clear( r_ospl_thread_id_t const ThreadId, bit_flags32_t const ClearFlags1 ); |
| anhtran | 0:e9fd5575b10e | 370 | |
| anhtran | 0:e9fd5575b10e | 371 | |
| anhtran | 0:e9fd5575b10e | 372 | /** |
| anhtran | 0:e9fd5575b10e | 373 | * @brief Get 16bit flags value |
| anhtran | 0:e9fd5575b10e | 374 | * |
| anhtran | 0:e9fd5575b10e | 375 | * @param ThreadId The thread ID attached the target event |
| anhtran | 0:e9fd5575b10e | 376 | * @return The value of 16bit flags |
| anhtran | 0:e9fd5575b10e | 377 | * |
| anhtran | 0:e9fd5575b10e | 378 | * @par Description |
| anhtran | 0:e9fd5575b10e | 379 | * This API cannot be used in newest specification. |
| anhtran | 0:e9fd5575b10e | 380 | * |
| anhtran | 0:e9fd5575b10e | 381 | * In receiving the event, call "R_OSPL_EVENT_Wait" function instead of |
| anhtran | 0:e9fd5575b10e | 382 | * "R_OSPL_EVENT_Get" function or call "R_OSPL_EVENT_Clear" function |
| anhtran | 0:e9fd5575b10e | 383 | * passed the NOT operated value of flags got by "R_OSPL_EVENT_Get" function. |
| anhtran | 0:e9fd5575b10e | 384 | */ |
| anhtran | 0:e9fd5575b10e | 385 | #if ( ! defined( osCMSIS ) || osCMSIS <= 0x10001 ) && R_OSPL_VERSION < 85 |
| anhtran | 0:e9fd5575b10e | 386 | bit_flags32_t R_OSPL_EVENT_Get( r_ospl_thread_id_t const ThreadId ); |
| anhtran | 0:e9fd5575b10e | 387 | #endif |
| anhtran | 0:e9fd5575b10e | 388 | |
| anhtran | 0:e9fd5575b10e | 389 | |
| anhtran | 0:e9fd5575b10e | 390 | /** |
| anhtran | 0:e9fd5575b10e | 391 | * @brief Waits for setting the flags in 16bit and clear received flags |
| anhtran | 0:e9fd5575b10e | 392 | * |
| anhtran | 0:e9fd5575b10e | 393 | * @param WaigingFlags The bit flags set to 1 waiting or "R_OSPL_ANY_FLAG" |
| anhtran | 0:e9fd5575b10e | 394 | * @param out_GotFlags NULL is permitted. Output: 16 bit flags or "R_OSPL_TIMEOUT" |
| anhtran | 0:e9fd5575b10e | 395 | * @param Timeout_msec Time out (millisecond) or "R_OSPL_INFINITE" |
| anhtran | 0:e9fd5575b10e | 396 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 397 | * |
| anhtran | 0:e9fd5575b10e | 398 | * @par Description |
| anhtran | 0:e9fd5575b10e | 399 | * Waits in this function until the flags become passed flags pattern |
| anhtran | 0:e9fd5575b10e | 400 | * by "R_OSPL_EVENT_Set" function. |
| anhtran | 0:e9fd5575b10e | 401 | * |
| anhtran | 0:e9fd5575b10e | 402 | * Check "r_ospl_async_t::ReturnValue", when the asynchronous operation |
| anhtran | 0:e9fd5575b10e | 403 | * was ended. |
| anhtran | 0:e9fd5575b10e | 404 | */ |
| anhtran | 0:e9fd5575b10e | 405 | errnum_t R_OSPL_EVENT_Wait( bit_flags32_t const WaigingFlags, bit_flags32_t *const out_GotFlags, |
| anhtran | 0:e9fd5575b10e | 406 | uint32_t const Timeout_msec ); |
| anhtran | 0:e9fd5575b10e | 407 | /* Unsigned flag (bit_flags32_t) is for QAC 4130 */ |
| anhtran | 0:e9fd5575b10e | 408 | |
| anhtran | 0:e9fd5575b10e | 409 | |
| anhtran | 0:e9fd5575b10e | 410 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 411 | * Class: r_ospl_flag32_t |
| anhtran | 0:e9fd5575b10e | 412 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 413 | |
| anhtran | 0:e9fd5575b10e | 414 | /** |
| anhtran | 0:e9fd5575b10e | 415 | * @brief Clears all flags in 32bit to 0 |
| anhtran | 0:e9fd5575b10e | 416 | * |
| anhtran | 0:e9fd5575b10e | 417 | * @param self The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 418 | * @return None |
| anhtran | 0:e9fd5575b10e | 419 | * |
| anhtran | 0:e9fd5575b10e | 420 | * @par Description |
| anhtran | 0:e9fd5575b10e | 421 | * Operates following operation. |
| anhtran | 0:e9fd5575b10e | 422 | * @code |
| anhtran | 0:e9fd5575b10e | 423 | * volatile bit_flags32_t self->flags; |
| anhtran | 0:e9fd5575b10e | 424 | * self->flags = 0; |
| anhtran | 0:e9fd5575b10e | 425 | * @endcode |
| anhtran | 0:e9fd5575b10e | 426 | */ |
| anhtran | 0:e9fd5575b10e | 427 | void R_OSPL_FLAG32_InitConst( volatile r_ospl_flag32_t *const self ); |
| anhtran | 0:e9fd5575b10e | 428 | |
| anhtran | 0:e9fd5575b10e | 429 | |
| anhtran | 0:e9fd5575b10e | 430 | /** |
| anhtran | 0:e9fd5575b10e | 431 | * @brief Set one or some bits to 1 |
| anhtran | 0:e9fd5575b10e | 432 | * |
| anhtran | 0:e9fd5575b10e | 433 | * @param self The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 434 | * @param SetFlags The value of bit flags that target bit is 1 |
| anhtran | 0:e9fd5575b10e | 435 | * @return None |
| anhtran | 0:e9fd5575b10e | 436 | * |
| anhtran | 0:e9fd5575b10e | 437 | * @par Description |
| anhtran | 0:e9fd5575b10e | 438 | * Operates following operation. |
| anhtran | 0:e9fd5575b10e | 439 | * @code |
| anhtran | 0:e9fd5575b10e | 440 | * volatile bit_flags32_t self->Flags; |
| anhtran | 0:e9fd5575b10e | 441 | * bit_flags32_t SetFlags; |
| anhtran | 0:e9fd5575b10e | 442 | * self->Flags |= SetFlags; |
| anhtran | 0:e9fd5575b10e | 443 | * @endcode |
| anhtran | 0:e9fd5575b10e | 444 | * This function is not atomic because "|=" operator is "Read Modify Write" operation. |
| anhtran | 0:e9fd5575b10e | 445 | */ |
| anhtran | 0:e9fd5575b10e | 446 | void R_OSPL_FLAG32_Set( volatile r_ospl_flag32_t *const self, bit_flags32_t const SetFlags ); |
| anhtran | 0:e9fd5575b10e | 447 | |
| anhtran | 0:e9fd5575b10e | 448 | |
| anhtran | 0:e9fd5575b10e | 449 | /** |
| anhtran | 0:e9fd5575b10e | 450 | * @brief Set one or some bits to 0 |
| anhtran | 0:e9fd5575b10e | 451 | * |
| anhtran | 0:e9fd5575b10e | 452 | * @param self The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 453 | * @param ClearFlags1 The value of bit flags that clearing bit is 1 |
| anhtran | 0:e9fd5575b10e | 454 | * @return None |
| anhtran | 0:e9fd5575b10e | 455 | * |
| anhtran | 0:e9fd5575b10e | 456 | * @par Description |
| anhtran | 0:e9fd5575b10e | 457 | * Operates following operation. |
| anhtran | 0:e9fd5575b10e | 458 | * @code |
| anhtran | 0:e9fd5575b10e | 459 | * volatile bit_flags32_t self->Flags; |
| anhtran | 0:e9fd5575b10e | 460 | * bit_flags32_t ClearFlags1; |
| anhtran | 0:e9fd5575b10e | 461 | * |
| anhtran | 0:e9fd5575b10e | 462 | * self->Flags &= ~ClearFlags1; |
| anhtran | 0:e9fd5575b10e | 463 | * @endcode |
| anhtran | 0:e9fd5575b10e | 464 | * |
| anhtran | 0:e9fd5575b10e | 465 | * Set "R_OSPL_FLAG32_ALL_BITS", if you wanted to clear all bits. |
| anhtran | 0:e9fd5575b10e | 466 | * |
| anhtran | 0:e9fd5575b10e | 467 | * This function is not atomic because "&=" operator is "Read Modify Write" operation. |
| anhtran | 0:e9fd5575b10e | 468 | */ |
| anhtran | 0:e9fd5575b10e | 469 | void R_OSPL_FLAG32_Clear( volatile r_ospl_flag32_t *const self, bit_flags32_t const ClearFlags1 ); |
| anhtran | 0:e9fd5575b10e | 470 | |
| anhtran | 0:e9fd5575b10e | 471 | |
| anhtran | 0:e9fd5575b10e | 472 | /** |
| anhtran | 0:e9fd5575b10e | 473 | * @brief Get 32bit flags value |
| anhtran | 0:e9fd5575b10e | 474 | * |
| anhtran | 0:e9fd5575b10e | 475 | * @param self The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 476 | * @return The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 477 | * |
| anhtran | 0:e9fd5575b10e | 478 | * @par Description |
| anhtran | 0:e9fd5575b10e | 479 | * In receiving the event, call "R_OSPL_FLAG32_GetAndClear" function |
| anhtran | 0:e9fd5575b10e | 480 | * instead of "R_OSPL_FLAG32_Get" function or call "R_OSPL_FLAG32_Clear" |
| anhtran | 0:e9fd5575b10e | 481 | * function passed the NOT operated value of flags got by "R_OSPL_FLAG32_Get" |
| anhtran | 0:e9fd5575b10e | 482 | * function. |
| anhtran | 0:e9fd5575b10e | 483 | * |
| anhtran | 0:e9fd5575b10e | 484 | * @code |
| anhtran | 0:e9fd5575b10e | 485 | * Operates following operation. |
| anhtran | 0:e9fd5575b10e | 486 | * volatile bit_flags32_t self->Flags; |
| anhtran | 0:e9fd5575b10e | 487 | * bit_flags32_t return_flags; |
| anhtran | 0:e9fd5575b10e | 488 | * |
| anhtran | 0:e9fd5575b10e | 489 | * return_flags = self->Flags; |
| anhtran | 0:e9fd5575b10e | 490 | * |
| anhtran | 0:e9fd5575b10e | 491 | * return return_flags; |
| anhtran | 0:e9fd5575b10e | 492 | * @endcode |
| anhtran | 0:e9fd5575b10e | 493 | */ |
| anhtran | 0:e9fd5575b10e | 494 | bit_flags32_t R_OSPL_FLAG32_Get( volatile const r_ospl_flag32_t *const self ); |
| anhtran | 0:e9fd5575b10e | 495 | |
| anhtran | 0:e9fd5575b10e | 496 | |
| anhtran | 0:e9fd5575b10e | 497 | /** |
| anhtran | 0:e9fd5575b10e | 498 | * @brief Get 32bit flags value |
| anhtran | 0:e9fd5575b10e | 499 | * |
| anhtran | 0:e9fd5575b10e | 500 | * @param self The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 501 | * @return The value of 32bit flags |
| anhtran | 0:e9fd5575b10e | 502 | * |
| anhtran | 0:e9fd5575b10e | 503 | * @par Description |
| anhtran | 0:e9fd5575b10e | 504 | * Operates following operation. |
| anhtran | 0:e9fd5575b10e | 505 | * @code |
| anhtran | 0:e9fd5575b10e | 506 | * volatile bit_flags32_t self->Flags; |
| anhtran | 0:e9fd5575b10e | 507 | * bit_flags32_t return_flags; |
| anhtran | 0:e9fd5575b10e | 508 | * |
| anhtran | 0:e9fd5575b10e | 509 | * return_flags = self->Flags; |
| anhtran | 0:e9fd5575b10e | 510 | * self->Flags = 0; |
| anhtran | 0:e9fd5575b10e | 511 | * |
| anhtran | 0:e9fd5575b10e | 512 | * return return_flags; |
| anhtran | 0:e9fd5575b10e | 513 | * @endcode |
| anhtran | 0:e9fd5575b10e | 514 | * |
| anhtran | 0:e9fd5575b10e | 515 | * This function is not atomic because the value might be set before clearing to 0. |
| anhtran | 0:e9fd5575b10e | 516 | */ |
| anhtran | 0:e9fd5575b10e | 517 | bit_flags32_t R_OSPL_FLAG32_GetAndClear( volatile r_ospl_flag32_t *const self ); |
| anhtran | 0:e9fd5575b10e | 518 | |
| anhtran | 0:e9fd5575b10e | 519 | |
| anhtran | 0:e9fd5575b10e | 520 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 521 | * Class: r_ospl_queue_t |
| anhtran | 0:e9fd5575b10e | 522 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 523 | |
| anhtran | 0:e9fd5575b10e | 524 | /** |
| anhtran | 0:e9fd5575b10e | 525 | * @brief Initializes a queue |
| anhtran | 0:e9fd5575b10e | 526 | * |
| anhtran | 0:e9fd5575b10e | 527 | * @param out_self Output: Address of initialized queue object |
| anhtran | 0:e9fd5575b10e | 528 | * @param QueueDefine Initial attributes of queue and work area |
| anhtran | 0:e9fd5575b10e | 529 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 530 | * |
| anhtran | 0:e9fd5575b10e | 531 | * @par Description |
| anhtran | 0:e9fd5575b10e | 532 | * It is not possible to call this function from the library. |
| anhtran | 0:e9fd5575b10e | 533 | * This function is called from porting layer of the driver and send |
| anhtran | 0:e9fd5575b10e | 534 | * created queue to the driver. |
| anhtran | 0:e9fd5575b10e | 535 | * |
| anhtran | 0:e9fd5575b10e | 536 | * OSPL does not have finalizing function (portabled with CMSIS). |
| anhtran | 0:e9fd5575b10e | 537 | * An object specified "QueueDefine" argument can be specified to the |
| anhtran | 0:e9fd5575b10e | 538 | * create function 1 times only. Some OS does not have this limitation. |
| anhtran | 0:e9fd5575b10e | 539 | * |
| anhtran | 0:e9fd5575b10e | 540 | * The address of a variable as "r_ospl_queue_t*" type is set at |
| anhtran | 0:e9fd5575b10e | 541 | * "out_self" argument. |
| anhtran | 0:e9fd5575b10e | 542 | * Internal variables of the queue are stored in the variable specified |
| anhtran | 0:e9fd5575b10e | 543 | * with "QueueDefine" argument. |
| anhtran | 0:e9fd5575b10e | 544 | */ |
| anhtran | 0:e9fd5575b10e | 545 | errnum_t R_OSPL_QUEUE_Create( r_ospl_queue_t **out_self, r_ospl_queue_def_t *QueueDefine ); |
| anhtran | 0:e9fd5575b10e | 546 | |
| anhtran | 0:e9fd5575b10e | 547 | |
| anhtran | 0:e9fd5575b10e | 548 | /** |
| anhtran | 0:e9fd5575b10e | 549 | * @brief Gets status of the queue |
| anhtran | 0:e9fd5575b10e | 550 | * |
| anhtran | 0:e9fd5575b10e | 551 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 552 | * @param out_Status Output: Pointer to the status structure |
| anhtran | 0:e9fd5575b10e | 553 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 554 | * |
| anhtran | 0:e9fd5575b10e | 555 | * @par Description |
| anhtran | 0:e9fd5575b10e | 556 | * Got status are the information at calling moment. |
| anhtran | 0:e9fd5575b10e | 557 | * If ohter threads were run, the status will be changed. |
| anhtran | 0:e9fd5575b10e | 558 | * See "R_DRIVER_GetAsyncStatus" function about pointer type of |
| anhtran | 0:e9fd5575b10e | 559 | * "out_Status" argument |
| anhtran | 0:e9fd5575b10e | 560 | */ |
| anhtran | 0:e9fd5575b10e | 561 | errnum_t R_OSPL_QUEUE_GetStatus( r_ospl_queue_t *self, const r_ospl_queue_status_t **out_Status ); |
| anhtran | 0:e9fd5575b10e | 562 | |
| anhtran | 0:e9fd5575b10e | 563 | |
| anhtran | 0:e9fd5575b10e | 564 | /** |
| anhtran | 0:e9fd5575b10e | 565 | * @brief Allocates an element from the queue object |
| anhtran | 0:e9fd5575b10e | 566 | * |
| anhtran | 0:e9fd5575b10e | 567 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 568 | * @param out_Address Output: Address of allocated element |
| anhtran | 0:e9fd5575b10e | 569 | * @param Timeout_msec Timeout (msec) or R_OSPL_INFINITE |
| anhtran | 0:e9fd5575b10e | 570 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 571 | * |
| anhtran | 0:e9fd5575b10e | 572 | * @par Description |
| anhtran | 0:e9fd5575b10e | 573 | * An error will be raised, if "Timeout_msec != 0" in interrupt context. |
| anhtran | 0:e9fd5575b10e | 574 | * It becomes "*out_Address = NULL", when it was timeout and |
| anhtran | 0:e9fd5575b10e | 575 | * "Timeout_msec = 0". |
| anhtran | 0:e9fd5575b10e | 576 | * E_TIME_OUT error is raised, when it was timeout and "Timeout_msec != 0". |
| anhtran | 0:e9fd5575b10e | 577 | */ |
| anhtran | 0:e9fd5575b10e | 578 | errnum_t R_OSPL_QUEUE_Allocate( r_ospl_queue_t *self, void *out_Address, uint32_t Timeout_msec ); |
| anhtran | 0:e9fd5575b10e | 579 | |
| anhtran | 0:e9fd5575b10e | 580 | |
| anhtran | 0:e9fd5575b10e | 581 | /** |
| anhtran | 0:e9fd5575b10e | 582 | * @brief Sends the element to the queue |
| anhtran | 0:e9fd5575b10e | 583 | * |
| anhtran | 0:e9fd5575b10e | 584 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 585 | * @param Address Address of element to put |
| anhtran | 0:e9fd5575b10e | 586 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 587 | * |
| anhtran | 0:e9fd5575b10e | 588 | * @par Description |
| anhtran | 0:e9fd5575b10e | 589 | * It is correct, even if other thread put to the queue or get from |
| anhtran | 0:e9fd5575b10e | 590 | * the queue from calling "R_OSPL_QUEUE_Allocate" to calling |
| anhtran | 0:e9fd5575b10e | 591 | * "R_OSPL_QUEUE_Put". |
| anhtran | 0:e9fd5575b10e | 592 | * |
| anhtran | 0:e9fd5575b10e | 593 | * The message put to the queue by this function receives the thread |
| anhtran | 0:e9fd5575b10e | 594 | * calling "R_OSPL_QUEUE_Get" function. |
| anhtran | 0:e9fd5575b10e | 595 | */ |
| anhtran | 0:e9fd5575b10e | 596 | errnum_t R_OSPL_QUEUE_Put( r_ospl_queue_t *self, void *Address ); |
| anhtran | 0:e9fd5575b10e | 597 | |
| anhtran | 0:e9fd5575b10e | 598 | |
| anhtran | 0:e9fd5575b10e | 599 | /** |
| anhtran | 0:e9fd5575b10e | 600 | * @brief Receives the element from the queue |
| anhtran | 0:e9fd5575b10e | 601 | * |
| anhtran | 0:e9fd5575b10e | 602 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 603 | * @param out_Address Output: Address of received element |
| anhtran | 0:e9fd5575b10e | 604 | * @param Timeout_msec Timeout (msec) or R_OSPL_INFINITE |
| anhtran | 0:e9fd5575b10e | 605 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 606 | * |
| anhtran | 0:e9fd5575b10e | 607 | * @par Description |
| anhtran | 0:e9fd5575b10e | 608 | * Call "R_OSPL_QUEUE_Free" function after finishing to access to |
| anhtran | 0:e9fd5575b10e | 609 | * the element. Don't access the memory area of the element after |
| anhtran | 0:e9fd5575b10e | 610 | * calling "R_OSPL_QUEUE_Free". |
| anhtran | 0:e9fd5575b10e | 611 | * |
| anhtran | 0:e9fd5575b10e | 612 | * "E_NOT_THREAD" error is raised, if "Timeout_msec = 0" was specified |
| anhtran | 0:e9fd5575b10e | 613 | * from interrupt context. It is not possible to wait for put data to |
| anhtran | 0:e9fd5575b10e | 614 | * the queue in interrupt context. |
| anhtran | 0:e9fd5575b10e | 615 | * |
| anhtran | 0:e9fd5575b10e | 616 | * "*out_Address" is NULL and any errors are not raised, if it becomed |
| anhtran | 0:e9fd5575b10e | 617 | * to timeout and "Timeout_msec = 0". "E_TIME_OUT" is raised, |
| anhtran | 0:e9fd5575b10e | 618 | * if "Timeout_msec != 0". |
| anhtran | 0:e9fd5575b10e | 619 | * |
| anhtran | 0:e9fd5575b10e | 620 | * Specify "Timeout_msec = 0", call the following functions by the following |
| anhtran | 0:e9fd5575b10e | 621 | * order and use an event for preventing to block to receive other events |
| anhtran | 0:e9fd5575b10e | 622 | * by the thread having waited for the queue. |
| anhtran | 0:e9fd5575b10e | 623 | * |
| anhtran | 0:e9fd5575b10e | 624 | * Sending Side |
| anhtran | 0:e9fd5575b10e | 625 | * - R_OSPL_QUEUE_Allocate |
| anhtran | 0:e9fd5575b10e | 626 | * - R_OSPL_QUEUE_Put |
| anhtran | 0:e9fd5575b10e | 627 | * - R_OSPL_EVENT_Set |
| anhtran | 0:e9fd5575b10e | 628 | * |
| anhtran | 0:e9fd5575b10e | 629 | * Receiving Side |
| anhtran | 0:e9fd5575b10e | 630 | * - R_OSPL_EVENT_Wait |
| anhtran | 0:e9fd5575b10e | 631 | * - R_OSPL_QUEUE_Get |
| anhtran | 0:e9fd5575b10e | 632 | * - R_OSPL_QUEUE_Free |
| anhtran | 0:e9fd5575b10e | 633 | * |
| anhtran | 0:e9fd5575b10e | 634 | * In OS less environment, "R_OSPL_QUEUE_Get" supports pseudo multi |
| anhtran | 0:e9fd5575b10e | 635 | * threading. See "R_OSPL_THREAD_GetIsWaiting" function. |
| anhtran | 0:e9fd5575b10e | 636 | */ |
| anhtran | 0:e9fd5575b10e | 637 | errnum_t R_OSPL_QUEUE_Get( r_ospl_queue_t *self, void *out_Address, uint32_t Timeout_msec ); |
| anhtran | 0:e9fd5575b10e | 638 | |
| anhtran | 0:e9fd5575b10e | 639 | |
| anhtran | 0:e9fd5575b10e | 640 | /** |
| anhtran | 0:e9fd5575b10e | 641 | * @brief Releases the element to the queue object |
| anhtran | 0:e9fd5575b10e | 642 | * |
| anhtran | 0:e9fd5575b10e | 643 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 644 | * @param Address Address of received element |
| anhtran | 0:e9fd5575b10e | 645 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 646 | * |
| anhtran | 0:e9fd5575b10e | 647 | * @par Description |
| anhtran | 0:e9fd5575b10e | 648 | * It is correct, even if other thread put to the queue or get from |
| anhtran | 0:e9fd5575b10e | 649 | * the queue from calling "R_OSPL_QUEUE_Get" to calling "R_OSPL_QUEUE_Free". |
| anhtran | 0:e9fd5575b10e | 650 | */ |
| anhtran | 0:e9fd5575b10e | 651 | errnum_t R_OSPL_QUEUE_Free( r_ospl_queue_t *self, void *Address ); |
| anhtran | 0:e9fd5575b10e | 652 | |
| anhtran | 0:e9fd5575b10e | 653 | |
| anhtran | 0:e9fd5575b10e | 654 | /** |
| anhtran | 0:e9fd5575b10e | 655 | * @brief Print status of the queue object |
| anhtran | 0:e9fd5575b10e | 656 | * |
| anhtran | 0:e9fd5575b10e | 657 | * @param self A queue object |
| anhtran | 0:e9fd5575b10e | 658 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 659 | */ |
| anhtran | 0:e9fd5575b10e | 660 | #ifndef R_OSPL_NDEBUG |
| anhtran | 0:e9fd5575b10e | 661 | errnum_t R_OSPL_QUEUE_Print( r_ospl_queue_t *self ); |
| anhtran | 0:e9fd5575b10e | 662 | #endif |
| anhtran | 0:e9fd5575b10e | 663 | |
| anhtran | 0:e9fd5575b10e | 664 | |
| anhtran | 0:e9fd5575b10e | 665 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 666 | * Class: r_ospl_async_t |
| anhtran | 0:e9fd5575b10e | 667 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 668 | |
| anhtran | 0:e9fd5575b10e | 669 | /** |
| anhtran | 0:e9fd5575b10e | 670 | * @brief CopyExceptAThread |
| anhtran | 0:e9fd5575b10e | 671 | * |
| anhtran | 0:e9fd5575b10e | 672 | * @param Source Source |
| anhtran | 0:e9fd5575b10e | 673 | * @param Destination Destination |
| anhtran | 0:e9fd5575b10e | 674 | * @return None |
| anhtran | 0:e9fd5575b10e | 675 | */ |
| anhtran | 0:e9fd5575b10e | 676 | void R_OSPL_ASYNC_CopyExceptAThread( const r_ospl_async_t *const Source, |
| anhtran | 0:e9fd5575b10e | 677 | r_ospl_async_t *const Destination ); |
| anhtran | 0:e9fd5575b10e | 678 | |
| anhtran | 0:e9fd5575b10e | 679 | |
| anhtran | 0:e9fd5575b10e | 680 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 681 | * Class: r_ospl_caller_t |
| anhtran | 0:e9fd5575b10e | 682 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 683 | |
| anhtran | 0:e9fd5575b10e | 684 | /** |
| anhtran | 0:e9fd5575b10e | 685 | * @brief Calls the interrupt callback function. It is called from OS porting layer in the driver |
| anhtran | 0:e9fd5575b10e | 686 | * |
| anhtran | 0:e9fd5575b10e | 687 | * @param self The internal parameters about interrupt operations |
| anhtran | 0:e9fd5575b10e | 688 | * @param InterruptSource The source of the interrupt |
| anhtran | 0:e9fd5575b10e | 689 | * @return None |
| anhtran | 0:e9fd5575b10e | 690 | */ |
| anhtran | 0:e9fd5575b10e | 691 | void R_OSPL_CallInterruptCallback( const r_ospl_caller_t *const self, |
| anhtran | 0:e9fd5575b10e | 692 | const r_ospl_interrupt_t *const InterruptSource ); |
| anhtran | 0:e9fd5575b10e | 693 | |
| anhtran | 0:e9fd5575b10e | 694 | |
| anhtran | 0:e9fd5575b10e | 695 | /** |
| anhtran | 0:e9fd5575b10e | 696 | * @brief Initialize <r_ospl_caller_t>. |
| anhtran | 0:e9fd5575b10e | 697 | * |
| anhtran | 0:e9fd5575b10e | 698 | * @param self The internal parameters about interrupt operations |
| anhtran | 0:e9fd5575b10e | 699 | * @param Async <r_ospl_async_t> |
| anhtran | 0:e9fd5575b10e | 700 | * @return None |
| anhtran | 0:e9fd5575b10e | 701 | */ |
| anhtran | 0:e9fd5575b10e | 702 | void R_OSPL_CALLER_Initialize( r_ospl_caller_t *const self, r_ospl_async_t *const Async, |
| anhtran | 0:e9fd5575b10e | 703 | volatile void *const PointerToState, int_t const StateValueOfOnInterrupting, |
| anhtran | 0:e9fd5575b10e | 704 | void *const I_Lock, const r_ospl_i_lock_vtable_t *const I_LockVTable ); |
| anhtran | 0:e9fd5575b10e | 705 | |
| anhtran | 0:e9fd5575b10e | 706 | |
| anhtran | 0:e9fd5575b10e | 707 | /** |
| anhtran | 0:e9fd5575b10e | 708 | * @brief GetRootChannelNum. |
| anhtran | 0:e9fd5575b10e | 709 | * |
| anhtran | 0:e9fd5575b10e | 710 | * @param self The internal parameters about interrupt operations |
| anhtran | 0:e9fd5575b10e | 711 | * @return RootChannelNum |
| anhtran | 0:e9fd5575b10e | 712 | */ |
| anhtran | 0:e9fd5575b10e | 713 | INLINE int_fast32_t R_OSPL_CALLER_GetRootChannelNum( const r_ospl_caller_t *const self ); |
| anhtran | 0:e9fd5575b10e | 714 | |
| anhtran | 0:e9fd5575b10e | 715 | |
| anhtran | 0:e9fd5575b10e | 716 | /* Section: Interrupt */ |
| anhtran | 0:e9fd5575b10e | 717 | /** |
| anhtran | 0:e9fd5575b10e | 718 | * @brief Interrupt callback function for unregisterd interrupt. |
| anhtran | 0:e9fd5575b10e | 719 | * |
| anhtran | 0:e9fd5575b10e | 720 | * @param int_sense (See INTC driver) |
| anhtran | 0:e9fd5575b10e | 721 | * @return None |
| anhtran | 0:e9fd5575b10e | 722 | */ |
| anhtran | 0:e9fd5575b10e | 723 | void R_OSPL_OnInterruptForUnregistered( uint32_t const int_sense ); |
| anhtran | 0:e9fd5575b10e | 724 | |
| anhtran | 0:e9fd5575b10e | 725 | |
| anhtran | 0:e9fd5575b10e | 726 | /** |
| anhtran | 0:e9fd5575b10e | 727 | * @brief Releases all disabled interrupts |
| anhtran | 0:e9fd5575b10e | 728 | * |
| anhtran | 0:e9fd5575b10e | 729 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 730 | * None |
| anhtran | 0:e9fd5575b10e | 731 | * @return None |
| anhtran | 0:e9fd5575b10e | 732 | * |
| anhtran | 0:e9fd5575b10e | 733 | * @par Description |
| anhtran | 0:e9fd5575b10e | 734 | * Driver user should not call this function. |
| anhtran | 0:e9fd5575b10e | 735 | * Call this function at the end of area of all interrupts disabled. |
| anhtran | 0:e9fd5575b10e | 736 | * Do not release, if all interrupts was already disabled by caller function. |
| anhtran | 0:e9fd5575b10e | 737 | * This function does not release disabled NMI. |
| anhtran | 0:e9fd5575b10e | 738 | */ |
| anhtran | 0:e9fd5575b10e | 739 | void R_OSPL_EnableAllInterrupt(void); |
| anhtran | 0:e9fd5575b10e | 740 | |
| anhtran | 0:e9fd5575b10e | 741 | |
| anhtran | 0:e9fd5575b10e | 742 | /** |
| anhtran | 0:e9fd5575b10e | 743 | * @brief Disables all interrupts |
| anhtran | 0:e9fd5575b10e | 744 | * |
| anhtran | 0:e9fd5575b10e | 745 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 746 | * None |
| anhtran | 0:e9fd5575b10e | 747 | * @return None |
| anhtran | 0:e9fd5575b10e | 748 | * |
| anhtran | 0:e9fd5575b10e | 749 | * @par Description |
| anhtran | 0:e9fd5575b10e | 750 | * Driver user should not call this function. |
| anhtran | 0:e9fd5575b10e | 751 | * Call this function at begin of area of all interrupts disabled. |
| anhtran | 0:e9fd5575b10e | 752 | * This function does not disable NMI. |
| anhtran | 0:e9fd5575b10e | 753 | * |
| anhtran | 0:e9fd5575b10e | 754 | * @par Example |
| anhtran | 0:e9fd5575b10e | 755 | * @code |
| anhtran | 0:e9fd5575b10e | 756 | * void Func() |
| anhtran | 0:e9fd5575b10e | 757 | * { |
| anhtran | 0:e9fd5575b10e | 758 | * R_OSPL_DisableAllInterrupt(); |
| anhtran | 0:e9fd5575b10e | 759 | * |
| anhtran | 0:e9fd5575b10e | 760 | * // All interrupt disabled |
| anhtran | 0:e9fd5575b10e | 761 | * |
| anhtran | 0:e9fd5575b10e | 762 | * R_OSPL_EnableAllInterrupt(); |
| anhtran | 0:e9fd5575b10e | 763 | * } |
| anhtran | 0:e9fd5575b10e | 764 | * @endcode |
| anhtran | 0:e9fd5575b10e | 765 | */ |
| anhtran | 0:e9fd5575b10e | 766 | void R_OSPL_DisableAllInterrupt(void); |
| anhtran | 0:e9fd5575b10e | 767 | |
| anhtran | 0:e9fd5575b10e | 768 | |
| anhtran | 0:e9fd5575b10e | 769 | /** |
| anhtran | 0:e9fd5575b10e | 770 | * @brief Sets the priority of the interrupt line. |
| anhtran | 0:e9fd5575b10e | 771 | * |
| anhtran | 0:e9fd5575b10e | 772 | * @param IRQ_Num Interrupt request number |
| anhtran | 0:e9fd5575b10e | 773 | * @param Priority Priority. The less the prior. |
| anhtran | 0:e9fd5575b10e | 774 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 775 | */ |
| anhtran | 0:e9fd5575b10e | 776 | errnum_t R_OSPL_SetInterruptPriority( bsp_int_src_t const IRQ_Num, int_fast32_t const Priority ); |
| anhtran | 0:e9fd5575b10e | 777 | |
| anhtran | 0:e9fd5575b10e | 778 | |
| anhtran | 0:e9fd5575b10e | 779 | /* Section: Locking channel */ |
| anhtran | 0:e9fd5575b10e | 780 | /** |
| anhtran | 0:e9fd5575b10e | 781 | * @brief Locks by channel number. |
| anhtran | 0:e9fd5575b10e | 782 | * |
| anhtran | 0:e9fd5575b10e | 783 | * @param ChannelNum Locking channel number or "R_OSPL_UNLOCKED_CHANNEL" |
| anhtran | 0:e9fd5575b10e | 784 | * @param out_ChannelNum Output: Locked channel number, (in) NULL is permitted |
| anhtran | 0:e9fd5575b10e | 785 | * @param HardwareIndexMin Hardware index of channel number = 0 |
| anhtran | 0:e9fd5575b10e | 786 | * @param HardwareIndexMax Hardware index of max channel number |
| anhtran | 0:e9fd5575b10e | 787 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 788 | * |
| anhtran | 0:e9fd5575b10e | 789 | * @par Description |
| anhtran | 0:e9fd5575b10e | 790 | * This function is called from the internal of "R_DRIVER_Initialize" |
| anhtran | 0:e9fd5575b10e | 791 | * function or "R_DRIVER_LockChannel" function. |
| anhtran | 0:e9fd5575b10e | 792 | * This function calls "R_BSP_HardwareLock". |
| anhtran | 0:e9fd5575b10e | 793 | */ |
| anhtran | 0:e9fd5575b10e | 794 | errnum_t R_OSPL_LockChannel( int_fast32_t ChannelNum, int_fast32_t *out_ChannelNum, |
| anhtran | 0:e9fd5575b10e | 795 | mcu_lock_t HardwareIndexMin, mcu_lock_t HardwareIndexMax ); |
| anhtran | 0:e9fd5575b10e | 796 | |
| anhtran | 0:e9fd5575b10e | 797 | |
| anhtran | 0:e9fd5575b10e | 798 | /** |
| anhtran | 0:e9fd5575b10e | 799 | * @brief Unlocks by channel number. |
| anhtran | 0:e9fd5575b10e | 800 | * |
| anhtran | 0:e9fd5575b10e | 801 | * @param ChannelNum Channel number |
| anhtran | 0:e9fd5575b10e | 802 | * @param e Raising error code, If there is no error, 0 |
| anhtran | 0:e9fd5575b10e | 803 | * @param HardwareIndexMin Hardware index of channel number = 0 |
| anhtran | 0:e9fd5575b10e | 804 | * @param HardwareIndexMax Hardware index of max channel number |
| anhtran | 0:e9fd5575b10e | 805 | * @return Error code. If there is no error, the return value is 0 |
| anhtran | 0:e9fd5575b10e | 806 | * |
| anhtran | 0:e9fd5575b10e | 807 | * @par Description |
| anhtran | 0:e9fd5575b10e | 808 | * This function is called from the internal of "R_DRIVER_Finalize" |
| anhtran | 0:e9fd5575b10e | 809 | * function or "R_DRIVER_UnlockChannel" function. |
| anhtran | 0:e9fd5575b10e | 810 | * This function calls "R_BSP_HardwareUnlock". |
| anhtran | 0:e9fd5575b10e | 811 | */ |
| anhtran | 0:e9fd5575b10e | 812 | errnum_t R_OSPL_UnlockChannel( int_fast32_t ChannelNum, errnum_t e, |
| anhtran | 0:e9fd5575b10e | 813 | mcu_lock_t HardwareIndexMin, mcu_lock_t HardwareIndexMax ); |
| anhtran | 0:e9fd5575b10e | 814 | |
| anhtran | 0:e9fd5575b10e | 815 | |
| anhtran | 0:e9fd5575b10e | 816 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 817 | * Class: r_ospl_c_lock_t |
| anhtran | 0:e9fd5575b10e | 818 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 819 | |
| anhtran | 0:e9fd5575b10e | 820 | /** |
| anhtran | 0:e9fd5575b10e | 821 | * @brief Initializes the C-lock object |
| anhtran | 0:e9fd5575b10e | 822 | * |
| anhtran | 0:e9fd5575b10e | 823 | * @param self C-lock object |
| anhtran | 0:e9fd5575b10e | 824 | * @return None |
| anhtran | 0:e9fd5575b10e | 825 | * |
| anhtran | 0:e9fd5575b10e | 826 | * @par Description |
| anhtran | 0:e9fd5575b10e | 827 | * If *self is global variable or static variable initialized 0, |
| anhtran | 0:e9fd5575b10e | 828 | * this function does not have to be called. |
| anhtran | 0:e9fd5575b10e | 829 | */ |
| anhtran | 0:e9fd5575b10e | 830 | void R_OSPL_C_LOCK_InitConst( r_ospl_c_lock_t *const self ); |
| anhtran | 0:e9fd5575b10e | 831 | |
| anhtran | 0:e9fd5575b10e | 832 | |
| anhtran | 0:e9fd5575b10e | 833 | /** |
| anhtran | 0:e9fd5575b10e | 834 | * @brief Locks the target, if lockable state. |
| anhtran | 0:e9fd5575b10e | 835 | * |
| anhtran | 0:e9fd5575b10e | 836 | * @param self C-lock object |
| anhtran | 0:e9fd5575b10e | 837 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 838 | * |
| anhtran | 0:e9fd5575b10e | 839 | * @par Description |
| anhtran | 0:e9fd5575b10e | 840 | * Even if lock owner called this function, if lock object was already |
| anhtran | 0:e9fd5575b10e | 841 | * locked, E_ACCESS_DENIED error is raised. |
| anhtran | 0:e9fd5575b10e | 842 | * |
| anhtran | 0:e9fd5575b10e | 843 | * "R_OSPL_C_LOCK_Lock" does not do exclusive control. |
| anhtran | 0:e9fd5575b10e | 844 | */ |
| anhtran | 0:e9fd5575b10e | 845 | errnum_t R_OSPL_C_LOCK_Lock( r_ospl_c_lock_t *const self ); |
| anhtran | 0:e9fd5575b10e | 846 | |
| anhtran | 0:e9fd5575b10e | 847 | |
| anhtran | 0:e9fd5575b10e | 848 | /** |
| anhtran | 0:e9fd5575b10e | 849 | * @brief Unlocks the target. |
| anhtran | 0:e9fd5575b10e | 850 | * |
| anhtran | 0:e9fd5575b10e | 851 | * @param self C-lock object |
| anhtran | 0:e9fd5575b10e | 852 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 853 | * |
| anhtran | 0:e9fd5575b10e | 854 | * @par Description |
| anhtran | 0:e9fd5575b10e | 855 | * If this function was called with unlocked object, this function |
| anhtran | 0:e9fd5575b10e | 856 | * does nothing and raises "E_ACCESS_DENIED" error. |
| anhtran | 0:e9fd5575b10e | 857 | * |
| anhtran | 0:e9fd5575b10e | 858 | * If self == NULL, this function does nothing and raises no error. |
| anhtran | 0:e9fd5575b10e | 859 | * E_NOT_THREAD error is raised, if this function was called from the |
| anhtran | 0:e9fd5575b10e | 860 | * interrupt context. |
| anhtran | 0:e9fd5575b10e | 861 | * |
| anhtran | 0:e9fd5575b10e | 862 | * - I - lock does not do in this function. |
| anhtran | 0:e9fd5575b10e | 863 | * |
| anhtran | 0:e9fd5575b10e | 864 | * "R_OSPL_C_LOCK_Unlock" does not do exclusive control. |
| anhtran | 0:e9fd5575b10e | 865 | */ |
| anhtran | 0:e9fd5575b10e | 866 | errnum_t R_OSPL_C_LOCK_Unlock( r_ospl_c_lock_t *const self ); |
| anhtran | 0:e9fd5575b10e | 867 | |
| anhtran | 0:e9fd5575b10e | 868 | |
| anhtran | 0:e9fd5575b10e | 869 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 870 | * Class: r_ospl_i_lock_vtable_t |
| anhtran | 0:e9fd5575b10e | 871 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 872 | |
| anhtran | 0:e9fd5575b10e | 873 | /** |
| anhtran | 0:e9fd5575b10e | 874 | * @brief Do nothing. This is registered to r_ospl_i_lock_vtable_t::Lock. |
| anhtran | 0:e9fd5575b10e | 875 | * |
| anhtran | 0:e9fd5575b10e | 876 | * @param self_ I-lock object |
| anhtran | 0:e9fd5575b10e | 877 | * @return false |
| anhtran | 0:e9fd5575b10e | 878 | */ |
| anhtran | 0:e9fd5575b10e | 879 | bool_t R_OSPL_I_LOCK_LockStub( void *const self_ ); |
| anhtran | 0:e9fd5575b10e | 880 | |
| anhtran | 0:e9fd5575b10e | 881 | |
| anhtran | 0:e9fd5575b10e | 882 | /** |
| anhtran | 0:e9fd5575b10e | 883 | * @brief Do nothing. This is registered to r_ospl_i_lock_vtable_t::Unlock. |
| anhtran | 0:e9fd5575b10e | 884 | * |
| anhtran | 0:e9fd5575b10e | 885 | * @param self_ I-lock object |
| anhtran | 0:e9fd5575b10e | 886 | * @return None |
| anhtran | 0:e9fd5575b10e | 887 | */ |
| anhtran | 0:e9fd5575b10e | 888 | void R_OSPL_I_LOCK_UnlockStub( void *const self_ ); |
| anhtran | 0:e9fd5575b10e | 889 | |
| anhtran | 0:e9fd5575b10e | 890 | |
| anhtran | 0:e9fd5575b10e | 891 | /** |
| anhtran | 0:e9fd5575b10e | 892 | * @brief Do nothing. This is registered to r_ospl_i_lock_vtable_t::RequestFinalize. |
| anhtran | 0:e9fd5575b10e | 893 | * |
| anhtran | 0:e9fd5575b10e | 894 | * @param self_ I-lock object |
| anhtran | 0:e9fd5575b10e | 895 | * @return None |
| anhtran | 0:e9fd5575b10e | 896 | */ |
| anhtran | 0:e9fd5575b10e | 897 | void R_OSPL_I_LOCK_RequestFinalizeStub( void *const self_ ); |
| anhtran | 0:e9fd5575b10e | 898 | |
| anhtran | 0:e9fd5575b10e | 899 | |
| anhtran | 0:e9fd5575b10e | 900 | /** |
| anhtran | 0:e9fd5575b10e | 901 | * @brief Get root channel number |
| anhtran | 0:e9fd5575b10e | 902 | * |
| anhtran | 0:e9fd5575b10e | 903 | * @param self <r_ospl_caller_t> object |
| anhtran | 0:e9fd5575b10e | 904 | * @return Root channel number |
| anhtran | 0:e9fd5575b10e | 905 | */ |
| anhtran | 0:e9fd5575b10e | 906 | INLINE int_fast32_t R_OSPL_CALLER_GetRootChannelNum( const r_ospl_caller_t *const self ) |
| anhtran | 0:e9fd5575b10e | 907 | { |
| anhtran | 0:e9fd5575b10e | 908 | int_fast32_t root_channel_num; |
| anhtran | 0:e9fd5575b10e | 909 | |
| anhtran | 0:e9fd5575b10e | 910 | IF_DQ( self == NULL ) { |
| anhtran | 0:e9fd5575b10e | 911 | root_channel_num = 0; |
| anhtran | 0:e9fd5575b10e | 912 | } |
| anhtran | 0:e9fd5575b10e | 913 | else { |
| anhtran | 0:e9fd5575b10e | 914 | root_channel_num = self->I_LockVTable->GetRootChannelNum( self->I_Lock ); |
| anhtran | 0:e9fd5575b10e | 915 | } |
| anhtran | 0:e9fd5575b10e | 916 | |
| anhtran | 0:e9fd5575b10e | 917 | return root_channel_num; |
| anhtran | 0:e9fd5575b10e | 918 | } |
| anhtran | 0:e9fd5575b10e | 919 | |
| anhtran | 0:e9fd5575b10e | 920 | |
| anhtran | 0:e9fd5575b10e | 921 | /* Section: Memory Operation */ |
| anhtran | 0:e9fd5575b10e | 922 | /** |
| anhtran | 0:e9fd5575b10e | 923 | * @brief Flushes cache memory |
| anhtran | 0:e9fd5575b10e | 924 | * |
| anhtran | 0:e9fd5575b10e | 925 | * @param FlushType The operation of flush |
| anhtran | 0:e9fd5575b10e | 926 | * @return None |
| anhtran | 0:e9fd5575b10e | 927 | * |
| anhtran | 0:e9fd5575b10e | 928 | * @par Description |
| anhtran | 0:e9fd5575b10e | 929 | * Call the function of the driver after flushing input output buffer |
| anhtran | 0:e9fd5575b10e | 930 | * in the cache memory, If the data area accessing by the hardware is |
| anhtran | 0:e9fd5575b10e | 931 | * on cache and the driver did not manage the cache memory. |
| anhtran | 0:e9fd5575b10e | 932 | * Whether the driver manages the cache memory is depend on the driver |
| anhtran | 0:e9fd5575b10e | 933 | * specification. |
| anhtran | 0:e9fd5575b10e | 934 | */ |
| anhtran | 0:e9fd5575b10e | 935 | void R_OSPL_MEMORY_Flush( r_ospl_flush_t const FlushType ); |
| anhtran | 0:e9fd5575b10e | 936 | |
| anhtran | 0:e9fd5575b10e | 937 | |
| anhtran | 0:e9fd5575b10e | 938 | /** |
| anhtran | 0:e9fd5575b10e | 939 | * @brief Flushes cache memory with the range of virtual address. |
| anhtran | 0:e9fd5575b10e | 940 | * |
| anhtran | 0:e9fd5575b10e | 941 | * @param FlushType The operation of flush |
| anhtran | 0:e9fd5575b10e | 942 | * @return None |
| anhtran | 0:e9fd5575b10e | 943 | * |
| anhtran | 0:e9fd5575b10e | 944 | * @par Description |
| anhtran | 0:e9fd5575b10e | 945 | * Align "StartAddress" argument and "Length" argument to cache line size. |
| anhtran | 0:e9fd5575b10e | 946 | * If not aligned, E_OTHERS error is raised. |
| anhtran | 0:e9fd5575b10e | 947 | * Refer to : R_OSPL_MEMORY_GetSpecification |
| anhtran | 0:e9fd5575b10e | 948 | * |
| anhtran | 0:e9fd5575b10e | 949 | * If the data area written by the hardware and read from CPU was in cache |
| anhtran | 0:e9fd5575b10e | 950 | * rea, when the hardware started without invalidate |
| anhtran | 0:e9fd5575b10e | 951 | * ("R_OSPL_FLUSH_WRITEBACK_INVALIDATE" or "R_OSPL_FLUSH_INVALIDATE"), |
| anhtran | 0:e9fd5575b10e | 952 | * invalidate the data area and read it after finished to write by hardware. |
| anhtran | 0:e9fd5575b10e | 953 | * (If the driver does not manage the cache memory.) |
| anhtran | 0:e9fd5575b10e | 954 | */ |
| anhtran | 0:e9fd5575b10e | 955 | errnum_t R_OSPL_MEMORY_RangeFlush( r_ospl_flush_t const FlushType, |
| anhtran | 0:e9fd5575b10e | 956 | const void *const StartAddress, size_t const Length ); |
| anhtran | 0:e9fd5575b10e | 957 | |
| anhtran | 0:e9fd5575b10e | 958 | |
| anhtran | 0:e9fd5575b10e | 959 | /** |
| anhtran | 0:e9fd5575b10e | 960 | * @brief Gets the specification about memory and cache memory. |
| anhtran | 0:e9fd5575b10e | 961 | * |
| anhtran | 0:e9fd5575b10e | 962 | * @param out_MemorySpec The specification about memory and cache memory |
| anhtran | 0:e9fd5575b10e | 963 | * @return None |
| anhtran | 0:e9fd5575b10e | 964 | */ |
| anhtran | 0:e9fd5575b10e | 965 | void R_OSPL_MEMORY_GetSpecification( r_ospl_memory_spec_t *const out_MemorySpec ); |
| anhtran | 0:e9fd5575b10e | 966 | |
| anhtran | 0:e9fd5575b10e | 967 | |
| anhtran | 0:e9fd5575b10e | 968 | /** |
| anhtran | 0:e9fd5575b10e | 969 | * @brief Set a memory barrier. |
| anhtran | 0:e9fd5575b10e | 970 | * |
| anhtran | 0:e9fd5575b10e | 971 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 972 | * None |
| anhtran | 0:e9fd5575b10e | 973 | * @return None |
| anhtran | 0:e9fd5575b10e | 974 | * |
| anhtran | 0:e9fd5575b10e | 975 | * @par Description |
| anhtran | 0:e9fd5575b10e | 976 | * In ARM, This function calls DSB assembler operation. |
| anhtran | 0:e9fd5575b10e | 977 | * This effects to L1 cache only. |
| anhtran | 0:e9fd5575b10e | 978 | */ |
| anhtran | 0:e9fd5575b10e | 979 | void R_OSPL_MEMORY_Barrier(void); |
| anhtran | 0:e9fd5575b10e | 980 | |
| anhtran | 0:e9fd5575b10e | 981 | |
| anhtran | 0:e9fd5575b10e | 982 | /** |
| anhtran | 0:e9fd5575b10e | 983 | * @brief Set a instruction barrier. |
| anhtran | 0:e9fd5575b10e | 984 | * |
| anhtran | 0:e9fd5575b10e | 985 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 986 | * None |
| anhtran | 0:e9fd5575b10e | 987 | * @return None |
| anhtran | 0:e9fd5575b10e | 988 | * |
| anhtran | 0:e9fd5575b10e | 989 | * @par Description |
| anhtran | 0:e9fd5575b10e | 990 | * In ARM, This function calls ISB assembler operation. |
| anhtran | 0:e9fd5575b10e | 991 | */ |
| anhtran | 0:e9fd5575b10e | 992 | void R_OSPL_InstructionSyncBarrier(void); |
| anhtran | 0:e9fd5575b10e | 993 | |
| anhtran | 0:e9fd5575b10e | 994 | |
| anhtran | 0:e9fd5575b10e | 995 | /** |
| anhtran | 0:e9fd5575b10e | 996 | * @brief Changes to physical address |
| anhtran | 0:e9fd5575b10e | 997 | * |
| anhtran | 0:e9fd5575b10e | 998 | * @param Address Virtual address |
| anhtran | 0:e9fd5575b10e | 999 | * @param out_PhysicalAddress Output: Physical address |
| anhtran | 0:e9fd5575b10e | 1000 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1001 | * |
| anhtran | 0:e9fd5575b10e | 1002 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1003 | * This function must be modified by MMU setting. |
| anhtran | 0:e9fd5575b10e | 1004 | */ |
| anhtran | 0:e9fd5575b10e | 1005 | errnum_t R_OSPL_ToPhysicalAddress( const volatile void *const Address, uintptr_t *const out_PhysicalAddress ); |
| anhtran | 0:e9fd5575b10e | 1006 | |
| anhtran | 0:e9fd5575b10e | 1007 | |
| anhtran | 0:e9fd5575b10e | 1008 | /** |
| anhtran | 0:e9fd5575b10e | 1009 | * @brief Changes to the address in the L1 cache area |
| anhtran | 0:e9fd5575b10e | 1010 | * |
| anhtran | 0:e9fd5575b10e | 1011 | * @param Address Virtual address |
| anhtran | 0:e9fd5575b10e | 1012 | * @param out_CachedAddress Output: Virtual address for cached area |
| anhtran | 0:e9fd5575b10e | 1013 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1014 | * |
| anhtran | 0:e9fd5575b10e | 1015 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1016 | * This function must be modified by MMU setting. |
| anhtran | 0:e9fd5575b10e | 1017 | * If "E_ACCESS_DENIED" error was raised, you may know the variable by |
| anhtran | 0:e9fd5575b10e | 1018 | * looking at value of "Address" argument and map file. |
| anhtran | 0:e9fd5575b10e | 1019 | */ |
| anhtran | 0:e9fd5575b10e | 1020 | errnum_t R_OSPL_ToCachedAddress( const volatile void *const Address, void *const out_CachedAddress ); |
| anhtran | 0:e9fd5575b10e | 1021 | |
| anhtran | 0:e9fd5575b10e | 1022 | |
| anhtran | 0:e9fd5575b10e | 1023 | /** |
| anhtran | 0:e9fd5575b10e | 1024 | * @brief Changes to the address in the L1 uncached area |
| anhtran | 0:e9fd5575b10e | 1025 | * |
| anhtran | 0:e9fd5575b10e | 1026 | * @param Address Virtual address |
| anhtran | 0:e9fd5575b10e | 1027 | * @param out_UncachedAddress Output: Virtual address for uncached area |
| anhtran | 0:e9fd5575b10e | 1028 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1029 | * |
| anhtran | 0:e9fd5575b10e | 1030 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1031 | * This function must be modified by MMU setting. |
| anhtran | 0:e9fd5575b10e | 1032 | * If "E_ACCESS_DENIED" error was raised, you may know the variable by |
| anhtran | 0:e9fd5575b10e | 1033 | * looking at value of "Address" argument and map file. |
| anhtran | 0:e9fd5575b10e | 1034 | */ |
| anhtran | 0:e9fd5575b10e | 1035 | errnum_t R_OSPL_ToUncachedAddress( const volatile void *const Address, void *const out_UncachedAddress ); |
| anhtran | 0:e9fd5575b10e | 1036 | |
| anhtran | 0:e9fd5575b10e | 1037 | |
| anhtran | 0:e9fd5575b10e | 1038 | /** |
| anhtran | 0:e9fd5575b10e | 1039 | * @brief Gets the level of cache for flushing the memory indicated by the address. |
| anhtran | 0:e9fd5575b10e | 1040 | * |
| anhtran | 0:e9fd5575b10e | 1041 | * @param Address The address in flushing memory |
| anhtran | 0:e9fd5575b10e | 1042 | * @param out_Level Output: 0=Not need to flush, 1=L1 cache only, 2=both of L1 and L2 cache |
| anhtran | 0:e9fd5575b10e | 1043 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1044 | */ |
| anhtran | 0:e9fd5575b10e | 1045 | errnum_t R_OSPL_MEMORY_GetLevelOfFlush( const void *Address, int_fast32_t *out_Level ); |
| anhtran | 0:e9fd5575b10e | 1046 | |
| anhtran | 0:e9fd5575b10e | 1047 | |
| anhtran | 0:e9fd5575b10e | 1048 | /** |
| anhtran | 0:e9fd5575b10e | 1049 | * @brief Get 2nd cache attribute of AXI bus for peripheral (not CPU) from physical address. |
| anhtran | 0:e9fd5575b10e | 1050 | * |
| anhtran | 0:e9fd5575b10e | 1051 | * @param PhysicalAddress The physical address in the memory area |
| anhtran | 0:e9fd5575b10e | 1052 | * @param out_CacheAttribute Output: Cache_attribute, AWCACHE[3:0], ARCACHE[3:0] |
| anhtran | 0:e9fd5575b10e | 1053 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1054 | */ |
| anhtran | 0:e9fd5575b10e | 1055 | errnum_t R_OSPL_AXI_Get2ndCacheAttribute( uintptr_t const PhysicalAddress, |
| anhtran | 0:e9fd5575b10e | 1056 | r_ospl_axi_cache_attribute_t *const out_CacheAttribute ); |
| anhtran | 0:e9fd5575b10e | 1057 | |
| anhtran | 0:e9fd5575b10e | 1058 | |
| anhtran | 0:e9fd5575b10e | 1059 | /** |
| anhtran | 0:e9fd5575b10e | 1060 | * @brief Gets protection attribute of AXI bus from the address |
| anhtran | 0:e9fd5575b10e | 1061 | * |
| anhtran | 0:e9fd5575b10e | 1062 | * @param PhysicalAddress The physical address in the memory area |
| anhtran | 0:e9fd5575b10e | 1063 | * @param out_CacheAttribute Output: The protection attribute of AXI bus AWPROT[2:0], ARPROT[2:0] |
| anhtran | 0:e9fd5575b10e | 1064 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1065 | */ |
| anhtran | 0:e9fd5575b10e | 1066 | errnum_t R_OSPL_AXI_GetProtection( uintptr_t const physical_address, |
| anhtran | 0:e9fd5575b10e | 1067 | r_ospl_axi_protection_t *const out_protection ); |
| anhtran | 0:e9fd5575b10e | 1068 | |
| anhtran | 0:e9fd5575b10e | 1069 | |
| anhtran | 0:e9fd5575b10e | 1070 | /* Section: Timer */ |
| anhtran | 0:e9fd5575b10e | 1071 | /** |
| anhtran | 0:e9fd5575b10e | 1072 | * @brief Waits for a while until passed time |
| anhtran | 0:e9fd5575b10e | 1073 | * |
| anhtran | 0:e9fd5575b10e | 1074 | * @param DelayTime_msec Time of waiting (millisecond) |
| anhtran | 0:e9fd5575b10e | 1075 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1076 | * |
| anhtran | 0:e9fd5575b10e | 1077 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1078 | * Maximum value is "R_OSPL_MAX_TIME_OUT" (=65533). |
| anhtran | 0:e9fd5575b10e | 1079 | */ |
| anhtran | 0:e9fd5575b10e | 1080 | errnum_t R_OSPL_Delay( uint32_t const DelayTime_msec ); |
| anhtran | 0:e9fd5575b10e | 1081 | |
| anhtran | 0:e9fd5575b10e | 1082 | |
| anhtran | 0:e9fd5575b10e | 1083 | /** |
| anhtran | 0:e9fd5575b10e | 1084 | * @brief Set up the free running timer |
| anhtran | 0:e9fd5575b10e | 1085 | * |
| anhtran | 0:e9fd5575b10e | 1086 | * @param out_Specification NULL is permitted. Output: The precision of the free run timer |
| anhtran | 0:e9fd5575b10e | 1087 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1088 | * |
| anhtran | 0:e9fd5575b10e | 1089 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1090 | * The free running timer does not stop. |
| anhtran | 0:e9fd5575b10e | 1091 | * |
| anhtran | 0:e9fd5575b10e | 1092 | * If the counter of the free running timer was overflow, the counter returns to 0. |
| anhtran | 0:e9fd5575b10e | 1093 | * Even in interrupt handler, the counter does count up. |
| anhtran | 0:e9fd5575b10e | 1094 | * OSPL free running timer does not use any interrupt. |
| anhtran | 0:e9fd5575b10e | 1095 | * |
| anhtran | 0:e9fd5575b10e | 1096 | * Using timer can be selected by "R_OSPL_FTIMER_IS" macro. |
| anhtran | 0:e9fd5575b10e | 1097 | * |
| anhtran | 0:e9fd5575b10e | 1098 | * If the free running timer was already set up, this function does not set up it, |
| anhtran | 0:e9fd5575b10e | 1099 | * outputs to "out_Specification" argument and does not raise any error. |
| anhtran | 0:e9fd5575b10e | 1100 | * |
| anhtran | 0:e9fd5575b10e | 1101 | * When OSPL API function with timeout or "R_OSPL_Delay" function was called, |
| anhtran | 0:e9fd5575b10e | 1102 | * "R_OSPL_FTIMER_InitializeIfNot" function is callbacked from these functions. |
| anhtran | 0:e9fd5575b10e | 1103 | * |
| anhtran | 0:e9fd5575b10e | 1104 | * There is all interrupt disabled area inside. |
| anhtran | 0:e9fd5575b10e | 1105 | */ |
| anhtran | 0:e9fd5575b10e | 1106 | errnum_t R_OSPL_FTIMER_InitializeIfNot( r_ospl_ftimer_spec_t *const out_Specification ); |
| anhtran | 0:e9fd5575b10e | 1107 | |
| anhtran | 0:e9fd5575b10e | 1108 | |
| anhtran | 0:e9fd5575b10e | 1109 | /** |
| anhtran | 0:e9fd5575b10e | 1110 | * @brief Gets the specification of free running timer. |
| anhtran | 0:e9fd5575b10e | 1111 | * |
| anhtran | 0:e9fd5575b10e | 1112 | * @param out_Specification Output: The precision of the free run timer |
| anhtran | 0:e9fd5575b10e | 1113 | * @return None |
| anhtran | 0:e9fd5575b10e | 1114 | */ |
| anhtran | 0:e9fd5575b10e | 1115 | void R_OSPL_FTIMER_GetSpecification( r_ospl_ftimer_spec_t *const out_Specification ); |
| anhtran | 0:e9fd5575b10e | 1116 | |
| anhtran | 0:e9fd5575b10e | 1117 | |
| anhtran | 0:e9fd5575b10e | 1118 | /** |
| anhtran | 0:e9fd5575b10e | 1119 | * @brief Get current time of free running timer. |
| anhtran | 0:e9fd5575b10e | 1120 | * |
| anhtran | 0:e9fd5575b10e | 1121 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1122 | * None |
| anhtran | 0:e9fd5575b10e | 1123 | * @return The current clock count of free run timer |
| anhtran | 0:e9fd5575b10e | 1124 | * |
| anhtran | 0:e9fd5575b10e | 1125 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1126 | * Call "R_OSPL_FTIMER_InitializeIfNot" function before calling this function. |
| anhtran | 0:e9fd5575b10e | 1127 | * Call "R_OSPL_FTIMER_IsPast" function, when it is determined whether time passed. |
| anhtran | 0:e9fd5575b10e | 1128 | * |
| anhtran | 0:e9fd5575b10e | 1129 | * @par Example |
| anhtran | 0:e9fd5575b10e | 1130 | * @code |
| anhtran | 0:e9fd5575b10e | 1131 | * errnum_t e; |
| anhtran | 0:e9fd5575b10e | 1132 | * r_ospl_ftimer_spec_t ts; |
| anhtran | 0:e9fd5575b10e | 1133 | * uint32_t start; |
| anhtran | 0:e9fd5575b10e | 1134 | * uint32_t end; |
| anhtran | 0:e9fd5575b10e | 1135 | * |
| anhtran | 0:e9fd5575b10e | 1136 | * e= R_OSPL_FTIMER_InitializeIfNot( &ts ); IF(e){goto fin;} |
| anhtran | 0:e9fd5575b10e | 1137 | * start = R_OSPL_FTIMER_Get(); |
| anhtran | 0:e9fd5575b10e | 1138 | * |
| anhtran | 0:e9fd5575b10e | 1139 | * // The section of measuring |
| anhtran | 0:e9fd5575b10e | 1140 | * |
| anhtran | 0:e9fd5575b10e | 1141 | * end = R_OSPL_FTIMER_Get(); |
| anhtran | 0:e9fd5575b10e | 1142 | * printf( "%d msec\n", R_OSPL_FTIMER_CountToTime( |
| anhtran | 0:e9fd5575b10e | 1143 | * &ts, end - start ) ); |
| anhtran | 0:e9fd5575b10e | 1144 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1145 | */ |
| anhtran | 0:e9fd5575b10e | 1146 | uint32_t R_OSPL_FTIMER_Get(void); |
| anhtran | 0:e9fd5575b10e | 1147 | |
| anhtran | 0:e9fd5575b10e | 1148 | |
| anhtran | 0:e9fd5575b10e | 1149 | /** |
| anhtran | 0:e9fd5575b10e | 1150 | * @brief Returns whether specified time was passed |
| anhtran | 0:e9fd5575b10e | 1151 | * |
| anhtran | 0:e9fd5575b10e | 1152 | * @param ts Precision of the free running timer |
| anhtran | 0:e9fd5575b10e | 1153 | * @param Now Count of current time |
| anhtran | 0:e9fd5575b10e | 1154 | * @param TargetTime Count of target time |
| anhtran | 0:e9fd5575b10e | 1155 | * @param out_IsPast Output: Whether the target time was past or not |
| anhtran | 0:e9fd5575b10e | 1156 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1157 | */ |
| anhtran | 0:e9fd5575b10e | 1158 | errnum_t R_OSPL_FTIMER_IsPast( const r_ospl_ftimer_spec_t *const ts, |
| anhtran | 0:e9fd5575b10e | 1159 | uint32_t const Now, uint32_t const TargetTime, bool_t *const out_IsPast ); |
| anhtran | 0:e9fd5575b10e | 1160 | |
| anhtran | 0:e9fd5575b10e | 1161 | |
| anhtran | 0:e9fd5575b10e | 1162 | /** |
| anhtran | 0:e9fd5575b10e | 1163 | * @brief Change from mili-second unit to free running timer unit |
| anhtran | 0:e9fd5575b10e | 1164 | * |
| anhtran | 0:e9fd5575b10e | 1165 | * @param ts Precision of the free running timer |
| anhtran | 0:e9fd5575b10e | 1166 | * @param msec The value of mili-second unit |
| anhtran | 0:e9fd5575b10e | 1167 | * @return The value of free running timer unit |
| anhtran | 0:e9fd5575b10e | 1168 | * |
| anhtran | 0:e9fd5575b10e | 1169 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1170 | * The fractional part is been round up. (For waiting time must be more |
| anhtran | 0:e9fd5575b10e | 1171 | * than specified time.) |
| anhtran | 0:e9fd5575b10e | 1172 | * |
| anhtran | 0:e9fd5575b10e | 1173 | * This function calculates like the following formula. |
| anhtran | 0:e9fd5575b10e | 1174 | * @code |
| anhtran | 0:e9fd5575b10e | 1175 | * ( msec * ts->msec_Denominator + ts->msec_Numerator - 1 ) / ts->msec_Numerator |
| anhtran | 0:e9fd5575b10e | 1176 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1177 | * |
| anhtran | 0:e9fd5575b10e | 1178 | * - Attention: If "ts - >msec_Denominator" was more than "ts->msec_Numerator", |
| anhtran | 0:e9fd5575b10e | 1179 | * take care of overflow. |
| anhtran | 0:e9fd5575b10e | 1180 | */ |
| anhtran | 0:e9fd5575b10e | 1181 | INLINE uint32_t R_OSPL_FTIMER_TimeToCount( const r_ospl_ftimer_spec_t *const ts, |
| anhtran | 0:e9fd5575b10e | 1182 | uint32_t const msec ) |
| anhtran | 0:e9fd5575b10e | 1183 | { |
| anhtran | 0:e9fd5575b10e | 1184 | uint32_t count; |
| anhtran | 0:e9fd5575b10e | 1185 | |
| anhtran | 0:e9fd5575b10e | 1186 | IF_DQ( ts == NULL ) { |
| anhtran | 0:e9fd5575b10e | 1187 | count = 0; |
| anhtran | 0:e9fd5575b10e | 1188 | } |
| anhtran | 0:e9fd5575b10e | 1189 | else { |
| anhtran | 0:e9fd5575b10e | 1190 | count = ( ((msec * ts->msec_Denominator) + ts->msec_Numerator) - 1u ) / ts->msec_Numerator; |
| anhtran | 0:e9fd5575b10e | 1191 | } |
| anhtran | 0:e9fd5575b10e | 1192 | return count; |
| anhtran | 0:e9fd5575b10e | 1193 | } |
| anhtran | 0:e9fd5575b10e | 1194 | |
| anhtran | 0:e9fd5575b10e | 1195 | |
| anhtran | 0:e9fd5575b10e | 1196 | /** |
| anhtran | 0:e9fd5575b10e | 1197 | * @brief Change from free running timer unit to mili-second unit |
| anhtran | 0:e9fd5575b10e | 1198 | * |
| anhtran | 0:e9fd5575b10e | 1199 | * @param ts Precision of the free running timer |
| anhtran | 0:e9fd5575b10e | 1200 | * @param Count The value of free running timer unit |
| anhtran | 0:e9fd5575b10e | 1201 | * @return The value of mili-second unit |
| anhtran | 0:e9fd5575b10e | 1202 | * |
| anhtran | 0:e9fd5575b10e | 1203 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1204 | * The fractional part is been round down. (Because overflow does not |
| anhtran | 0:e9fd5575b10e | 1205 | * occur, when "Count = r_ospl_ftimer_spec_t::MaxCount" ) |
| anhtran | 0:e9fd5575b10e | 1206 | * |
| anhtran | 0:e9fd5575b10e | 1207 | * This function calculates like the following formula. |
| anhtran | 0:e9fd5575b10e | 1208 | * @code |
| anhtran | 0:e9fd5575b10e | 1209 | * ( Count * ts->msec_Numerator ) / ts->msec_Denominator |
| anhtran | 0:e9fd5575b10e | 1210 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1211 | */ |
| anhtran | 0:e9fd5575b10e | 1212 | INLINE uint32_t R_OSPL_FTIMER_CountToTime( const r_ospl_ftimer_spec_t *const ts, |
| anhtran | 0:e9fd5575b10e | 1213 | uint32_t const Count ) |
| anhtran | 0:e9fd5575b10e | 1214 | { |
| anhtran | 0:e9fd5575b10e | 1215 | uint32_t time; |
| anhtran | 0:e9fd5575b10e | 1216 | |
| anhtran | 0:e9fd5575b10e | 1217 | IF_DQ( ts == NULL ) { |
| anhtran | 0:e9fd5575b10e | 1218 | time = 0; |
| anhtran | 0:e9fd5575b10e | 1219 | } |
| anhtran | 0:e9fd5575b10e | 1220 | else { |
| anhtran | 0:e9fd5575b10e | 1221 | time = ( Count * ts->msec_Numerator ) / ts->msec_Denominator; |
| anhtran | 0:e9fd5575b10e | 1222 | } |
| anhtran | 0:e9fd5575b10e | 1223 | return time; |
| anhtran | 0:e9fd5575b10e | 1224 | } |
| anhtran | 0:e9fd5575b10e | 1225 | |
| anhtran | 0:e9fd5575b10e | 1226 | |
| anhtran | 0:e9fd5575b10e | 1227 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 1228 | * Class: r_ospl_table_t |
| anhtran | 0:e9fd5575b10e | 1229 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 1230 | |
| anhtran | 0:e9fd5575b10e | 1231 | /** |
| anhtran | 0:e9fd5575b10e | 1232 | * @brief Initializes an index table |
| anhtran | 0:e9fd5575b10e | 1233 | * |
| anhtran | 0:e9fd5575b10e | 1234 | * @param self Index table object |
| anhtran | 0:e9fd5575b10e | 1235 | * @param Area First address of the index table |
| anhtran | 0:e9fd5575b10e | 1236 | * @param AreaByteSize Size of the index table. See <R_OSPL_TABLE_SIZE> |
| anhtran | 0:e9fd5575b10e | 1237 | * @param Is_T_Lock Whether to call <R_OSPL_Start_T_Lock> |
| anhtran | 0:e9fd5575b10e | 1238 | * @return None |
| anhtran | 0:e9fd5575b10e | 1239 | */ |
| anhtran | 0:e9fd5575b10e | 1240 | void R_OSPL_TABLE_InitConst( r_ospl_table_t *const self, |
| anhtran | 0:e9fd5575b10e | 1241 | void *const Area, size_t const AreaByteSize, bool_t const Is_T_Lock ); |
| anhtran | 0:e9fd5575b10e | 1242 | |
| anhtran | 0:e9fd5575b10e | 1243 | |
| anhtran | 0:e9fd5575b10e | 1244 | /** |
| anhtran | 0:e9fd5575b10e | 1245 | * @brief Returns index from related key |
| anhtran | 0:e9fd5575b10e | 1246 | * |
| anhtran | 0:e9fd5575b10e | 1247 | * @param self Index table object |
| anhtran | 0:e9fd5575b10e | 1248 | * @param Key Key number |
| anhtran | 0:e9fd5575b10e | 1249 | * @param out_Index Output: Related index |
| anhtran | 0:e9fd5575b10e | 1250 | * @param TypeOfIfNot Behavior when key was not registerd. See <r_ospl_if_not_t> |
| anhtran | 0:e9fd5575b10e | 1251 | * @return Error code. If there is no error, the return value is 0. |
| anhtran | 0:e9fd5575b10e | 1252 | */ |
| anhtran | 0:e9fd5575b10e | 1253 | errnum_t R_OSPL_TABLE_GetIndex( r_ospl_table_t *const self, const void *const Key, |
| anhtran | 0:e9fd5575b10e | 1254 | int_fast32_t *const out_Index, r_ospl_if_not_t const TypeOfIfNot ); |
| anhtran | 0:e9fd5575b10e | 1255 | |
| anhtran | 0:e9fd5575b10e | 1256 | |
| anhtran | 0:e9fd5575b10e | 1257 | /** |
| anhtran | 0:e9fd5575b10e | 1258 | * @brief Separates relationship of specified key and related index |
| anhtran | 0:e9fd5575b10e | 1259 | * |
| anhtran | 0:e9fd5575b10e | 1260 | * @param self Index table object |
| anhtran | 0:e9fd5575b10e | 1261 | * @param Key Key number |
| anhtran | 0:e9fd5575b10e | 1262 | * @return None |
| anhtran | 0:e9fd5575b10e | 1263 | * |
| anhtran | 0:e9fd5575b10e | 1264 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1265 | * Error is not raised, even if specified key was already separated. |
| anhtran | 0:e9fd5575b10e | 1266 | */ |
| anhtran | 0:e9fd5575b10e | 1267 | void R_OSPL_TABLE_Free( r_ospl_table_t *const self, const void *const Key ); |
| anhtran | 0:e9fd5575b10e | 1268 | |
| anhtran | 0:e9fd5575b10e | 1269 | |
| anhtran | 0:e9fd5575b10e | 1270 | /** |
| anhtran | 0:e9fd5575b10e | 1271 | * @brief Print status of specified index table object (for debug) |
| anhtran | 0:e9fd5575b10e | 1272 | * |
| anhtran | 0:e9fd5575b10e | 1273 | * @param self Index table object |
| anhtran | 0:e9fd5575b10e | 1274 | * @return None |
| anhtran | 0:e9fd5575b10e | 1275 | */ |
| anhtran | 0:e9fd5575b10e | 1276 | #if R_OSPL_DEBUG_TOOL |
| anhtran | 0:e9fd5575b10e | 1277 | void R_OSPL_TABLE_Print( r_ospl_table_t *const self ); |
| anhtran | 0:e9fd5575b10e | 1278 | #endif |
| anhtran | 0:e9fd5575b10e | 1279 | |
| anhtran | 0:e9fd5575b10e | 1280 | |
| anhtran | 0:e9fd5575b10e | 1281 | /* Section: Bit flags */ |
| anhtran | 0:e9fd5575b10e | 1282 | /** |
| anhtran | 0:e9fd5575b10e | 1283 | * @brief Evaluate whether any passed bits are 1 or not |
| anhtran | 0:e9fd5575b10e | 1284 | * |
| anhtran | 0:e9fd5575b10e | 1285 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1286 | * @param ConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1287 | * @return Whether the any passed bit are 1 |
| anhtran | 0:e9fd5575b10e | 1288 | */ |
| anhtran | 0:e9fd5575b10e | 1289 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1290 | #define IS_BIT_SET( Variable, ConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1291 | ( BIT_And_Sub( Variable, ConstValue ) != 0u ) |
| anhtran | 0:e9fd5575b10e | 1292 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1293 | |
| anhtran | 0:e9fd5575b10e | 1294 | |
| anhtran | 0:e9fd5575b10e | 1295 | /** |
| anhtran | 0:e9fd5575b10e | 1296 | * @brief Evaluate whether any passed bits are 1 or not |
| anhtran | 0:e9fd5575b10e | 1297 | * |
| anhtran | 0:e9fd5575b10e | 1298 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1299 | * @param OrConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1300 | * @return Whether the any passed bit are 1 |
| anhtran | 0:e9fd5575b10e | 1301 | */ |
| anhtran | 0:e9fd5575b10e | 1302 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1303 | #define IS_ANY_BITS_SET( Variable, OrConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1304 | ( BIT_And_Sub( Variable, OrConstValue ) != 0u ) |
| anhtran | 0:e9fd5575b10e | 1305 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1306 | |
| anhtran | 0:e9fd5575b10e | 1307 | |
| anhtran | 0:e9fd5575b10e | 1308 | /** |
| anhtran | 0:e9fd5575b10e | 1309 | * @brief Evaluate whether all passed bits are 1 or not |
| anhtran | 0:e9fd5575b10e | 1310 | * |
| anhtran | 0:e9fd5575b10e | 1311 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1312 | * @param OrConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1313 | * @return Whether the all passed bit are 1 |
| anhtran | 0:e9fd5575b10e | 1314 | */ |
| anhtran | 0:e9fd5575b10e | 1315 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1316 | #define IS_ALL_BITS_SET( Variable, OrConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1317 | ( BIT_And_Sub( Variable, OrConstValue ) == (OrConstValue) ) |
| anhtran | 0:e9fd5575b10e | 1318 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1319 | |
| anhtran | 0:e9fd5575b10e | 1320 | |
| anhtran | 0:e9fd5575b10e | 1321 | /** |
| anhtran | 0:e9fd5575b10e | 1322 | * @brief Evaluate whether the passed bit is 0 or not |
| anhtran | 0:e9fd5575b10e | 1323 | * |
| anhtran | 0:e9fd5575b10e | 1324 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1325 | * @param ConstValue The value that investigating bit is 1 |
| anhtran | 0:e9fd5575b10e | 1326 | * @return Whether the passed bit is 0 |
| anhtran | 0:e9fd5575b10e | 1327 | */ |
| anhtran | 0:e9fd5575b10e | 1328 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1329 | #define IS_BIT_NOT_SET( Variable, ConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1330 | ( BIT_And_Sub( Variable, ConstValue ) == 0u ) |
| anhtran | 0:e9fd5575b10e | 1331 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1332 | |
| anhtran | 0:e9fd5575b10e | 1333 | |
| anhtran | 0:e9fd5575b10e | 1334 | /** |
| anhtran | 0:e9fd5575b10e | 1335 | * @brief Evaluate whether any passed bits are 0 or not |
| anhtran | 0:e9fd5575b10e | 1336 | * |
| anhtran | 0:e9fd5575b10e | 1337 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1338 | * @param OrConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1339 | * @return Whether the any passed bit are 0 |
| anhtran | 0:e9fd5575b10e | 1340 | */ |
| anhtran | 0:e9fd5575b10e | 1341 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1342 | #define IS_ANY_BITS_NOT_SET( Variable, OrConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1343 | ( BIT_And_Sub( Variable, OrConstValue ) != (OrConstValue) ) |
| anhtran | 0:e9fd5575b10e | 1344 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1345 | |
| anhtran | 0:e9fd5575b10e | 1346 | |
| anhtran | 0:e9fd5575b10e | 1347 | /** |
| anhtran | 0:e9fd5575b10e | 1348 | * @brief Evaluate whether all passed bits are 0 or not |
| anhtran | 0:e9fd5575b10e | 1349 | * |
| anhtran | 0:e9fd5575b10e | 1350 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1351 | * @param OrConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1352 | * @return Whether the all passed bit are 0 |
| anhtran | 0:e9fd5575b10e | 1353 | */ |
| anhtran | 0:e9fd5575b10e | 1354 | /* ->MISRA 19.7 : For return _Bool type */ /* ->SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1355 | #define IS_ALL_BITS_NOT_SET( Variable, OrConstValue ) \ |
| anhtran | 0:e9fd5575b10e | 1356 | ( BIT_And_Sub( Variable, OrConstValue ) == 0u ) |
| anhtran | 0:e9fd5575b10e | 1357 | /* <-MISRA 19.7 */ /* <-SEC M5.1.3 */ |
| anhtran | 0:e9fd5575b10e | 1358 | |
| anhtran | 0:e9fd5575b10e | 1359 | |
| anhtran | 0:e9fd5575b10e | 1360 | /** |
| anhtran | 0:e9fd5575b10e | 1361 | * @brief Sub routine of bitwise operation |
| anhtran | 0:e9fd5575b10e | 1362 | * |
| anhtran | 0:e9fd5575b10e | 1363 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1364 | * @param ConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1365 | * @return Whether the all passed bit are 0 |
| anhtran | 0:e9fd5575b10e | 1366 | * |
| anhtran | 0:e9fd5575b10e | 1367 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1368 | * - This part is for compliant to MISRA 2004 - 19.7. |
| anhtran | 0:e9fd5575b10e | 1369 | */ |
| anhtran | 0:e9fd5575b10e | 1370 | INLINE uint_fast32_t BIT_And_Sub( bit_flags_fast32_t const Variable, |
| anhtran | 0:e9fd5575b10e | 1371 | bit_flags_fast32_t const ConstValue ) |
| anhtran | 0:e9fd5575b10e | 1372 | { |
| anhtran | 0:e9fd5575b10e | 1373 | return ((Variable) & (ConstValue)); |
| anhtran | 0:e9fd5575b10e | 1374 | } |
| anhtran | 0:e9fd5575b10e | 1375 | |
| anhtran | 0:e9fd5575b10e | 1376 | |
| anhtran | 0:e9fd5575b10e | 1377 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 1378 | * About: IS_BIT_SET__Warning |
| anhtran | 0:e9fd5575b10e | 1379 | * |
| anhtran | 0:e9fd5575b10e | 1380 | * - This is for QAC-3344 warning : MISRA 13.2 Advice : Tests of a value against |
| anhtran | 0:e9fd5575b10e | 1381 | * zero should be made explicit, unless the operand is effectively Boolean. |
| anhtran | 0:e9fd5575b10e | 1382 | * - This is for QAC-1253 warning : SEC M1.2.2 : A "U" suffix shall be applied |
| anhtran | 0:e9fd5575b10e | 1383 | * to all constants of unsigned type. |
| anhtran | 0:e9fd5575b10e | 1384 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 1385 | |
| anhtran | 0:e9fd5575b10e | 1386 | |
| anhtran | 0:e9fd5575b10e | 1387 | /* Section: Error handling and debugging (2) */ |
| anhtran | 0:e9fd5575b10e | 1388 | /** |
| anhtran | 0:e9fd5575b10e | 1389 | * @brief Breaks here |
| anhtran | 0:e9fd5575b10e | 1390 | * |
| anhtran | 0:e9fd5575b10e | 1391 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1392 | * None |
| anhtran | 0:e9fd5575b10e | 1393 | * @return None |
| anhtran | 0:e9fd5575b10e | 1394 | * |
| anhtran | 0:e9fd5575b10e | 1395 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1396 | * Does break by calling "R_DebugBreak" function. |
| anhtran | 0:e9fd5575b10e | 1397 | * This macro is not influenced the setting of "R_OSPL_ERROR_BREAK" macro. |
| anhtran | 0:e9fd5575b10e | 1398 | */ |
| anhtran | 0:e9fd5575b10e | 1399 | #define R_DEBUG_BREAK() R_DebugBreak(__FILE__,__LINE__) |
| anhtran | 0:e9fd5575b10e | 1400 | |
| anhtran | 0:e9fd5575b10e | 1401 | |
| anhtran | 0:e9fd5575b10e | 1402 | /** |
| anhtran | 0:e9fd5575b10e | 1403 | * @brief The function callbacked from OSPL for breaking |
| anhtran | 0:e9fd5575b10e | 1404 | * |
| anhtran | 0:e9fd5575b10e | 1405 | * @param Variable The value of target bit flags |
| anhtran | 0:e9fd5575b10e | 1406 | * @param ConstValue The value that investigating bits are 1 |
| anhtran | 0:e9fd5575b10e | 1407 | * @return Whether the all passed bit are 0 |
| anhtran | 0:e9fd5575b10e | 1408 | * |
| anhtran | 0:e9fd5575b10e | 1409 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1410 | * Set a break point at this function. |
| anhtran | 0:e9fd5575b10e | 1411 | * In Release configuration, "File = NULL, Line = 0". |
| anhtran | 0:e9fd5575b10e | 1412 | * If "File = NULL", "Line" argument is error code. |
| anhtran | 0:e9fd5575b10e | 1413 | * This function can be customized by application developer. |
| anhtran | 0:e9fd5575b10e | 1414 | */ |
| anhtran | 0:e9fd5575b10e | 1415 | void R_DebugBreak( const char_t *const File, int_fast32_t const Line ); |
| anhtran | 0:e9fd5575b10e | 1416 | |
| anhtran | 0:e9fd5575b10e | 1417 | |
| anhtran | 0:e9fd5575b10e | 1418 | /** |
| anhtran | 0:e9fd5575b10e | 1419 | * @brief Breaks here, if it is error state |
| anhtran | 0:e9fd5575b10e | 1420 | * |
| anhtran | 0:e9fd5575b10e | 1421 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1422 | * None |
| anhtran | 0:e9fd5575b10e | 1423 | * @return None |
| anhtran | 0:e9fd5575b10e | 1424 | * |
| anhtran | 0:e9fd5575b10e | 1425 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1426 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro was defined |
| anhtran | 0:e9fd5575b10e | 1427 | * to be 0. The following descriptions are available, if "R_OSPL_ERROR_BREAK" |
| anhtran | 0:e9fd5575b10e | 1428 | * macro was defined to be 1. |
| anhtran | 0:e9fd5575b10e | 1429 | * |
| anhtran | 0:e9fd5575b10e | 1430 | * Checks the error state of the current thread. |
| anhtran | 0:e9fd5575b10e | 1431 | * Call this macro from the last of each thread. |
| anhtran | 0:e9fd5575b10e | 1432 | * Does break by calling "R_DebugBreak" function. |
| anhtran | 0:e9fd5575b10e | 1433 | * |
| anhtran | 0:e9fd5575b10e | 1434 | * If an error was raised, this function calls "printf" with following message. |
| anhtran | 0:e9fd5575b10e | 1435 | * Set "error_ID" to "R_OSPL_SET_BREAK_ERROR_ID" |
| anhtran | 0:e9fd5575b10e | 1436 | * @code |
| anhtran | 0:e9fd5575b10e | 1437 | * <ERROR error_ID="0x1" file="../src/api.c(336)"/> |
| anhtran | 0:e9fd5575b10e | 1438 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1439 | */ |
| anhtran | 0:e9fd5575b10e | 1440 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1441 | #define R_DEBUG_BREAK_IF_ERROR() R_OSPL_DebugBreakIfError(__FILE__,__LINE__) |
| anhtran | 0:e9fd5575b10e | 1442 | void R_OSPL_DebugBreakIfError( const char_t *const File, int_fast32_t const Line ); |
| anhtran | 0:e9fd5575b10e | 1443 | #else |
| anhtran | 0:e9fd5575b10e | 1444 | INLINE void R_DEBUG_BREAK_IF_ERROR(void) {} |
| anhtran | 0:e9fd5575b10e | 1445 | #endif |
| anhtran | 0:e9fd5575b10e | 1446 | |
| anhtran | 0:e9fd5575b10e | 1447 | |
| anhtran | 0:e9fd5575b10e | 1448 | /** |
| anhtran | 0:e9fd5575b10e | 1449 | * @brief Raises the error of system unrecoverable |
| anhtran | 0:e9fd5575b10e | 1450 | * |
| anhtran | 0:e9fd5575b10e | 1451 | * @param e Error code |
| anhtran | 0:e9fd5575b10e | 1452 | * @return None |
| anhtran | 0:e9fd5575b10e | 1453 | * |
| anhtran | 0:e9fd5575b10e | 1454 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1455 | * The error of system unrecoverable is the error of impossible to |
| anhtran | 0:e9fd5575b10e | 1456 | * - self - recover by process or main system. Example, the heap area was |
| anhtran | 0:e9fd5575b10e | 1457 | * broken or there are not any responses from hardware. This error can |
| anhtran | 0:e9fd5575b10e | 1458 | * be recoverable by OS or the system controller(e.g. Software reset) |
| anhtran | 0:e9fd5575b10e | 1459 | * |
| anhtran | 0:e9fd5575b10e | 1460 | * Example, when an error of recovery process was raised, |
| anhtran | 0:e9fd5575b10e | 1461 | * "R_OSPL_RaiseUnrecoverable" function must be called. |
| anhtran | 0:e9fd5575b10e | 1462 | * |
| anhtran | 0:e9fd5575b10e | 1463 | * "R_OSPL_RaiseUnrecoverable" function can be customized by the |
| anhtran | 0:e9fd5575b10e | 1464 | * application. By default, it calls "R_DebugBreak" function and falls |
| anhtran | 0:e9fd5575b10e | 1465 | * into the infinite loop. |
| anhtran | 0:e9fd5575b10e | 1466 | */ |
| anhtran | 0:e9fd5575b10e | 1467 | void R_OSPL_RaiseUnrecoverable( errnum_t const e ); |
| anhtran | 0:e9fd5575b10e | 1468 | |
| anhtran | 0:e9fd5575b10e | 1469 | |
| anhtran | 0:e9fd5575b10e | 1470 | /** |
| anhtran | 0:e9fd5575b10e | 1471 | * @brief Merge the error code raised in the finalizing operation |
| anhtran | 0:e9fd5575b10e | 1472 | * |
| anhtran | 0:e9fd5575b10e | 1473 | * @param CurrentError Current error code |
| anhtran | 0:e9fd5575b10e | 1474 | * @param AppendError New append error code |
| anhtran | 0:e9fd5575b10e | 1475 | * @return Merged error code |
| anhtran | 0:e9fd5575b10e | 1476 | * |
| anhtran | 0:e9fd5575b10e | 1477 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1478 | * When the state was error state, if other new error was raised, |
| anhtran | 0:e9fd5575b10e | 1479 | * new error code is ignored. |
| anhtran | 0:e9fd5575b10e | 1480 | * - If "CurrentError != 0", this function returns "CurrentError" argument. |
| anhtran | 0:e9fd5575b10e | 1481 | * - If "CurrentError == 0", this function returns "AppendError" argument. |
| anhtran | 0:e9fd5575b10e | 1482 | * |
| anhtran | 0:e9fd5575b10e | 1483 | * This function can be modify by user. |
| anhtran | 0:e9fd5575b10e | 1484 | * |
| anhtran | 0:e9fd5575b10e | 1485 | * @par Example |
| anhtran | 0:e9fd5575b10e | 1486 | * @code |
| anhtran | 0:e9fd5575b10e | 1487 | * ee= Sample(); |
| anhtran | 0:e9fd5575b10e | 1488 | * e= R_OSPL_MergeErrNum( e, ee ); |
| anhtran | 0:e9fd5575b10e | 1489 | * return e; |
| anhtran | 0:e9fd5575b10e | 1490 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1491 | */ |
| anhtran | 0:e9fd5575b10e | 1492 | INLINE errnum_t R_OSPL_MergeErrNum( errnum_t const CurrentError, errnum_t const AppendError ) |
| anhtran | 0:e9fd5575b10e | 1493 | { |
| anhtran | 0:e9fd5575b10e | 1494 | errnum_t e; |
| anhtran | 0:e9fd5575b10e | 1495 | |
| anhtran | 0:e9fd5575b10e | 1496 | if ( CurrentError != 0 ) { |
| anhtran | 0:e9fd5575b10e | 1497 | e = CurrentError; |
| anhtran | 0:e9fd5575b10e | 1498 | } else { |
| anhtran | 0:e9fd5575b10e | 1499 | e = AppendError; |
| anhtran | 0:e9fd5575b10e | 1500 | } |
| anhtran | 0:e9fd5575b10e | 1501 | return e; |
| anhtran | 0:e9fd5575b10e | 1502 | } |
| anhtran | 0:e9fd5575b10e | 1503 | |
| anhtran | 0:e9fd5575b10e | 1504 | |
| anhtran | 0:e9fd5575b10e | 1505 | /** |
| anhtran | 0:e9fd5575b10e | 1506 | * @brief Sets an error code to TLS (Thread Local Storage). |
| anhtran | 0:e9fd5575b10e | 1507 | * |
| anhtran | 0:e9fd5575b10e | 1508 | * @param e Raising error code |
| anhtran | 0:e9fd5575b10e | 1509 | * @return None |
| anhtran | 0:e9fd5575b10e | 1510 | * |
| anhtran | 0:e9fd5575b10e | 1511 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1512 | * Usually error code is returned. If API function cannot return any |
| anhtran | 0:e9fd5575b10e | 1513 | * error code, API function can have the specification of setting error |
| anhtran | 0:e9fd5575b10e | 1514 | * code by "R_OSPL_SetErrNum". |
| anhtran | 0:e9fd5575b10e | 1515 | * |
| anhtran | 0:e9fd5575b10e | 1516 | * There is this function, if "R_OSPL_TLS_ERROR_CODE" macro was defined |
| anhtran | 0:e9fd5575b10e | 1517 | * to be 1. |
| anhtran | 0:e9fd5575b10e | 1518 | * This function does nothing, if any error code was stored already in TLS. |
| anhtran | 0:e9fd5575b10e | 1519 | * The state does not change to error state, if "R_OSPL_SetErrNum" function |
| anhtran | 0:e9fd5575b10e | 1520 | * was called only. See "R_OSPL_GET_ERROR_ID". |
| anhtran | 0:e9fd5575b10e | 1521 | */ |
| anhtran | 0:e9fd5575b10e | 1522 | #if R_OSPL_TLS_ERROR_CODE |
| anhtran | 0:e9fd5575b10e | 1523 | void R_OSPL_SetErrNum( errnum_t const e ); |
| anhtran | 0:e9fd5575b10e | 1524 | #endif |
| anhtran | 0:e9fd5575b10e | 1525 | |
| anhtran | 0:e9fd5575b10e | 1526 | |
| anhtran | 0:e9fd5575b10e | 1527 | /** |
| anhtran | 0:e9fd5575b10e | 1528 | * @brief Returns the error code from TLS (Thread Local Storage). |
| anhtran | 0:e9fd5575b10e | 1529 | * |
| anhtran | 0:e9fd5575b10e | 1530 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1531 | * None |
| anhtran | 0:e9fd5575b10e | 1532 | * @return Error code |
| anhtran | 0:e9fd5575b10e | 1533 | * |
| anhtran | 0:e9fd5575b10e | 1534 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1535 | * Usually error code is returned. If API function cannot return any |
| anhtran | 0:e9fd5575b10e | 1536 | * error code, API function may have the specification of getting error |
| anhtran | 0:e9fd5575b10e | 1537 | * code by "R_OSPL_GetErrNum". |
| anhtran | 0:e9fd5575b10e | 1538 | * |
| anhtran | 0:e9fd5575b10e | 1539 | * There is this function, if "R_OSPL_TLS_ERROR_CODE" macro was defined |
| anhtran | 0:e9fd5575b10e | 1540 | * to be 1. This function returns 0 after called "R_OSPL_CLEAR_ERROR" |
| anhtran | 0:e9fd5575b10e | 1541 | * function. |
| anhtran | 0:e9fd5575b10e | 1542 | */ |
| anhtran | 0:e9fd5575b10e | 1543 | #if R_OSPL_TLS_ERROR_CODE |
| anhtran | 0:e9fd5575b10e | 1544 | errnum_t R_OSPL_GetErrNum(void); |
| anhtran | 0:e9fd5575b10e | 1545 | #endif |
| anhtran | 0:e9fd5575b10e | 1546 | |
| anhtran | 0:e9fd5575b10e | 1547 | |
| anhtran | 0:e9fd5575b10e | 1548 | /** |
| anhtran | 0:e9fd5575b10e | 1549 | * @brief Clears the error state |
| anhtran | 0:e9fd5575b10e | 1550 | * |
| anhtran | 0:e9fd5575b10e | 1551 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1552 | * None |
| anhtran | 0:e9fd5575b10e | 1553 | * @return None |
| anhtran | 0:e9fd5575b10e | 1554 | * |
| anhtran | 0:e9fd5575b10e | 1555 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1556 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro and |
| anhtran | 0:e9fd5575b10e | 1557 | * "R_OSPL_TLS_ERROR_CODE" macro were defined to be 0. The following |
| anhtran | 0:e9fd5575b10e | 1558 | * descriptions are available, if "R_OSPL_ERROR_BREAK" macro was |
| anhtran | 0:e9fd5575b10e | 1559 | * defined to be 1. |
| anhtran | 0:e9fd5575b10e | 1560 | * |
| anhtran | 0:e9fd5575b10e | 1561 | * Whether the state is the error state is stored in thread local |
| anhtran | 0:e9fd5575b10e | 1562 | * storage. "R_OSPL_GetErrNum" function returns 0 after called this |
| anhtran | 0:e9fd5575b10e | 1563 | * function. |
| anhtran | 0:e9fd5575b10e | 1564 | * |
| anhtran | 0:e9fd5575b10e | 1565 | * If the error state was not cleared, the following descriptions were caused. |
| anhtran | 0:e9fd5575b10e | 1566 | * - Breaks at "R_DEBUG_BREAK_IF_ERROR" macro |
| anhtran | 0:e9fd5575b10e | 1567 | * - "R_OSPL_SET_BREAK_ERROR_ID" function behaves not expected behavior |
| anhtran | 0:e9fd5575b10e | 1568 | * because the count of error is not counted up. |
| anhtran | 0:e9fd5575b10e | 1569 | */ |
| anhtran | 0:e9fd5575b10e | 1570 | #if R_OSPL_ERROR_BREAK || R_OSPL_TLS_ERROR_CODE |
| anhtran | 0:e9fd5575b10e | 1571 | void R_OSPL_CLEAR_ERROR(void); |
| anhtran | 0:e9fd5575b10e | 1572 | #else |
| anhtran | 0:e9fd5575b10e | 1573 | INLINE void R_OSPL_CLEAR_ERROR(void) {} /* QAC 3138 */ |
| anhtran | 0:e9fd5575b10e | 1574 | #endif |
| anhtran | 0:e9fd5575b10e | 1575 | |
| anhtran | 0:e9fd5575b10e | 1576 | |
| anhtran | 0:e9fd5575b10e | 1577 | /** |
| anhtran | 0:e9fd5575b10e | 1578 | * @brief Returns the number of current error |
| anhtran | 0:e9fd5575b10e | 1579 | * |
| anhtran | 0:e9fd5575b10e | 1580 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1581 | * None |
| anhtran | 0:e9fd5575b10e | 1582 | * @return The number of current error |
| anhtran | 0:e9fd5575b10e | 1583 | * |
| anhtran | 0:e9fd5575b10e | 1584 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1585 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro was defined |
| anhtran | 0:e9fd5575b10e | 1586 | * to be 0. The following descriptions are available, if "R_OSPL_ERROR_BREAK" |
| anhtran | 0:e9fd5575b10e | 1587 | * macro was defined to be 1. |
| anhtran | 0:e9fd5575b10e | 1588 | * |
| anhtran | 0:e9fd5575b10e | 1589 | * This function returns 0, if any errors were not raised. |
| anhtran | 0:e9fd5575b10e | 1590 | * |
| anhtran | 0:e9fd5575b10e | 1591 | * This function returns 1, if first error was raised. |
| anhtran | 0:e9fd5575b10e | 1592 | * |
| anhtran | 0:e9fd5575b10e | 1593 | * After that, this function returns 2, if second error was raised after |
| anhtran | 0:e9fd5575b10e | 1594 | * calling "R_OSPL_CLEAR_ERROR" function. |
| anhtran | 0:e9fd5575b10e | 1595 | * This function does not return 0 after that the error was cleared by |
| anhtran | 0:e9fd5575b10e | 1596 | * calling "R_OSPL_CLEAR_ERROR". |
| anhtran | 0:e9fd5575b10e | 1597 | * The number of current error is running number in the whole of system |
| anhtran | 0:e9fd5575b10e | 1598 | * (all threads). |
| anhtran | 0:e9fd5575b10e | 1599 | * |
| anhtran | 0:e9fd5575b10e | 1600 | * Error is raised by following macros. |
| anhtran | 0:e9fd5575b10e | 1601 | * @code |
| anhtran | 0:e9fd5575b10e | 1602 | * IF, IF_D, ASSERT_R, ASSERT_D |
| anhtran | 0:e9fd5575b10e | 1603 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1604 | * The process breaks at a moment of error raised, if the number of current |
| anhtran | 0:e9fd5575b10e | 1605 | * error was set to "R_OSPL_SET_BREAK_ERROR_ID" macro. |
| anhtran | 0:e9fd5575b10e | 1606 | */ |
| anhtran | 0:e9fd5575b10e | 1607 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1608 | int_fast32_t R_OSPL_GET_ERROR_ID(void); |
| anhtran | 0:e9fd5575b10e | 1609 | #else |
| anhtran | 0:e9fd5575b10e | 1610 | INLINE int_fast32_t R_OSPL_GET_ERROR_ID(void) |
| anhtran | 0:e9fd5575b10e | 1611 | { |
| anhtran | 0:e9fd5575b10e | 1612 | return -1; |
| anhtran | 0:e9fd5575b10e | 1613 | } |
| anhtran | 0:e9fd5575b10e | 1614 | #endif |
| anhtran | 0:e9fd5575b10e | 1615 | |
| anhtran | 0:e9fd5575b10e | 1616 | |
| anhtran | 0:e9fd5575b10e | 1617 | /** |
| anhtran | 0:e9fd5575b10e | 1618 | * @brief Register to break at raising error at the moment |
| anhtran | 0:e9fd5575b10e | 1619 | * |
| anhtran | 0:e9fd5575b10e | 1620 | * @param ID Breaking number of error |
| anhtran | 0:e9fd5575b10e | 1621 | * @return None |
| anhtran | 0:e9fd5575b10e | 1622 | * |
| anhtran | 0:e9fd5575b10e | 1623 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1624 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro was defined |
| anhtran | 0:e9fd5575b10e | 1625 | * to be 0. The following descriptions are available, if "R_OSPL_ERROR_BREAK" |
| anhtran | 0:e9fd5575b10e | 1626 | * macro was defined to be 1. |
| anhtran | 0:e9fd5575b10e | 1627 | * |
| anhtran | 0:e9fd5575b10e | 1628 | * Set a break point at "R_DebugBreak" function, when the process breaks |
| anhtran | 0:e9fd5575b10e | 1629 | * at the error raised code. |
| anhtran | 0:e9fd5575b10e | 1630 | * |
| anhtran | 0:e9fd5575b10e | 1631 | * The number of "ErrorID" argument can be known by "R_DEBUG_BREAK_IF_ERROR" |
| anhtran | 0:e9fd5575b10e | 1632 | * macro or "R_OSPL_GET_ERROR_ID" macro. |
| anhtran | 0:e9fd5575b10e | 1633 | * - In multi - threading environment, the number of "ErrorID" argument is the |
| anhtran | 0:e9fd5575b10e | 1634 | * number of raised errors in all threads. But when "ErrorID" argument was |
| anhtran | 0:e9fd5575b10e | 1635 | * set to be over 2, call "R_OSPL_SET_DEBUG_WORK" function before calling |
| anhtran | 0:e9fd5575b10e | 1636 | * "R_OSPL_SET_BREAK_ERROR_ID" function. |
| anhtran | 0:e9fd5575b10e | 1637 | * |
| anhtran | 0:e9fd5575b10e | 1638 | * The following code breaks at first error. |
| anhtran | 0:e9fd5575b10e | 1639 | * @code |
| anhtran | 0:e9fd5575b10e | 1640 | * R_OSPL_SET_BREAK_ERROR_ID( 1 ); |
| anhtran | 0:e9fd5575b10e | 1641 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1642 | * |
| anhtran | 0:e9fd5575b10e | 1643 | * The following code breaks at next error after resuming from meny errors. |
| anhtran | 0:e9fd5575b10e | 1644 | * @code |
| anhtran | 0:e9fd5575b10e | 1645 | * R_OSPL_SET_BREAK_ERROR_ID( R_OSPL_GET_ERROR_ID() + 1 ); |
| anhtran | 0:e9fd5575b10e | 1646 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1647 | */ |
| anhtran | 0:e9fd5575b10e | 1648 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1649 | void R_OSPL_SET_BREAK_ERROR_ID( int_fast32_t ID ); |
| anhtran | 0:e9fd5575b10e | 1650 | #else |
| anhtran | 0:e9fd5575b10e | 1651 | INLINE void R_OSPL_SET_BREAK_ERROR_ID( int_fast32_t const ID ) |
| anhtran | 0:e9fd5575b10e | 1652 | { |
| anhtran | 0:e9fd5575b10e | 1653 | R_UNREFERENCED_VARIABLE( ID ); |
| anhtran | 0:e9fd5575b10e | 1654 | } |
| anhtran | 0:e9fd5575b10e | 1655 | #endif |
| anhtran | 0:e9fd5575b10e | 1656 | |
| anhtran | 0:e9fd5575b10e | 1657 | |
| anhtran | 0:e9fd5575b10e | 1658 | /** |
| anhtran | 0:e9fd5575b10e | 1659 | * @brief Set the debug work area |
| anhtran | 0:e9fd5575b10e | 1660 | * |
| anhtran | 0:e9fd5575b10e | 1661 | * @param WorkArea Start address of work area |
| anhtran | 0:e9fd5575b10e | 1662 | * @param WorkAreaSize Size of work area (byte). See. <R_OSPL_DEBUG_WORK_SIZE> |
| anhtran | 0:e9fd5575b10e | 1663 | * @return None |
| anhtran | 0:e9fd5575b10e | 1664 | * |
| anhtran | 0:e9fd5575b10e | 1665 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1666 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro was defined |
| anhtran | 0:e9fd5575b10e | 1667 | * to be 0. The following descriptions are available, if "R_OSPL_ERROR_BREAK" |
| anhtran | 0:e9fd5575b10e | 1668 | * macro was defined to be 1. |
| anhtran | 0:e9fd5575b10e | 1669 | * |
| anhtran | 0:e9fd5575b10e | 1670 | * Set the debug work area, when "R_OSPL_SET_BREAK_ERROR_ID" function |
| anhtran | 0:e9fd5575b10e | 1671 | * supports multi thread. "E_NO_DEBUG_TLS" error is raised, if the debug |
| anhtran | 0:e9fd5575b10e | 1672 | * work area was not set, when errors was raised in 2 or more threads. |
| anhtran | 0:e9fd5575b10e | 1673 | * It is not necessary to call this function, if error handling did by one |
| anhtran | 0:e9fd5575b10e | 1674 | * thread only. |
| anhtran | 0:e9fd5575b10e | 1675 | * |
| anhtran | 0:e9fd5575b10e | 1676 | * @par Example |
| anhtran | 0:e9fd5575b10e | 1677 | * @code |
| anhtran | 0:e9fd5575b10e | 1678 | * #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1679 | * #define GS_MAX_THREAD 10 |
| anhtran | 0:e9fd5575b10e | 1680 | * static uint8_t gs_DebugWorkArea[ R_OSPL_DEBUG_WORK_SIZE( GS_MAX_THREAD ) ]; |
| anhtran | 0:e9fd5575b10e | 1681 | * #endif |
| anhtran | 0:e9fd5575b10e | 1682 | * |
| anhtran | 0:e9fd5575b10e | 1683 | * R_OSPL_SET_DEBUG_WORK( gs_DebugWorkArea, sizeof(gs_DebugWorkArea) ); |
| anhtran | 0:e9fd5575b10e | 1684 | * @endcode |
| anhtran | 0:e9fd5575b10e | 1685 | */ |
| anhtran | 0:e9fd5575b10e | 1686 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1687 | void R_OSPL_SET_DEBUG_WORK( void *WorkArea, uint32_t WorkAreaSize ); |
| anhtran | 0:e9fd5575b10e | 1688 | #else |
| anhtran | 0:e9fd5575b10e | 1689 | INLINE void R_OSPL_SET_DEBUG_WORK( const void *const WorkArea, uint32_t const WorkAreaSize ) |
| anhtran | 0:e9fd5575b10e | 1690 | { |
| anhtran | 0:e9fd5575b10e | 1691 | R_UNREFERENCED_VARIABLE_2( WorkArea, WorkAreaSize ); |
| anhtran | 0:e9fd5575b10e | 1692 | } |
| anhtran | 0:e9fd5575b10e | 1693 | #endif |
| anhtran | 0:e9fd5575b10e | 1694 | |
| anhtran | 0:e9fd5575b10e | 1695 | |
| anhtran | 0:e9fd5575b10e | 1696 | /** |
| anhtran | 0:e9fd5575b10e | 1697 | * @brief Returns debbug information of current thread. |
| anhtran | 0:e9fd5575b10e | 1698 | * |
| anhtran | 0:e9fd5575b10e | 1699 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1700 | * None |
| anhtran | 0:e9fd5575b10e | 1701 | * @return Debbug information of current thread. |
| anhtran | 0:e9fd5575b10e | 1702 | */ |
| anhtran | 0:e9fd5575b10e | 1703 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1704 | r_ospl_error_t *R_OSPL_GetCurrentThreadError(void); |
| anhtran | 0:e9fd5575b10e | 1705 | #endif |
| anhtran | 0:e9fd5575b10e | 1706 | |
| anhtran | 0:e9fd5575b10e | 1707 | |
| anhtran | 0:e9fd5575b10e | 1708 | /** |
| anhtran | 0:e9fd5575b10e | 1709 | * @brief Modifies count of objects that current thread has locked. |
| anhtran | 0:e9fd5575b10e | 1710 | * |
| anhtran | 0:e9fd5575b10e | 1711 | * @param Plus The value of adding to the counter. |
| anhtran | 0:e9fd5575b10e | 1712 | * @return None |
| anhtran | 0:e9fd5575b10e | 1713 | * |
| anhtran | 0:e9fd5575b10e | 1714 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1715 | * The counter is subtracted, if this argument was minus. |
| anhtran | 0:e9fd5575b10e | 1716 | * |
| anhtran | 0:e9fd5575b10e | 1717 | * Drivers calls this function. |
| anhtran | 0:e9fd5575b10e | 1718 | * This function is not called from OSPL. |
| anhtran | 0:e9fd5575b10e | 1719 | * This function does nothing, if "R_OSPL_ERROR_BREAK" macro is 0. |
| anhtran | 0:e9fd5575b10e | 1720 | */ |
| anhtran | 0:e9fd5575b10e | 1721 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1722 | #if R_OSPL_IS_PREEMPTION |
| anhtran | 0:e9fd5575b10e | 1723 | void R_OSPL_MODIFY_THREAD_LOCKED_COUNT( int_fast32_t Plus ); |
| anhtran | 0:e9fd5575b10e | 1724 | #else |
| anhtran | 0:e9fd5575b10e | 1725 | INLINE void R_OSPL_MODIFY_THREAD_LOCKED_COUNT( int_fast32_t Plus ) {} |
| anhtran | 0:e9fd5575b10e | 1726 | #endif |
| anhtran | 0:e9fd5575b10e | 1727 | #else |
| anhtran | 0:e9fd5575b10e | 1728 | INLINE void R_OSPL_MODIFY_THREAD_LOCKED_COUNT( int_fast32_t Plus ) {} |
| anhtran | 0:e9fd5575b10e | 1729 | #endif |
| anhtran | 0:e9fd5575b10e | 1730 | |
| anhtran | 0:e9fd5575b10e | 1731 | |
| anhtran | 0:e9fd5575b10e | 1732 | /** |
| anhtran | 0:e9fd5575b10e | 1733 | * @brief Returns count of objects that current thread has locked. |
| anhtran | 0:e9fd5575b10e | 1734 | * |
| anhtran | 0:e9fd5575b10e | 1735 | * @par Parameters |
| anhtran | 0:e9fd5575b10e | 1736 | * None |
| anhtran | 0:e9fd5575b10e | 1737 | * @return Count of objects that current thread has locked |
| anhtran | 0:e9fd5575b10e | 1738 | * |
| anhtran | 0:e9fd5575b10e | 1739 | * @par Description |
| anhtran | 0:e9fd5575b10e | 1740 | * This function returns 0, if "R_OSPL_ERROR_BREAK" macro is 0. |
| anhtran | 0:e9fd5575b10e | 1741 | */ |
| anhtran | 0:e9fd5575b10e | 1742 | #if R_OSPL_ERROR_BREAK |
| anhtran | 0:e9fd5575b10e | 1743 | #if R_OSPL_IS_PREEMPTION |
| anhtran | 0:e9fd5575b10e | 1744 | int_fast32_t R_OSPL_GET_THREAD_LOCKED_COUNT(void); |
| anhtran | 0:e9fd5575b10e | 1745 | #else |
| anhtran | 0:e9fd5575b10e | 1746 | INLINE int_fast32_t R_OSPL_GET_THREAD_LOCKED_COUNT(void) |
| anhtran | 0:e9fd5575b10e | 1747 | { |
| anhtran | 0:e9fd5575b10e | 1748 | return 0; |
| anhtran | 0:e9fd5575b10e | 1749 | } |
| anhtran | 0:e9fd5575b10e | 1750 | #endif |
| anhtran | 0:e9fd5575b10e | 1751 | #else |
| anhtran | 0:e9fd5575b10e | 1752 | INLINE int_fast32_t R_OSPL_GET_THREAD_LOCKED_COUNT(void) |
| anhtran | 0:e9fd5575b10e | 1753 | { |
| anhtran | 0:e9fd5575b10e | 1754 | return 0; |
| anhtran | 0:e9fd5575b10e | 1755 | } |
| anhtran | 0:e9fd5575b10e | 1756 | #endif |
| anhtran | 0:e9fd5575b10e | 1757 | |
| anhtran | 0:e9fd5575b10e | 1758 | |
| anhtran | 0:e9fd5575b10e | 1759 | /* Section: Accessing to register bit field */ |
| anhtran | 0:e9fd5575b10e | 1760 | /** |
| anhtran | 0:e9fd5575b10e | 1761 | * @brief Reads modifies writes for bit field of 32bit register. |
| anhtran | 0:e9fd5575b10e | 1762 | * |
| anhtran | 0:e9fd5575b10e | 1763 | * @param in_out_Register Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1764 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1765 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1766 | * @param Value Writing value before shift to the bit field |
| anhtran | 0:e9fd5575b10e | 1767 | * @return None |
| anhtran | 0:e9fd5575b10e | 1768 | */ |
| anhtran | 0:e9fd5575b10e | 1769 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1770 | |
| anhtran | 0:e9fd5575b10e | 1771 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1772 | /* Volatile access at left of "=" and right of "=". But this is not depend on compiler spcifications. */ |
| anhtran | 0:e9fd5575b10e | 1773 | /* ->SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1774 | /* If "Value" is signed, this is depend on CPU bit width. This expects 32bit CPU. But driver code is no problem. */ |
| anhtran | 0:e9fd5575b10e | 1775 | |
| anhtran | 0:e9fd5575b10e | 1776 | #define R_OSPL_SET_TO_32_BIT_REGISTER( in_out_Register, Mask, Shift, Value ) \ |
| anhtran | 0:e9fd5575b10e | 1777 | ( *(volatile uint32_t*)(in_out_Register) = (uint32_t)( \ |
| anhtran | 0:e9fd5575b10e | 1778 | ( ((uint32_t) *(volatile uint32_t*)(in_out_Register)) & \ |
| anhtran | 0:e9fd5575b10e | 1779 | ~(Mask) ) | ( (Mask) & ( ( (uint_fast32_t)(Value) << (Shift) ) & (Mask) ) ) ) ) |
| anhtran | 0:e9fd5575b10e | 1780 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 1781 | |
| anhtran | 0:e9fd5575b10e | 1782 | /* <-SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1783 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1784 | |
| anhtran | 0:e9fd5575b10e | 1785 | #else |
| anhtran | 0:e9fd5575b10e | 1786 | |
| anhtran | 0:e9fd5575b10e | 1787 | INLINE void R_OSPL_SET_TO_32_BIT_REGISTER( volatile uint32_t *const Register, |
| anhtran | 0:e9fd5575b10e | 1788 | uint32_t const Mask, int_fast32_t const Shift, uint32_t const Value ) |
| anhtran | 0:e9fd5575b10e | 1789 | { |
| anhtran | 0:e9fd5575b10e | 1790 | uint32_t reg_value; |
| anhtran | 0:e9fd5575b10e | 1791 | |
| anhtran | 0:e9fd5575b10e | 1792 | IF_DQ ( Register == NULL ) {} |
| anhtran | 0:e9fd5575b10e | 1793 | else { |
| anhtran | 0:e9fd5575b10e | 1794 | reg_value = *Register; |
| anhtran | 0:e9fd5575b10e | 1795 | reg_value = ( reg_value & ~Mask ) | ( ( Value << Shift ) & Mask ); |
| anhtran | 0:e9fd5575b10e | 1796 | *Register = reg_value; |
| anhtran | 0:e9fd5575b10e | 1797 | } |
| anhtran | 0:e9fd5575b10e | 1798 | } |
| anhtran | 0:e9fd5575b10e | 1799 | |
| anhtran | 0:e9fd5575b10e | 1800 | #endif |
| anhtran | 0:e9fd5575b10e | 1801 | |
| anhtran | 0:e9fd5575b10e | 1802 | |
| anhtran | 0:e9fd5575b10e | 1803 | /** |
| anhtran | 0:e9fd5575b10e | 1804 | * @brief Reads modifies writes for bit field of 16bit register. |
| anhtran | 0:e9fd5575b10e | 1805 | * |
| anhtran | 0:e9fd5575b10e | 1806 | * @param in_out_Register Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1807 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1808 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1809 | * @param Value Writing value before shift to the bit field |
| anhtran | 0:e9fd5575b10e | 1810 | * @return None |
| anhtran | 0:e9fd5575b10e | 1811 | */ |
| anhtran | 0:e9fd5575b10e | 1812 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1813 | |
| anhtran | 0:e9fd5575b10e | 1814 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1815 | /* Volatile access at left of "=" and right of "=". But this is not depend on compiler spcifications. */ |
| anhtran | 0:e9fd5575b10e | 1816 | /* ->SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1817 | /* If "Value" is signed, this is depend on CPU bit width. This expects 32bit CPU. But driver code is no problem. */ |
| anhtran | 0:e9fd5575b10e | 1818 | |
| anhtran | 0:e9fd5575b10e | 1819 | #define R_OSPL_SET_TO_16_BIT_REGISTER( in_out_Register, Mask, Shift, Value ) \ |
| anhtran | 0:e9fd5575b10e | 1820 | ( *(volatile uint16_t*)(in_out_Register) = (uint16_t)( \ |
| anhtran | 0:e9fd5575b10e | 1821 | ( ((uint16_t) *(volatile uint16_t*)(in_out_Register)) & \ |
| anhtran | 0:e9fd5575b10e | 1822 | ~(Mask) ) | ( (Mask) & ( ( (uint_fast16_t)(Value) << (Shift) ) & (Mask) ) ) ) ) |
| anhtran | 0:e9fd5575b10e | 1823 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 1824 | |
| anhtran | 0:e9fd5575b10e | 1825 | |
| anhtran | 0:e9fd5575b10e | 1826 | /* <-SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1827 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1828 | |
| anhtran | 0:e9fd5575b10e | 1829 | #else |
| anhtran | 0:e9fd5575b10e | 1830 | |
| anhtran | 0:e9fd5575b10e | 1831 | INLINE void R_OSPL_SET_TO_16_BIT_REGISTER( volatile uint16_t *const Register, |
| anhtran | 0:e9fd5575b10e | 1832 | uint16_t const Mask, int_fast32_t const Shift, uint16_t const Value ) |
| anhtran | 0:e9fd5575b10e | 1833 | { |
| anhtran | 0:e9fd5575b10e | 1834 | uint16_t reg_value; |
| anhtran | 0:e9fd5575b10e | 1835 | |
| anhtran | 0:e9fd5575b10e | 1836 | IF_DQ ( Register == NULL ) {} |
| anhtran | 0:e9fd5575b10e | 1837 | else { |
| anhtran | 0:e9fd5575b10e | 1838 | reg_value = *Register; |
| anhtran | 0:e9fd5575b10e | 1839 | reg_value = (uint16_t)( ( (uint_fast32_t) reg_value & ~(uint_fast32_t) Mask ) | |
| anhtran | 0:e9fd5575b10e | 1840 | ( ( (uint_fast32_t) Value << Shift ) & (uint_fast32_t) Mask ) ); |
| anhtran | 0:e9fd5575b10e | 1841 | /* Cast is for SEC R2.4.2 */ |
| anhtran | 0:e9fd5575b10e | 1842 | *Register = reg_value; |
| anhtran | 0:e9fd5575b10e | 1843 | } |
| anhtran | 0:e9fd5575b10e | 1844 | } |
| anhtran | 0:e9fd5575b10e | 1845 | |
| anhtran | 0:e9fd5575b10e | 1846 | #endif |
| anhtran | 0:e9fd5575b10e | 1847 | |
| anhtran | 0:e9fd5575b10e | 1848 | |
| anhtran | 0:e9fd5575b10e | 1849 | /** |
| anhtran | 0:e9fd5575b10e | 1850 | * @brief Reads modifies writes for bit field of 8bit register. |
| anhtran | 0:e9fd5575b10e | 1851 | * |
| anhtran | 0:e9fd5575b10e | 1852 | * @param in_out_Register Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1853 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1854 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1855 | * @param Value Writing value before shift to the bit field |
| anhtran | 0:e9fd5575b10e | 1856 | * @return None |
| anhtran | 0:e9fd5575b10e | 1857 | */ |
| anhtran | 0:e9fd5575b10e | 1858 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1859 | |
| anhtran | 0:e9fd5575b10e | 1860 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1861 | /* Volatile access at left of "=" and right of "=". But this is not depend on compiler spcifications. */ |
| anhtran | 0:e9fd5575b10e | 1862 | /* ->SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1863 | /* If "Value" is signed, this is depend on CPU bit width. This expects 32bit CPU. But driver code is no problem. */ |
| anhtran | 0:e9fd5575b10e | 1864 | |
| anhtran | 0:e9fd5575b10e | 1865 | |
| anhtran | 0:e9fd5575b10e | 1866 | #define R_OSPL_SET_TO_8_BIT_REGISTER( in_out_Register, Mask, Shift, Value ) \ |
| anhtran | 0:e9fd5575b10e | 1867 | ( *(volatile uint8_t*)(in_out_Register) = (uint8_t)( \ |
| anhtran | 0:e9fd5575b10e | 1868 | ( ((uint8_t) *(volatile uint8_t*)(in_out_Register)) & \ |
| anhtran | 0:e9fd5575b10e | 1869 | ~(Mask) ) | ( (Mask) & ( ( (uint_fast8_t)(Value) << (Shift) ) & (Mask) ) ) ) ) |
| anhtran | 0:e9fd5575b10e | 1870 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 1871 | |
| anhtran | 0:e9fd5575b10e | 1872 | /* <-SEC M1.2.2(QAC-1259) */ |
| anhtran | 0:e9fd5575b10e | 1873 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1874 | |
| anhtran | 0:e9fd5575b10e | 1875 | #else |
| anhtran | 0:e9fd5575b10e | 1876 | |
| anhtran | 0:e9fd5575b10e | 1877 | INLINE void R_OSPL_SET_TO_8_BIT_REGISTER( volatile uint8_t *const Register, |
| anhtran | 0:e9fd5575b10e | 1878 | uint8_t const Mask, int_fast32_t const Shift, uint8_t const Value ) |
| anhtran | 0:e9fd5575b10e | 1879 | { |
| anhtran | 0:e9fd5575b10e | 1880 | uint8_t reg_value; |
| anhtran | 0:e9fd5575b10e | 1881 | |
| anhtran | 0:e9fd5575b10e | 1882 | IF_DQ ( Register == NULL ) {} |
| anhtran | 0:e9fd5575b10e | 1883 | else { |
| anhtran | 0:e9fd5575b10e | 1884 | reg_value = *Register; |
| anhtran | 0:e9fd5575b10e | 1885 | reg_value = (uint8_t)( ( (uint_fast32_t) reg_value & ~(uint_fast32_t) Mask ) | |
| anhtran | 0:e9fd5575b10e | 1886 | ( ( (uint_fast32_t) Value << Shift ) & (uint_fast32_t) Mask ) ); |
| anhtran | 0:e9fd5575b10e | 1887 | /* Cast is for SEC R2.4.2 */ |
| anhtran | 0:e9fd5575b10e | 1888 | *Register = reg_value; |
| anhtran | 0:e9fd5575b10e | 1889 | } |
| anhtran | 0:e9fd5575b10e | 1890 | } |
| anhtran | 0:e9fd5575b10e | 1891 | |
| anhtran | 0:e9fd5575b10e | 1892 | #endif |
| anhtran | 0:e9fd5575b10e | 1893 | |
| anhtran | 0:e9fd5575b10e | 1894 | |
| anhtran | 0:e9fd5575b10e | 1895 | /** |
| anhtran | 0:e9fd5575b10e | 1896 | * @brief Reads for bit field of 32bit register. |
| anhtran | 0:e9fd5575b10e | 1897 | * |
| anhtran | 0:e9fd5575b10e | 1898 | * @param RegisterValueAddress Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1899 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1900 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1901 | * @return Read value after shift |
| anhtran | 0:e9fd5575b10e | 1902 | */ |
| anhtran | 0:e9fd5575b10e | 1903 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1904 | |
| anhtran | 0:e9fd5575b10e | 1905 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1906 | /* Volatile access at &(get address), cast and *(memory load). But this is not double volatile access. */ |
| anhtran | 0:e9fd5575b10e | 1907 | /* RegisterValueAddress is for avoid QAC-0310,QAC-3345 by cast code at caller. */ |
| anhtran | 0:e9fd5575b10e | 1908 | |
| anhtran | 0:e9fd5575b10e | 1909 | #define R_OSPL_GET_FROM_32_BIT_REGISTER( RegisterValueAddress, Mask, Shift ) \ |
| anhtran | 0:e9fd5575b10e | 1910 | ( (uint32_t)( ( (uint32_t)*(volatile const uint32_t*) (RegisterValueAddress) \ |
| anhtran | 0:e9fd5575b10e | 1911 | & (uint_fast32_t)(Mask) ) >> (Shift) ) ) |
| anhtran | 0:e9fd5575b10e | 1912 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 1913 | |
| anhtran | 0:e9fd5575b10e | 1914 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1915 | |
| anhtran | 0:e9fd5575b10e | 1916 | #else /* __QAC_ARM_H__ */ /* This code must be tested defined "__QAC_ARM_H__" */ |
| anhtran | 0:e9fd5575b10e | 1917 | |
| anhtran | 0:e9fd5575b10e | 1918 | |
| anhtran | 0:e9fd5575b10e | 1919 | /* This inline functions is not expanded on __CC_ARM 5.15 */ |
| anhtran | 0:e9fd5575b10e | 1920 | INLINE uint32_t R_OSPL_GET_FROM_32_BIT_REGISTER( volatile const uint32_t *const RegisterAddress, |
| anhtran | 0:e9fd5575b10e | 1921 | uint32_t const Mask, int_fast32_t const Shift ) |
| anhtran | 0:e9fd5575b10e | 1922 | { |
| anhtran | 0:e9fd5575b10e | 1923 | uint32_t reg_value; |
| anhtran | 0:e9fd5575b10e | 1924 | |
| anhtran | 0:e9fd5575b10e | 1925 | IF_DQ ( RegisterAddress == NULL ) { |
| anhtran | 0:e9fd5575b10e | 1926 | enum { num = 0x0EDEDEDE }; /* SEC M1.10.1 */ |
| anhtran | 0:e9fd5575b10e | 1927 | reg_value = num; |
| anhtran | 0:e9fd5575b10e | 1928 | } |
| anhtran | 0:e9fd5575b10e | 1929 | else { |
| anhtran | 0:e9fd5575b10e | 1930 | reg_value = *RegisterAddress; |
| anhtran | 0:e9fd5575b10e | 1931 | reg_value = ( reg_value & Mask ) >> Shift; |
| anhtran | 0:e9fd5575b10e | 1932 | } |
| anhtran | 0:e9fd5575b10e | 1933 | return reg_value; |
| anhtran | 0:e9fd5575b10e | 1934 | } |
| anhtran | 0:e9fd5575b10e | 1935 | |
| anhtran | 0:e9fd5575b10e | 1936 | #endif |
| anhtran | 0:e9fd5575b10e | 1937 | |
| anhtran | 0:e9fd5575b10e | 1938 | |
| anhtran | 0:e9fd5575b10e | 1939 | /** |
| anhtran | 0:e9fd5575b10e | 1940 | * @brief Reads for bit field of 16bit register. |
| anhtran | 0:e9fd5575b10e | 1941 | * |
| anhtran | 0:e9fd5575b10e | 1942 | * @param RegisterValueAddress Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1943 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1944 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1945 | * @return Read value after shift |
| anhtran | 0:e9fd5575b10e | 1946 | */ |
| anhtran | 0:e9fd5575b10e | 1947 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1948 | |
| anhtran | 0:e9fd5575b10e | 1949 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1950 | /* Volatile access at &(get address), cast and *(memory load). But this is not double volatile access. */ |
| anhtran | 0:e9fd5575b10e | 1951 | /* RegisterValueAddress is for avoid QAC-0310,QAC-3345 by cast code at caller. */ |
| anhtran | 0:e9fd5575b10e | 1952 | |
| anhtran | 0:e9fd5575b10e | 1953 | #define R_OSPL_GET_FROM_16_BIT_REGISTER( RegisterValueAddress, Mask, Shift ) \ |
| anhtran | 0:e9fd5575b10e | 1954 | ( (uint16_t)( ( (uint_fast32_t)*(volatile const uint16_t*) (RegisterValueAddress) \ |
| anhtran | 0:e9fd5575b10e | 1955 | & (uint_fast16_t)(Mask) ) >> (Shift) ) ) |
| anhtran | 0:e9fd5575b10e | 1956 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 1957 | |
| anhtran | 0:e9fd5575b10e | 1958 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1959 | |
| anhtran | 0:e9fd5575b10e | 1960 | #else /* __QAC_ARM_H__ */ /* This code must be tested defined "__QAC_ARM_H__" */ |
| anhtran | 0:e9fd5575b10e | 1961 | |
| anhtran | 0:e9fd5575b10e | 1962 | /* This inline functions is not expanded on __CC_ARM 5.15 */ |
| anhtran | 0:e9fd5575b10e | 1963 | INLINE uint16_t R_OSPL_GET_FROM_16_BIT_REGISTER( volatile const uint16_t *const RegisterAddress, |
| anhtran | 0:e9fd5575b10e | 1964 | uint16_t const Mask, int_fast32_t const Shift ) |
| anhtran | 0:e9fd5575b10e | 1965 | { |
| anhtran | 0:e9fd5575b10e | 1966 | uint16_t reg_value; |
| anhtran | 0:e9fd5575b10e | 1967 | |
| anhtran | 0:e9fd5575b10e | 1968 | IF_DQ ( RegisterAddress == NULL ) { |
| anhtran | 0:e9fd5575b10e | 1969 | enum { num = 0xDEDE }; /* SEC M1.10.1 */ |
| anhtran | 0:e9fd5575b10e | 1970 | reg_value = num; |
| anhtran | 0:e9fd5575b10e | 1971 | } |
| anhtran | 0:e9fd5575b10e | 1972 | else { |
| anhtran | 0:e9fd5575b10e | 1973 | reg_value = *RegisterAddress; |
| anhtran | 0:e9fd5575b10e | 1974 | reg_value = (uint16_t)( ( (uint_fast32_t) reg_value & (uint_fast32_t) Mask ) >> Shift ); |
| anhtran | 0:e9fd5575b10e | 1975 | /* Cast is for SEC R2.4.2 */ |
| anhtran | 0:e9fd5575b10e | 1976 | } |
| anhtran | 0:e9fd5575b10e | 1977 | return reg_value; |
| anhtran | 0:e9fd5575b10e | 1978 | } |
| anhtran | 0:e9fd5575b10e | 1979 | |
| anhtran | 0:e9fd5575b10e | 1980 | #endif |
| anhtran | 0:e9fd5575b10e | 1981 | |
| anhtran | 0:e9fd5575b10e | 1982 | |
| anhtran | 0:e9fd5575b10e | 1983 | /** |
| anhtran | 0:e9fd5575b10e | 1984 | * @brief Reads for bit field of 8bit register. |
| anhtran | 0:e9fd5575b10e | 1985 | * |
| anhtran | 0:e9fd5575b10e | 1986 | * @param RegisterValueAddress Address of accessing register |
| anhtran | 0:e9fd5575b10e | 1987 | * @param Mask Mask of accessing bit field |
| anhtran | 0:e9fd5575b10e | 1988 | * @param Shift Shift count. Lowest bit number |
| anhtran | 0:e9fd5575b10e | 1989 | * @return Read value after shift |
| anhtran | 0:e9fd5575b10e | 1990 | */ |
| anhtran | 0:e9fd5575b10e | 1991 | #if R_OSPL_BIT_FIELD_ACCESS_MACRO |
| anhtran | 0:e9fd5575b10e | 1992 | |
| anhtran | 0:e9fd5575b10e | 1993 | /* ->SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 1994 | /* Volatile access at &(get address), cast and *(memory load). But this is not double volatile access. */ |
| anhtran | 0:e9fd5575b10e | 1995 | /* RegisterValueAddress is for avoid QAC-0310,QAC-3345 by cast code at caller. */ |
| anhtran | 0:e9fd5575b10e | 1996 | |
| anhtran | 0:e9fd5575b10e | 1997 | #define R_OSPL_GET_FROM_8_BIT_REGISTER( RegisterValueAddress, Mask, Shift ) \ |
| anhtran | 0:e9fd5575b10e | 1998 | ( (uint8_t)( ( (uint_fast32_t)*(volatile const uint8_t*) (RegisterValueAddress) \ |
| anhtran | 0:e9fd5575b10e | 1999 | & (uint_fast8_t)(Mask) ) >> (Shift) ) ) |
| anhtran | 0:e9fd5575b10e | 2000 | /* This code is optimized well. */ |
| anhtran | 0:e9fd5575b10e | 2001 | |
| anhtran | 0:e9fd5575b10e | 2002 | /* <-SEC R3.6.2(QAC-3345) */ |
| anhtran | 0:e9fd5575b10e | 2003 | |
| anhtran | 0:e9fd5575b10e | 2004 | #else /* __QAC_ARM_H__ */ /* This code must be tested defined "__QAC_ARM_H__" */ |
| anhtran | 0:e9fd5575b10e | 2005 | |
| anhtran | 0:e9fd5575b10e | 2006 | /* This inline functions is not expanded on __CC_ARM 5.15 */ |
| anhtran | 0:e9fd5575b10e | 2007 | INLINE uint8_t R_OSPL_GET_FROM_8_BIT_REGISTER( volatile const uint8_t *const RegisterAddress, |
| anhtran | 0:e9fd5575b10e | 2008 | uint8_t const Mask, int_fast32_t const Shift ) |
| anhtran | 0:e9fd5575b10e | 2009 | { |
| anhtran | 0:e9fd5575b10e | 2010 | uint8_t reg_value; |
| anhtran | 0:e9fd5575b10e | 2011 | |
| anhtran | 0:e9fd5575b10e | 2012 | IF_DQ ( RegisterAddress == NULL ) { |
| anhtran | 0:e9fd5575b10e | 2013 | enum { num = 0xDE }; /* SEC M1.10.1 */ |
| anhtran | 0:e9fd5575b10e | 2014 | reg_value = num; |
| anhtran | 0:e9fd5575b10e | 2015 | } |
| anhtran | 0:e9fd5575b10e | 2016 | else { |
| anhtran | 0:e9fd5575b10e | 2017 | reg_value = *RegisterAddress; |
| anhtran | 0:e9fd5575b10e | 2018 | reg_value = (uint8_t)( ( (uint_fast32_t) reg_value & (uint_fast32_t) Mask ) >> Shift ); |
| anhtran | 0:e9fd5575b10e | 2019 | /* Cast is for SEC R2.4.2 */ |
| anhtran | 0:e9fd5575b10e | 2020 | } |
| anhtran | 0:e9fd5575b10e | 2021 | return reg_value; |
| anhtran | 0:e9fd5575b10e | 2022 | } |
| anhtran | 0:e9fd5575b10e | 2023 | |
| anhtran | 0:e9fd5575b10e | 2024 | #endif |
| anhtran | 0:e9fd5575b10e | 2025 | |
| anhtran | 0:e9fd5575b10e | 2026 | |
| anhtran | 0:e9fd5575b10e | 2027 | /*********************************************************************** |
| anhtran | 0:e9fd5575b10e | 2028 | * End of File: |
| anhtran | 0:e9fd5575b10e | 2029 | ************************************************************************/ |
| anhtran | 0:e9fd5575b10e | 2030 | |
| anhtran | 0:e9fd5575b10e | 2031 | #ifdef __cplusplus |
| anhtran | 0:e9fd5575b10e | 2032 | } /* extern "C" */ |
| anhtran | 0:e9fd5575b10e | 2033 | #endif /* __cplusplus */ |
| anhtran | 0:e9fd5575b10e | 2034 | |
| anhtran | 0:e9fd5575b10e | 2035 | #endif /* R_OSPL_H */ |
| anhtran | 0:e9fd5575b10e | 2036 |