Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of nRF51822 by
nordic-sdk/components/libraries/util/app_util_platform.h@345:dfde56236c36, 2015-06-19 (annotated)
- Committer:
- rgrover1
- Date:
- Fri Jun 19 15:55:35 2015 +0100
- Revision:
- 345:dfde56236c36
- Parent:
- 343:6675661fa600
- Child:
- 346:14b090482fd2
Synchronized with git rev fbfc6d16
Author: Andrew Fernandes
Fix various GCC compilation issues.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| rgrover1 | 345:dfde56236c36 | 1 | /* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved. |
| rgrover1 | 345:dfde56236c36 | 2 | * |
| rgrover1 | 345:dfde56236c36 | 3 | * The information contained herein is property of Nordic Semiconductor ASA. |
| rgrover1 | 345:dfde56236c36 | 4 | * Terms and conditions of usage are described in detail in NORDIC |
| rgrover1 | 345:dfde56236c36 | 5 | * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. |
| rgrover1 | 345:dfde56236c36 | 6 | * |
| rgrover1 | 345:dfde56236c36 | 7 | * Licensees are granted free, non-transferable use of the information. NO |
| rgrover1 | 345:dfde56236c36 | 8 | * WARRANTY of ANY KIND is provided. This heading must NOT be removed from |
| rgrover1 | 345:dfde56236c36 | 9 | * the file. |
| rgrover1 | 345:dfde56236c36 | 10 | * |
| rgrover1 | 345:dfde56236c36 | 11 | */ |
| rgrover1 | 345:dfde56236c36 | 12 | |
| rgrover1 | 345:dfde56236c36 | 13 | /**@file |
| rgrover1 | 345:dfde56236c36 | 14 | * |
| rgrover1 | 345:dfde56236c36 | 15 | * @defgroup app_util_platform Utility Functions and Definitions (Platform) |
| rgrover1 | 345:dfde56236c36 | 16 | * @{ |
| rgrover1 | 345:dfde56236c36 | 17 | * @ingroup app_common |
| rgrover1 | 345:dfde56236c36 | 18 | * |
| rgrover1 | 345:dfde56236c36 | 19 | * @brief Various types and definitions available to all applications when using SoftDevice. |
| rgrover1 | 345:dfde56236c36 | 20 | */ |
| rgrover1 | 345:dfde56236c36 | 21 | |
| rgrover1 | 345:dfde56236c36 | 22 | #ifndef APP_UTIL_PLATFORM_H__ |
| rgrover1 | 345:dfde56236c36 | 23 | #define APP_UTIL_PLATFORM_H__ |
| rgrover1 | 345:dfde56236c36 | 24 | |
| rgrover1 | 345:dfde56236c36 | 25 | #include <stdint.h> |
| rgrover1 | 345:dfde56236c36 | 26 | #include "compiler_abstraction.h" |
| rgrover1 | 345:dfde56236c36 | 27 | #include "nrf51.h" |
| rgrover1 | 345:dfde56236c36 | 28 | #ifdef SOFTDEVICE_PRESENT |
| rgrover1 | 345:dfde56236c36 | 29 | #include "nrf_soc.h" |
| rgrover1 | 345:dfde56236c36 | 30 | #include "app_error.h" |
| rgrover1 | 345:dfde56236c36 | 31 | #endif |
| rgrover1 | 345:dfde56236c36 | 32 | /**@brief The interrupt priorities available to the application while the SoftDevice is active. */ |
| rgrover1 | 345:dfde56236c36 | 33 | typedef enum |
| rgrover1 | 345:dfde56236c36 | 34 | { |
| rgrover1 | 345:dfde56236c36 | 35 | #ifndef SOFTDEVICE_PRESENT |
| rgrover1 | 345:dfde56236c36 | 36 | APP_IRQ_PRIORITY_HIGHEST = 0, |
| rgrover1 | 345:dfde56236c36 | 37 | #endif |
| rgrover1 | 345:dfde56236c36 | 38 | APP_IRQ_PRIORITY_HIGH = 1, |
| rgrover1 | 345:dfde56236c36 | 39 | #ifndef SOFTDEVICE_PRESENT |
| rgrover1 | 345:dfde56236c36 | 40 | APP_IRQ_PRIORITY_MID = 2, |
| rgrover1 | 345:dfde56236c36 | 41 | #endif |
| rgrover1 | 345:dfde56236c36 | 42 | APP_IRQ_PRIORITY_LOW = 3 |
| rgrover1 | 345:dfde56236c36 | 43 | } app_irq_priority_t; |
| rgrover1 | 345:dfde56236c36 | 44 | |
| rgrover1 | 345:dfde56236c36 | 45 | #define NRF_APP_PRIORITY_THREAD 4 /**< "Interrupt level" when running in Thread Mode. */ |
| rgrover1 | 345:dfde56236c36 | 46 | |
| rgrover1 | 345:dfde56236c36 | 47 | /**@cond NO_DOXYGEN */ |
| rgrover1 | 345:dfde56236c36 | 48 | #define EXTERNAL_INT_VECTOR_OFFSET 16 |
| rgrover1 | 345:dfde56236c36 | 49 | /**@endcond */ |
| rgrover1 | 345:dfde56236c36 | 50 | |
| rgrover1 | 345:dfde56236c36 | 51 | #define PACKED(TYPE) __packed TYPE |
| rgrover1 | 345:dfde56236c36 | 52 | |
| rgrover1 | 345:dfde56236c36 | 53 | void critical_region_enter (void); |
| rgrover1 | 345:dfde56236c36 | 54 | void critical_region_exit (void); |
| rgrover1 | 345:dfde56236c36 | 55 | |
| rgrover1 | 345:dfde56236c36 | 56 | /**@brief Macro for entering a critical region. |
| rgrover1 | 345:dfde56236c36 | 57 | * |
| rgrover1 | 345:dfde56236c36 | 58 | * @note Due to implementation details, there must exist one and only one call to |
| rgrover1 | 345:dfde56236c36 | 59 | * CRITICAL_REGION_EXIT() for each call to CRITICAL_REGION_ENTER(), and they must be located |
| rgrover1 | 345:dfde56236c36 | 60 | * in the same scope. |
| rgrover1 | 345:dfde56236c36 | 61 | */ |
| rgrover1 | 345:dfde56236c36 | 62 | #ifdef SOFTDEVICE_PRESENT |
| rgrover1 | 345:dfde56236c36 | 63 | #define CRITICAL_REGION_ENTER() \ |
| rgrover1 | 345:dfde56236c36 | 64 | { \ |
| rgrover1 | 345:dfde56236c36 | 65 | uint8_t IS_NESTED_CRITICAL_REGION = 0; \ |
| rgrover1 | 345:dfde56236c36 | 66 | uint32_t CURRENT_INT_PRI = current_int_priority_get(); \ |
| rgrover1 | 345:dfde56236c36 | 67 | if (CURRENT_INT_PRI != APP_IRQ_PRIORITY_HIGH) \ |
| rgrover1 | 345:dfde56236c36 | 68 | { \ |
| rgrover1 | 345:dfde56236c36 | 69 | uint32_t ERR_CODE = sd_nvic_critical_region_enter(&IS_NESTED_CRITICAL_REGION); \ |
| rgrover1 | 345:dfde56236c36 | 70 | if (ERR_CODE == NRF_ERROR_SOFTDEVICE_NOT_ENABLED) \ |
| rgrover1 | 345:dfde56236c36 | 71 | { \ |
| rgrover1 | 345:dfde56236c36 | 72 | __disable_irq(); \ |
| rgrover1 | 345:dfde56236c36 | 73 | } \ |
| rgrover1 | 345:dfde56236c36 | 74 | else \ |
| rgrover1 | 345:dfde56236c36 | 75 | { \ |
| rgrover1 | 345:dfde56236c36 | 76 | APP_ERROR_CHECK(ERR_CODE); \ |
| rgrover1 | 345:dfde56236c36 | 77 | } \ |
| rgrover1 | 345:dfde56236c36 | 78 | } |
| rgrover1 | 345:dfde56236c36 | 79 | #else |
| rgrover1 | 345:dfde56236c36 | 80 | #define CRITICAL_REGION_ENTER() critical_region_enter() |
| rgrover1 | 345:dfde56236c36 | 81 | #endif |
| rgrover1 | 345:dfde56236c36 | 82 | |
| rgrover1 | 345:dfde56236c36 | 83 | /**@brief Macro for leaving a critical region. |
| rgrover1 | 345:dfde56236c36 | 84 | * |
| rgrover1 | 345:dfde56236c36 | 85 | * @note Due to implementation details, there must exist one and only one call to |
| rgrover1 | 345:dfde56236c36 | 86 | * CRITICAL_REGION_EXIT() for each call to CRITICAL_REGION_ENTER(), and they must be located |
| rgrover1 | 345:dfde56236c36 | 87 | * in the same scope. |
| rgrover1 | 345:dfde56236c36 | 88 | */ |
| rgrover1 | 345:dfde56236c36 | 89 | #ifdef SOFTDEVICE_PRESENT |
| rgrover1 | 345:dfde56236c36 | 90 | #define CRITICAL_REGION_EXIT() \ |
| rgrover1 | 345:dfde56236c36 | 91 | if (CURRENT_INT_PRI != APP_IRQ_PRIORITY_HIGH) \ |
| rgrover1 | 345:dfde56236c36 | 92 | { \ |
| rgrover1 | 345:dfde56236c36 | 93 | uint32_t ERR_CODE; \ |
| rgrover1 | 345:dfde56236c36 | 94 | __enable_irq(); \ |
| rgrover1 | 345:dfde56236c36 | 95 | ERR_CODE = sd_nvic_critical_region_exit(IS_NESTED_CRITICAL_REGION); \ |
| rgrover1 | 345:dfde56236c36 | 96 | if (ERR_CODE != NRF_ERROR_SOFTDEVICE_NOT_ENABLED) \ |
| rgrover1 | 345:dfde56236c36 | 97 | { \ |
| rgrover1 | 345:dfde56236c36 | 98 | APP_ERROR_CHECK(ERR_CODE); \ |
| rgrover1 | 345:dfde56236c36 | 99 | } \ |
| rgrover1 | 345:dfde56236c36 | 100 | } \ |
| rgrover1 | 345:dfde56236c36 | 101 | } |
| rgrover1 | 345:dfde56236c36 | 102 | #else |
| rgrover1 | 345:dfde56236c36 | 103 | #define CRITICAL_REGION_EXIT() critical_region_exit() |
| rgrover1 | 345:dfde56236c36 | 104 | #endif |
| rgrover1 | 345:dfde56236c36 | 105 | |
| rgrover1 | 345:dfde56236c36 | 106 | /**@brief Function for finding the current interrupt level. |
| rgrover1 | 345:dfde56236c36 | 107 | * |
| rgrover1 | 345:dfde56236c36 | 108 | * @return Current interrupt level. |
| rgrover1 | 345:dfde56236c36 | 109 | * @retval APP_IRQ_PRIORITY_HIGH We are running in Application High interrupt level. |
| rgrover1 | 345:dfde56236c36 | 110 | * @retval APP_IRQ_PRIORITY_LOW We are running in Application Low interrupt level. |
| rgrover1 | 345:dfde56236c36 | 111 | * @retval APP_IRQ_PRIORITY_THREAD We are running in Thread Mode. |
| rgrover1 | 345:dfde56236c36 | 112 | */ |
| rgrover1 | 345:dfde56236c36 | 113 | static __INLINE uint8_t current_int_priority_get(void) |
| rgrover1 | 345:dfde56236c36 | 114 | { |
| rgrover1 | 345:dfde56236c36 | 115 | uint32_t isr_vector_num = (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk); |
| rgrover1 | 345:dfde56236c36 | 116 | if (isr_vector_num > 0) |
| rgrover1 | 345:dfde56236c36 | 117 | { |
| rgrover1 | 345:dfde56236c36 | 118 | int32_t irq_type = ((int32_t)isr_vector_num - EXTERNAL_INT_VECTOR_OFFSET); |
| rgrover1 | 345:dfde56236c36 | 119 | return (NVIC_GetPriority((IRQn_Type)irq_type) & 0xFF); |
| rgrover1 | 345:dfde56236c36 | 120 | } |
| rgrover1 | 345:dfde56236c36 | 121 | else |
| rgrover1 | 345:dfde56236c36 | 122 | { |
| rgrover1 | 345:dfde56236c36 | 123 | return NRF_APP_PRIORITY_THREAD; |
| rgrover1 | 345:dfde56236c36 | 124 | } |
| rgrover1 | 345:dfde56236c36 | 125 | } |
| rgrover1 | 345:dfde56236c36 | 126 | |
| rgrover1 | 345:dfde56236c36 | 127 | #endif // APP_UTIL_PLATFORM_H__ |
| rgrover1 | 345:dfde56236c36 | 128 | |
| rgrover1 | 345:dfde56236c36 | 129 | /** @} */ |
