Nordic stack and drivers for the mbed BLE API
Dependents: Sensen-classic-v8-IAQ_copy_4
Fork of nRF51822 by
Diff: TARGET_MCU_NRF51822/sdk/source/libraries/experimental_section_vars/section_vars.h
- Revision:
- 638:c90ae1400bf2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TARGET_MCU_NRF51822/sdk/source/libraries/experimental_section_vars/section_vars.h Wed Sep 14 14:39:43 2016 +0100 @@ -0,0 +1,323 @@ +/* + * Copyright (c) Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef SECTION_VARS_H__ +#define SECTION_VARS_H__ + +#include "app_util.h" + +#if defined __ICC_ARM__ + +// turn on language extensions for iar +#pragma language=extended + +#endif + +/** + * @defgroup section_vars Section variables + * @ingroup app_common + * @{ + * @brief Section variables. + */ + +/**@brief Macro to delay macro expression of pragma + * + */ +#define NRF_PRAGMA(x) _Pragma(#x) + + +/**@brief Macro to register section by name in code + * + * @param[in] section_name Name of the section to register + **/ +#if defined __CC_ARM + +// Not required by this compiler +#define NRF_SECTION_VARS_REGISTER_SECTION(section_name) + +#elif defined __GNUC__ + +// Not required by this compiler +#define NRF_SECTION_VARS_REGISTER_SECTION(section_name) + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_REGISTER_SECTION(section_name) NRF_PRAGMA(section = ## #section_name ) + +#else + +#error TODO + +#endif + +/*lint -save -e27 */ + +/**@brief Macro for accessing start of a named data section by symbol + * + * @details The symbol that this macro resolves to is used to access the section + * by start address. + * + * @param[in] section_name Name of the section + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_START_SYMBOL(section_name) section_name ## $$Base + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_START_SYMBOL(section_name) __start_ ## section_name + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_START_SYMBOL(section_name) __section_begin(#section_name) + +#else + +#error TODO + +#endif + + +/**@brief Macro for accessing end of a named data section by symbol + * + * @details The symbol that this macro resolves to is used to access the section + * by end address. + * + * @param[in] section_name Name of the section + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_END_SYMBOL(section_name) section_name ## $$Limit + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_END_SYMBOL(section_name) __stop_ ## section_name + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_END_SYMBOL(section_name) __section_end(#section_name) + +#endif + +/*lint -restore */ + + +/**@brief Macro for accessing Length of a named section + * + * @details This macro is used to get the size of a named section. + * + * @param[in] section_name Name of the section + */ + +#if defined __CC_ARM + +#define NRF_SECTION_VARS_LENGTH(section_name) \ + ((uint32_t)&NRF_SECTION_VARS_END_SYMBOL(section_name) - (uint32_t)&NRF_SECTION_VARS_START_SYMBOL(section_name)) + +#elif defined __GNUC__ + + #define NRF_SECTION_VARS_LENGTH(section_name) \ + ((uint32_t)&NRF_SECTION_VARS_END_SYMBOL(section_name) - (uint32_t)&NRF_SECTION_VARS_START_SYMBOL(section_name)) + +#elif defined __ICCARM__ + + #define NRF_SECTION_VARS_LENGTH(section_name) \ + ((uint32_t)NRF_SECTION_VARS_END_SYMBOL(section_name) - (uint32_t)NRF_SECTION_VARS_START_SYMBOL(section_name)) + +#else + +#error TODO + +#endif + + +/**@brief Macro for accessing the start address of a named section + * + * param[in] section_name Name of the section to get the start address from + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_START_ADDR(section_name) (uint32_t)&NRF_SECTION_VARS_START_SYMBOL(section_name) + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_START_ADDR(section_name) (uint32_t)&NRF_SECTION_VARS_START_SYMBOL(section_name) + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_START_ADDR(section_name) (uint32_t)iar_ ## section_name ## _start + +#else + +#error TODO + +#endif + + +/*@brief Macro for accessing the end address of a named section + * + * @param[in] section_name Name of the section to get end address from + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_END_ADDR(section_name) (uint32_t)&NRF_SECTION_VARS_END_SYMBOL(section_name) + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_END_ADDR(section_name) (uint32_t)&NRF_SECTION_VARS_END_SYMBOL(section_name) + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_END_ADDR(section_name) (uint32_t)iar_ ## section_name ## _end + +#else + +#error TODO + +#endif + + +/**@brief Macro for declaring symbols for named sections + * + * @note These external declarations of section specific symbols are required for the linker in GCC and Keil (not IAR) + * + * @param[in] type_name Name of the type stored in the section + * @param[in] section_name Name of the section + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_REGISTER_SYMBOLS(type_name, section_name) \ + extern type_name* NRF_SECTION_VARS_START_SYMBOL(section_name); \ + extern void* NRF_SECTION_VARS_END_SYMBOL(section_name) + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_REGISTER_SYMBOLS(type_name, section_name) \ + extern type_name* NRF_SECTION_VARS_START_SYMBOL(section_name); \ + extern void* NRF_SECTION_VARS_END_SYMBOL(section_name) + +#elif defined __ICCARM__ + +// No symbol registration required for IAR +#define NRF_SECTION_VARS_REGISTER_SYMBOLS(type_name, section_name) \ + extern void* iar_ ## section_name ## _start = __section_begin(#section_name); \ + extern void* iar_ ## section_name ## _end = __section_end(#section_name) + +#else + +#error TODO + +#endif + + +/**@brief Macro to add symbols to a named section + * + * @details The symbols are placed in a named section. All calls to this macro + * will result in symbols being placed in a contiguous manner in the named section. + * This macro ensures that the symbol is not removed because of optimization level. + * + * @warning There is no guarantee for ordering of placement. If ordering is required + * + * @warning The symbols added in the named section must be word aligned to + * ensure that compilers do not pad the section during symbol placement. + * + * @param[in] section_name Name of the section + * @param[in] type_def Datatype of the symbol to place in the given section + */ +#if defined __CC_ARM + +#define NRF_SECTION_VARS_ADD(section_name, type_def) \ + static type_def __attribute__((section( #section_name ))) __attribute__((used)) + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_ADD(section_name, type_def) \ + static type_def __attribute__ ((section( #section_name ))) __attribute__ ((used)) + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_ADD(section_name, type_def) \ + __root type_def @ #section_name + +#else + +#error TODO + +#endif + + +/**@brief Macro to get symbol from named section + * + * @warning The stored symbol can only be resolved using this macro if the + * type of the data is word aligned. The operation of acquiring + * the stored symbol relies on sizeof of the stored type, no + * padding can exist in the named section in between individual + * stored items or this macro will fail. + * + * @param[in] i Index of item in section + * @param[in] type_name Type name of item in section + * @param[in] section_name Name of the section + */ + +#if defined __CC_ARM + +#define NRF_SECTION_VARS_GET(i, type_name, section_name) \ + (type_name*)(NRF_SECTION_VARS_START_ADDR(section_name) + i * sizeof(type_name)) + +#elif defined __GNUC__ + +#define NRF_SECTION_VARS_GET(i, type_name, section_name) \ + (type_name*)(NRF_SECTION_VARS_START_ADDR(section_name) + i * sizeof(type_name)) + +#elif defined __ICCARM__ + +#define NRF_SECTION_VARS_GET(i, type_name, section_name) \ + (type_name*)iar_ ## section_name ## _start + (i * sizeof(type_name)) + +#else + +#error TODO + +#endif + + +/**@brief Macro to get number of items in named section + * + * @param[in] type_name Type name of item in section + * @param[in] section_name Name of the section + */ +#define NRF_SECTION_VARS_COUNT(type_name, section_name) \ + NRF_SECTION_VARS_LENGTH(section_name) / sizeof(type_name) + +/** @} */ + +#endif // SECTION_VARS_H__