Anh Tran / Mbed OS GR-Boards_WebCamera

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

UserRevisionLine numberNew 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