mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-31 07:28:37 -04:00
Update version numbers in preparation for new release.
This commit is contained in:
parent
b4c3d91aff
commit
99d4f2c454
1451 changed files with 31767 additions and 11220 deletions
301
FreeRTOS-Plus/Source/Reliance-Edge/util/memory.c
Normal file
301
FreeRTOS-Plus/Source/Reliance-Edge/util/memory.c
Normal file
|
@ -0,0 +1,301 @@
|
|||
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
||||
|
||||
Copyright (c) 2014-2015 Datalight, Inc.
|
||||
All Rights Reserved Worldwide.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; use version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
/* Businesses and individuals that for commercial or other reasons cannot
|
||||
comply with the terms of the GPLv2 license may obtain a commercial license
|
||||
before incorporating Reliance Edge into proprietary software for
|
||||
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
||||
more information.
|
||||
*/
|
||||
/** @file
|
||||
@brief Default implementations of memory manipulation functions.
|
||||
|
||||
These implementations are intended to be small and simple, and thus forego
|
||||
all optimizations. If the C library is available, or if there are better
|
||||
third-party implementations available in the system, those can be used
|
||||
instead by defining the appropriate macros in redconf.h.
|
||||
|
||||
These functions are not intended to be completely 100% ANSI C compatible
|
||||
implementations, but rather are designed to meet the needs of Reliance Edge.
|
||||
The compatibility is close enough that ANSI C compatible implementations
|
||||
can be "dropped in" as replacements without difficulty.
|
||||
*/
|
||||
#include <redfs.h>
|
||||
|
||||
|
||||
#ifndef RedMemCpyUnchecked
|
||||
static void RedMemCpyUnchecked(void *pDest, const void *pSrc, uint32_t ulLen);
|
||||
#endif
|
||||
#ifndef RedMemMoveUnchecked
|
||||
static void RedMemMoveUnchecked(void *pDest, const void *pSrc, uint32_t ulLen);
|
||||
#endif
|
||||
#ifndef RedMemSetUnchecked
|
||||
static void RedMemSetUnchecked(void *pDest, uint8_t bVal, uint32_t ulLen);
|
||||
#endif
|
||||
#ifndef RedMemCmpUnchecked
|
||||
static int32_t RedMemCmpUnchecked(const void *pMem1, const void *pMem2, uint32_t ulLen);
|
||||
#endif
|
||||
|
||||
|
||||
/** @brief Copy memory from one address to another.
|
||||
|
||||
The source and destination memory buffers should not overlap. If the
|
||||
buffers overlap, use RedMemMove() instead.
|
||||
|
||||
@param pDest The destination buffer.
|
||||
@param pSrc The source buffer.
|
||||
@param ulLen The number of bytes to copy.
|
||||
*/
|
||||
void RedMemCpy(
|
||||
void *pDest,
|
||||
const void *pSrc,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
if((pDest == NULL) || (pSrc == NULL))
|
||||
{
|
||||
REDERROR();
|
||||
}
|
||||
else
|
||||
{
|
||||
RedMemCpyUnchecked(pDest, pSrc, ulLen);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef RedMemCpyUnchecked
|
||||
/** @brief Copy memory from one address to another.
|
||||
|
||||
This function should only be called from RedMemCpy().
|
||||
|
||||
@param pDest The destination buffer.
|
||||
@param pSrc The source buffer.
|
||||
@param ulLen The number of bytes to copy.
|
||||
*/
|
||||
static void RedMemCpyUnchecked(
|
||||
void *pDest,
|
||||
const void *pSrc,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
uint8_t *pbDest = CAST_VOID_PTR_TO_UINT8_PTR(pDest);
|
||||
const uint8_t *pbSrc = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pSrc);
|
||||
uint32_t ulIdx;
|
||||
|
||||
for(ulIdx = 0U; ulIdx < ulLen; ulIdx++)
|
||||
{
|
||||
pbDest[ulIdx] = pbSrc[ulIdx];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** @brief Move memory from one address to another.
|
||||
|
||||
Supports overlapping memory regions. If memory regions do not overlap, it
|
||||
is generally better to use RedMemCpy() instead.
|
||||
|
||||
@param pDest The destination buffer.
|
||||
@param pSrc The source buffer.
|
||||
@param ulLen The number of bytes to copy.
|
||||
*/
|
||||
void RedMemMove(
|
||||
void *pDest,
|
||||
const void *pSrc,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
if((pDest == NULL) || (pSrc == NULL))
|
||||
{
|
||||
REDERROR();
|
||||
}
|
||||
else
|
||||
{
|
||||
RedMemMoveUnchecked(pDest, pSrc, ulLen);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef RedMemMoveUnchecked
|
||||
/** @brief Move memory from one address to another.
|
||||
|
||||
This function should only be called from RedMemMove().
|
||||
|
||||
@param pDest The destination buffer.
|
||||
@param pSrc The source buffer.
|
||||
@param ulLen The number of bytes to copy.
|
||||
*/
|
||||
static void RedMemMoveUnchecked(
|
||||
void *pDest,
|
||||
const void *pSrc,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
uint8_t *pbDest = CAST_VOID_PTR_TO_UINT8_PTR(pDest);
|
||||
const uint8_t *pbSrc = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pSrc);
|
||||
uint32_t ulIdx;
|
||||
|
||||
if(MEMMOVE_MUST_COPY_FORWARD(pbDest, pbSrc))
|
||||
{
|
||||
/* If the destination is lower than the source with overlapping memory
|
||||
regions, we must copy from start to end in order to copy the memory
|
||||
correctly.
|
||||
|
||||
Don't use RedMemCpy() to do this. It is possible that RedMemCpy()
|
||||
has been replaced (even though this function has not been replaced)
|
||||
with an implementation that cannot handle any kind of buffer
|
||||
overlap.
|
||||
*/
|
||||
for(ulIdx = 0U; ulIdx < ulLen; ulIdx++)
|
||||
{
|
||||
pbDest[ulIdx] = pbSrc[ulIdx];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ulIdx = ulLen;
|
||||
|
||||
while(ulIdx > 0U)
|
||||
{
|
||||
ulIdx--;
|
||||
pbDest[ulIdx] = pbSrc[ulIdx];
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* RedMemMoveUnchecked */
|
||||
|
||||
|
||||
/** @brief Initialize a buffer with the specified byte value.
|
||||
|
||||
@param pDest The buffer to initialize.
|
||||
@param bVal The byte value with which to initialize @p pDest.
|
||||
@param ulLen The number of bytes to initialize.
|
||||
*/
|
||||
void RedMemSet(
|
||||
void *pDest,
|
||||
uint8_t bVal,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
if(pDest == NULL)
|
||||
{
|
||||
REDERROR();
|
||||
}
|
||||
else
|
||||
{
|
||||
RedMemSetUnchecked(pDest, bVal, ulLen);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef RedMemSetUnchecked
|
||||
/** @brief Initialize a buffer with the specified byte value.
|
||||
|
||||
This function should only be called from RedMemSet().
|
||||
|
||||
@param pDest The buffer to initialize.
|
||||
@param bVal The byte value with which to initialize @p pDest.
|
||||
@param ulLen The number of bytes to initialize.
|
||||
*/
|
||||
static void RedMemSetUnchecked(
|
||||
void *pDest,
|
||||
uint8_t bVal,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
uint8_t *pbDest = CAST_VOID_PTR_TO_UINT8_PTR(pDest);
|
||||
uint32_t ulIdx;
|
||||
|
||||
for(ulIdx = 0U; ulIdx < ulLen; ulIdx++)
|
||||
{
|
||||
pbDest[ulIdx] = bVal;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** @brief Compare the contents of two buffers.
|
||||
|
||||
@param pMem1 The first buffer to compare.
|
||||
@param pMem2 The second buffer to compare.
|
||||
@param ulLen The length to compare.
|
||||
|
||||
@return Zero if the two buffers are the same, otherwise nonzero.
|
||||
|
||||
@retval 0 @p pMem1 and @p pMem2 are the same.
|
||||
@retval 1 @p pMem1 is greater than @p pMem2, as determined by the
|
||||
values of the first differing bytes.
|
||||
@retval -1 @p pMem2 is greater than @p pMem1, as determined by the
|
||||
values of the first differing bytes.
|
||||
*/
|
||||
int32_t RedMemCmp(
|
||||
const void *pMem1,
|
||||
const void *pMem2,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
int32_t lResult;
|
||||
|
||||
if((pMem1 == NULL) || (pMem2 == NULL))
|
||||
{
|
||||
REDERROR();
|
||||
lResult = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lResult = RedMemCmpUnchecked(pMem1, pMem2, ulLen);
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
|
||||
#ifndef RedMemCmpUnchecked
|
||||
/** @brief Compare the contents of two buffers.
|
||||
|
||||
@param pMem1 The first buffer to compare.
|
||||
@param pMem2 The second buffer to compare.
|
||||
@param ulLen The length to compare.
|
||||
|
||||
@return Zero if the two buffers are the same, otherwise nonzero.
|
||||
*/
|
||||
static int32_t RedMemCmpUnchecked(
|
||||
const void *pMem1,
|
||||
const void *pMem2,
|
||||
uint32_t ulLen)
|
||||
{
|
||||
const uint8_t *pbMem1 = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pMem1);
|
||||
const uint8_t *pbMem2 = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pMem2);
|
||||
uint32_t ulIdx = 0U;
|
||||
int32_t lResult;
|
||||
|
||||
while((ulIdx < ulLen) && (pbMem1[ulIdx] == pbMem2[ulIdx]))
|
||||
{
|
||||
ulIdx++;
|
||||
}
|
||||
|
||||
if(ulIdx == ulLen)
|
||||
{
|
||||
lResult = 0;
|
||||
}
|
||||
else if(pbMem1[ulIdx] > pbMem2[ulIdx])
|
||||
{
|
||||
lResult = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
lResult = -1;
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue