|
|
/* ----------------------------------------------------------------------------
|
|
|
* Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved.
|
|
|
* Description: Basic definitions
|
|
|
* Author: Huawei LiteOS Team
|
|
|
* Create: 2013-01-01
|
|
|
* 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 the copyright holder nor the names of its contributors 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.
|
|
|
* --------------------------------------------------------------------------- */
|
|
|
|
|
|
/**
|
|
|
* @defgroup kernel Kernel
|
|
|
* @defgroup los_base Basic definitions
|
|
|
* @ingroup kernel
|
|
|
*/
|
|
|
|
|
|
#ifndef _LOS_BASE_H
|
|
|
#define _LOS_BASE_H
|
|
|
|
|
|
#include "los_builddef.h"
|
|
|
#include "los_typedef.h"
|
|
|
#include "los_config.h"
|
|
|
#include "los_printf.h"
|
|
|
#include "los_list.h"
|
|
|
#include "los_err.h"
|
|
|
#include "los_errno.h"
|
|
|
#include "los_hw.h"
|
|
|
#include "los_tick.h"
|
|
|
#include "securec.h"
|
|
|
#ifdef LOSCFG_LIB_LIBCMINI
|
|
|
#include "stdarg.h"
|
|
|
#endif
|
|
|
#ifdef __cplusplus
|
|
|
#if __cplusplus
|
|
|
extern "C" {
|
|
|
#endif /* __cplusplus */
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Assertion.
|
|
|
*
|
|
|
* @par Description:
|
|
|
* When the program runs to the assertion position, the corresponding expression should
|
|
|
* be true. If the expression is not true, the program stops running and gives an error
|
|
|
* message. The LOS_ASSERT_COND function is same with #LOS_ASSERT function.
|
|
|
*
|
|
|
* @attention
|
|
|
* The function is effective only LOSCFG_DEBUG_VERSION is defined.
|
|
|
*
|
|
|
* @param expression [IN] The judgement expression of the assertion.
|
|
|
*
|
|
|
* @retval None.
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see LOS_ASSERT
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
#define LOS_ASSERT_COND(expression) LOS_ASSERT(expression)
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>꺯<EFBFBD><EABAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>ʽ<EFBFBD><CABD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ΪLOS_ASSERT<52>ĺ꺯<C4BA><EABAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱִ<CAB1>ж<EFBFBD><D0B6>ԡ<EFBFBD>
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* Define the timeout interval as LOS_NO_WAIT.
|
|
|
*/
|
|
|
#define LOS_NO_WAIT 0
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾһ<CABE><D2BB><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD>
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* Define the timeout interval as LOS_WAIT_FOREVER.
|
|
|
*/
|
|
|
#define LOS_WAIT_FOREVER 0xFFFFFFFF
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0xFFFFFFFF<46><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾһ<CABE><D2BB><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Զ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><DFB1>жϡ<D0B6>
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Align the value (addr) by some bytes (boundary).
|
|
|
*
|
|
|
* @par Description:
|
|
|
* Align the beginning of the object with the base address, with boundary bytes being
|
|
|
* the smallest unit of alignment. The ALIGN function is same with #LOS_Align function.
|
|
|
*
|
|
|
* @attention
|
|
|
* <ul>
|
|
|
* <li>the value of boundary usually is 4,8,16,32.</li>
|
|
|
* <li>users should avoid overflows due to alignment.</li>
|
|
|
* </ul>
|
|
|
*
|
|
|
* @param addr [IN] Type #UINTPTR The address you want to align.
|
|
|
* @param boundary [IN] Type #UINT32 The alignment size.
|
|
|
*
|
|
|
* @retval #UINTPTR The address which have been aligned.
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see LOS_Align | TRUNCATE
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
#ifndef ALIGN//<2F>ж<EFBFBD>ALIGN<47>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>롣
|
|
|
#define ALIGN(addr, boundary) LOS_Align(addr, boundary)//<2F>ֱ<EFBFBD><D6B1><EFBFBD>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>߽硣<DFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LOS_Align<67><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>addr<64><72>ַ<EFBFBD><D6B7><EFBFBD>϶<EFBFBD><CFB6>뵽<EFBFBD><EBB5BD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>boundary<72>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Align the value (addr) by some bytes (size).
|
|
|
*
|
|
|
* @par Description:
|
|
|
* Align the tail of the object with the base address, with size bytes being the
|
|
|
* smallest unit of alignment.
|
|
|
*
|
|
|
* @attention
|
|
|
* <ul>
|
|
|
* <li>the value of size usually is 4,8,16,32.</li>
|
|
|
* <li>users should avoid overflows due to alignment.</li>
|
|
|
* </ul>
|
|
|
*
|
|
|
* @param addr [IN] Type #UINTPTR The address you want to align.
|
|
|
* @param size [IN] Type #UINT32 The alignment size.
|
|
|
*
|
|
|
* @retval #UINTPTR The address which have been aligned.
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see LOS_Align | ALIGN
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
#define TRUNCATE(addr, size) ((UINTPTR)(addr) & ~((size) - 1))
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> addr <20><> size<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ضϺ<D8B6><CFBA>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>ú꽫<C3BA><EABDAB>ַ addr <20><><EFBFBD><EFBFBD> size <20>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ж<EFBFBD><D0B6>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ϊ<EFBFBD>㡣<EFBFBD><E3A1A3><EFBFBD>磬<EFBFBD><E7A3AC><EFBFBD><EFBFBD> addr <20><> 0x12345678<37><38>size <20><> 4<><34><EFBFBD><EFBFBD><EFBFBD>ضϺ<D8B6><CFBA>ĵ<EFBFBD>ַ<EFBFBD><D6B7> 0x12345670<37><30>
|
|
|
/**
|
|
|
* Read a UINT8 value from addr and stroed in value.
|
|
|
*/
|
|
|
/*READ_UINT8(value, addr)<29><>READ_UINT16(value, addr) <20><> READ_UINT32(value, addr)
|
|
|
<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴӵ<EFBFBD>ַ addr <20>ж<EFBFBD>ȡ 8 λ<><CEBB>16 λ<><CEBB> 32 λ<><CEBB><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> value <20>С<EFBFBD><D0A1>⼸<EFBFBD><E2BCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ƣ<EFBFBD>
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD>ȡ<EFBFBD>ڴ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> dsb() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>dsb() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
|
|
|
<EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>һ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
#define READ_UINT8(value, addr) ({ (value) = *((volatile UINT8 *)((UINTPTR)(addr))); dsb(); })
|
|
|
|
|
|
/**
|
|
|
* Read a UINT16 value from addr and stroed in addr.
|
|
|
*/
|
|
|
#define READ_UINT16(value, addr) ({ (value) = *((volatile UINT16 *)((UINTPTR)(addr))); dsb(); })
|
|
|
|
|
|
/**
|
|
|
* Read a UINT32 value from addr and stroed in value.
|
|
|
*/
|
|
|
#define READ_UINT32(value, addr) ({ (value) = *((volatile UINT32 *)((UINTPTR)(addr))); dsb(); })
|
|
|
|
|
|
|
|
|
//<2F>жϱ<D0B6><CFB1>뻷<EFBFBD><EBBBB7><EFBFBD>Ƿ<EFBFBD>Ϊ 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> READ_UINT64 <20><> WRITE_UINT64 <20>ꡣ<EFBFBD><EAA1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꽫<EFBFBD><EABDAB><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴӵ<DAB4>ַ addr <20>ж<EFBFBD>ȡһ<C8A1><D2BB> 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> value <20>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>˺<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ƵIJ<C6B5><C4B2><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD>ȡ<EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> dsb() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
#ifdef __LP64__
|
|
|
/**
|
|
|
* Read a UINT64 value from addr and stroed in value.
|
|
|
*/
|
|
|
#define READ_UINT64(value, addr) ({ (value) = *((volatile UINT64 *)((UINTPTR)(addr))); dsb(); })
|
|
|
#endif
|
|
|
|
|
|
|
|
|
/*WRITE_UINT8(value, addr)<29><>WRITE_UINT16(value, addr) <20><> WRITE_UINT32(value, addr) <20><>
|
|
|
<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> 8 λ<><CEBB>16 λ<><CEBB> 32 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ value д<>뵽<EFBFBD><EBB5BD>ַ addr <20>С<EFBFBD>
|
|
|
<EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD>Ҳʹ<EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD>ƵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> dsb() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>е<EFBFBD>ֵ<EFBFBD><EFBFBD>*/
|
|
|
/**
|
|
|
* Write a UINT8 value to addr.
|
|
|
*/
|
|
|
#define WRITE_UINT8(value, addr) ({ dsb(); *((volatile UINT8 *)((UINTPTR)(addr))) = (value); })
|
|
|
|
|
|
/**
|
|
|
* Write a UINT16 value to addr.
|
|
|
*/
|
|
|
#define WRITE_UINT16(value, addr) ({ dsb(); *((volatile UINT16 *)((UINTPTR)(addr))) = (value); })
|
|
|
|
|
|
/**
|
|
|
* Write a UINT32 value to addr.
|
|
|
*/
|
|
|
#define WRITE_UINT32(value, addr) ({ dsb(); *((volatile UINT32 *)((UINTPTR)(addr))) = (value); })
|
|
|
|
|
|
|
|
|
//<2F><> 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WRITE_UINT64 <20>꣬<EFBFBD><EAA3AC><EFBFBD>ڽ<EFBFBD> 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ value д<>뵽<EFBFBD><EBB5BD>ַ addr <20>С<EFBFBD>
|
|
|
#ifdef __LP64__
|
|
|
/**
|
|
|
* Write a UINT64 addr to addr.
|
|
|
*/
|
|
|
#define WRITE_UINT64(value, addr) ({ dsb(); *((volatile UINT64 *)((UINTPTR)(addr))) = (value); })
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
* Get a UINT8 value from addr.
|
|
|
*/
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴӵ<DAB4>ַ addr <20>ж<EFBFBD>ȡһ<C8A1><D2BB> 8 λ<><CEBB><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ȡ֮<C8A1><D6AE><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> dsb() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
|
|
|
#define GET_UINT8(addr) ({ UINT8 r = *((volatile UINT8 *)((UINTPTR)(addr))); dsb(); r; })
|
|
|
|
|
|
/**
|
|
|
* Get a UINT16 value from addr.
|
|
|
*/
|
|
|
//GET_UINT16(addr) <20><> GET_UINT32(addr) <20><><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>ڴӵ<DAB4>ַ addr <20>ж<EFBFBD>ȡ 16 λ<><CEBB> 32 λ<><CEBB><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>أ<EFBFBD><D8A3>ڶ<EFBFBD>ȡ֮<C8A1><D6AE>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
#define GET_UINT16(addr) ({ UINT16 r = *((volatile UINT16 *)((UINTPTR)(addr))); dsb(); r; })
|
|
|
|
|
|
/**
|
|
|
* Get a UINT32 value from addr.
|
|
|
*/
|
|
|
#define GET_UINT32(addr) ({ UINT32 r = *((volatile UINT32 *)((UINTPTR)(addr))); dsb(); r; })
|
|
|
|
|
|
|
|
|
//<2F><> 64 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GET_UINT64(addr) <20>꣬<EFBFBD><EAA3AC><EFBFBD>ڴӵ<DAB4>ַ addr <20>ж<EFBFBD>ȡһ<C8A1><D2BB> 64 λ<><CEBB><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
#ifdef __LP64__
|
|
|
/**
|
|
|
* Get a UINT64 value from addr.
|
|
|
*/
|
|
|
#define GET_UINT64(addr) ({ UINT64 r = *((volatile UINT64 *)((UINTPTR)(addr))); dsb(); r; })
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Assertion.
|
|
|
*
|
|
|
* @par Description:
|
|
|
* When the program runs to the assertion position, the corresponding expression should
|
|
|
* be true. If the expression is not true, the program stops running and gives an error
|
|
|
* message. The function is same with #LOS_ASSERT_COND function.
|
|
|
*
|
|
|
* @attention
|
|
|
* The function is effective only LOSCFG_DEBUG_VERSION is defined.
|
|
|
*
|
|
|
* @param judge [IN] The judgement expression of the assertion.
|
|
|
*
|
|
|
* @retval None.
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see LOS_ASSERT_COND
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
#ifdef LOSCFG_DEBUG_VERSION//<2F><><EFBFBD>ȣ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> #ifdef LOSCFG_DEBUG_VERSION <20><><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>汾<D4B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LOSCFG_DEBUG_VERSION <20>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ڵ<EFBFBD><DAB5>汾<D4B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #ifdef <20><> #endif ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2A3ACB4><EFBFBD><EFBFBD><EFBFBD> #else <20><> #endif ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|
|
#define LOS_ASSERT(judge) do { \
|
|
|
if ((UINTPTR)(judge) == 0) { \
|
|
|
(VOID)LOS_IntLock(); \
|
|
|
PRINT_ERR("ASSERT ERROR! %s, %d, %s\n", __FILE__, __LINE__, __FUNCTION__); \
|
|
|
while (1) {} \
|
|
|
} \
|
|
|
} while (0)
|
|
|
//<2F>ڵ<EFBFBD><DAB5>汾<D4B0>£<EFBFBD><C2A3>궨<EFBFBD><EAB6A8><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>LOS_ASSERT <20>걻<EFBFBD><EAB1BB><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD> judge <20>ĺ꺯<C4BA><EABAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD>ж<EFBFBD><D0B6>Լ<EFBFBD><D4BC>飬<EFBFBD><E9A3AC><EFBFBD><EFBFBD> judge <20><><EFBFBD><EFBFBD>ʽ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>Ϊ<EFBFBD>㣨<EFBFBD><E3A3A8><EFBFBD>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>
|
|
|
//<2F><><EFBFBD><EFBFBD> LOS_IntLock() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD>ֹ<EFBFBD>жϵIJ<CFB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>ʧ<EFBFBD><CAA7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
//ʹ<><CAB9> PRINT_ERR <20><>ӡһ<D3A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кźͺ<C5BA><CDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD> while (1)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һֱͣ<D6B1><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>С<EFBFBD>
|
|
|
#else
|
|
|
#define LOS_ASSERT(judge)//<2F>ڷǵ<DAB7><C7B5>汾<D4B0>£<EFBFBD><C2A3>궨<EFBFBD><EAB6A8><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>LOS_ASSERT <20>걻<EFBFBD><EAB1BB><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κβ<CEBA><CEB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Align the address (addr) by some bytes (boundary) you specify.
|
|
|
*
|
|
|
* @par Description:
|
|
|
* This API is used to align the address (addr) by some bytes (boundary) you specify.
|
|
|
*
|
|
|
* @attention
|
|
|
* <ul>
|
|
|
* <li>the value of boundary usually is 4,8,16,32.</li>
|
|
|
* <li>users should avoid overflows due to alignment.</li>
|
|
|
* </ul>
|
|
|
*
|
|
|
* @param addr [IN] Type #UINTPTR The address you want to align.
|
|
|
* @param boundary [IN] Type #UINT32 The alignment size.
|
|
|
*
|
|
|
* @retval #UINTPTR The address which have been aligned.
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see ALIGN | TRUNCATE
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
extern UINTPTR LOS_Align(UINTPTR addr, UINT32 boundary);
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD>ǽ<EFBFBD> addr <20><><EFBFBD><EFBFBD> boundary <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>磬<EFBFBD><E7A3AC><EFBFBD><EFBFBD> addr <20><> 12<31><32>boundary <20><> 8<><38><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> 16<31><36>
|
|
|
//extern <20>ؼ<EFBFBD><D8BC>ֱ<EFBFBD>ʾ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʹ<EFBFBD>øú<C3B8><C3BA><EFBFBD>ʱ<EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ʵ<EFBFBD>֡<EFBFBD>
|
|
|
/**
|
|
|
* @ingroup los_base
|
|
|
* @brief Sleep the current task.
|
|
|
*
|
|
|
* @par Description:
|
|
|
* This API is used to delay the execution of the current task. The task is able to be scheduled after it is delayed
|
|
|
* for a specified milliseconds.
|
|
|
*
|
|
|
* @attention
|
|
|
* <ul>
|
|
|
* <li>The task fails to be delayed if it is being delayed during interrupt processing or it is locked.</li>
|
|
|
* <li>If 0 is passed in and the task scheduling is not locked, execute the next task in the queue of tasks with the
|
|
|
* priority of the current task.
|
|
|
* If no ready task with the priority of the current task is available, the task scheduling will not occur, and the
|
|
|
* current task continues to be executed.</li>
|
|
|
* <li>The parameter passed in can not be equal to LOS_WAIT_FOREVER(0xFFFFFFFF).
|
|
|
* If that happens, the task will not sleep 0xFFFFFFFF milliseconds or sleep forever but sleep 0xFFFFFFFF Ticks.</li>
|
|
|
* <li>This API is not an accurate delay function. The actual delay time is longer than that of parameter msecs.</li>
|
|
|
* </ul>
|
|
|
*
|
|
|
* @param msecs [IN] Type #UINT32 Milliseconds for which the task is delayed.
|
|
|
*
|
|
|
* @retval None
|
|
|
* @par Dependency:
|
|
|
* <ul><li>los_base.h: the header file that contains the API declaration.</li></ul>
|
|
|
* @see LOS_Mdelay | LOS_TaskDelay
|
|
|
* @since Huawei LiteOS V100R001C00
|
|
|
*/
|
|
|
extern VOID LOS_Msleep(UINT32 msecs);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
#if __cplusplus
|
|
|
}
|
|
|
#endif /* __cplusplus */
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#endif /* _LOS_BASE_H */
|