*
This commit is contained in:
+314
@@ -0,0 +1,314 @@
|
||||
;********************************************************************************************************
|
||||
; uC/LIB
|
||||
; CUSTOM LIBRARY MODULES
|
||||
;
|
||||
; (c) Copyright 2004-2008; Micrium, Inc.; Weston, FL
|
||||
;
|
||||
; All rights reserved. Protected by international copyright laws.
|
||||
;
|
||||
; uC/LIB is provided in source form for FREE evaluation, for educational
|
||||
; use or peaceful research. If you plan on using uC/LIB in a commercial
|
||||
; product you need to contact Micrium to properly license its use in your
|
||||
; product. We provide ALL the source code for your convenience and to
|
||||
; help you experience uC/LIB. The fact that the source code is provided
|
||||
; does NOT mean that you can use it without paying a licensing fee.
|
||||
;
|
||||
; Knowledge of the source code may NOT be used to develop a similar product.
|
||||
;
|
||||
; Please help us continue to provide the Embedded community with the finest
|
||||
; software available. Your honesty is greatly appreciated.
|
||||
;********************************************************************************************************
|
||||
|
||||
|
||||
;********************************************************************************************************
|
||||
;
|
||||
; STANDARD MEMORY OPERATIONS
|
||||
;
|
||||
; ARM-Cortex-M3
|
||||
; RealView Development Suite
|
||||
; RealView Microcontroller Development Kit (MDK)
|
||||
; ARM Developer Suite (ADS)
|
||||
; Keil uVision
|
||||
;
|
||||
; Filename : lib_mem_a.asm
|
||||
; Version : V1.25
|
||||
; Programmer(s) : JDH
|
||||
; BAN
|
||||
;********************************************************************************************************
|
||||
; Note(s) : (1) NO compiler-supplied standard library functions are used in library or product software.
|
||||
;
|
||||
; (a) ALL standard library functions are implemented in the custom library modules :
|
||||
;
|
||||
; (1) \<Custom Library Directory>\lib*.*
|
||||
;
|
||||
; (2) \<Custom Library Directory>\Ports\<cpu>\<compiler>\lib*_a.*
|
||||
;
|
||||
; where
|
||||
; <Custom Library Directory> directory path for custom library software
|
||||
; <cpu> directory name for specific processor (CPU)
|
||||
; <compiler> directory name for specific compiler
|
||||
;
|
||||
; (b) Product-specific library functions are implemented in individual products.
|
||||
;
|
||||
; (2) Assumes ARM CPU mode configured for Little Endian.
|
||||
;********************************************************************************************************
|
||||
|
||||
|
||||
;********************************************************************************************************
|
||||
; PUBLIC FUNCTIONS
|
||||
;********************************************************************************************************
|
||||
|
||||
EXPORT Mem_Copy
|
||||
|
||||
|
||||
;********************************************************************************************************
|
||||
; CODE GENERATION DIRECTIVES
|
||||
;********************************************************************************************************
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
|
||||
;$PAGE
|
||||
;********************************************************************************************************
|
||||
; Mem_Copy()
|
||||
;
|
||||
; Description : Copy data octets from one buffer to another buffer.
|
||||
;
|
||||
; Argument(s) : pdest Pointer to destination memory buffer.
|
||||
;
|
||||
; psrc Pointer to source memory buffer.
|
||||
;
|
||||
; size Number of data buffer octets to copy.
|
||||
;
|
||||
; Return(s) : none.
|
||||
;
|
||||
; Caller(s) : Application.
|
||||
;
|
||||
; Note(s) : (1) Null copies allowed (i.e. 0-octet size).
|
||||
;
|
||||
; (2) Memory buffers NOT checked for overlapping.
|
||||
;
|
||||
; (3) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
|
||||
; address boundary.
|
||||
;
|
||||
; (4) ARM Cortex-M3 processors use a subset of the ARM Thumb-2 instruction set which does
|
||||
; NOT support 16-bit conditional branch instructions but ONLY supports 8-bit conditional
|
||||
; branch instructions.
|
||||
;
|
||||
; Therefore, branches exceeding 8-bit, signed, relative offsets :
|
||||
;
|
||||
; (a) CANNOT be implemented with conditional branches; but ...
|
||||
; (b) MUST be implemented with non-conditional branches.
|
||||
;********************************************************************************************************
|
||||
|
||||
; void Mem_Copy (void *pdest, ; ==> R0
|
||||
; void *psrc, ; ==> R1
|
||||
; CPU_SIZE_T size) ; ==> R2
|
||||
|
||||
Mem_Copy
|
||||
CMP R0, #0
|
||||
BNE Mem_Copy_1
|
||||
BX LR ; return if pdest == NULL
|
||||
|
||||
Mem_Copy_1
|
||||
CMP R1, #0
|
||||
BNE Mem_Copy_2
|
||||
BX LR ; return if psrc == NULL
|
||||
|
||||
Mem_Copy_2
|
||||
CMP R2, #0
|
||||
BNE Mem_Copy_3
|
||||
BX LR ; return if size == 0
|
||||
|
||||
Mem_Copy_3
|
||||
STMFD SP!, {R3-R12} ; save registers on stack
|
||||
|
||||
|
||||
;$PAGE
|
||||
Chk_Align_32 ; check if both dest & src 32-bit aligned
|
||||
AND R3, R0, #0x03
|
||||
AND R4, R1, #0x03
|
||||
CMP R3, R4
|
||||
BNE Chk_Align_16 ; not 32-bit aligned, check for 16-bit alignment
|
||||
|
||||
RSB R3, R3, #0x04 ; compute 1-2-3 pre-copy bytes (to align to the next 32-bit boundary)
|
||||
AND R3, R3, #0x03
|
||||
|
||||
Pre_Copy_1
|
||||
CMP R3, #1 ; copy 1-2-3 bytes (to align to the next 32-bit boundary)
|
||||
BCC Copy_32_1 ; start real 32-bit copy
|
||||
CMP R2, #1 ; check if any more data to copy
|
||||
BCS Pre_Copy_1_Cont
|
||||
B Mem_Copy_END ; no more data to copy (see Note #4b)
|
||||
|
||||
Pre_Copy_1_Cont
|
||||
LDRB R4, [R1], #1
|
||||
STRB R4, [R0], #1
|
||||
SUB R3, R3, #1
|
||||
SUB R2, R2, #1
|
||||
B Pre_Copy_1
|
||||
|
||||
|
||||
Chk_Align_16 ; check if both dest & src 16-bit aligned
|
||||
AND R3, R0, #0x01
|
||||
AND R4, R1, #0x01
|
||||
CMP R3, R4
|
||||
BEQ Pre_Copy_2
|
||||
B Copy_08_1 ; not 16-bit aligned, start 8-bit copy (see Note #4b)
|
||||
|
||||
Pre_Copy_2
|
||||
CMP R3, #1 ; copy 1 byte (to align to the next 16-bit boundary)
|
||||
BCC Copy_16_1 ; start real 16-bit copy
|
||||
|
||||
LDRB R4, [R1], #1
|
||||
STRB R4, [R0], #1
|
||||
SUB R3, R3, #1
|
||||
SUB R2, R2, #1
|
||||
B Pre_Copy_2
|
||||
|
||||
|
||||
Copy_32_1
|
||||
CMP R2, #(04*10*09) ; Copy 9 chunks of 10 32-bit words (360 octets per loop)
|
||||
BCC Copy_32_2
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
SUB R2, R2, #(04*10*09)
|
||||
B Copy_32_1
|
||||
|
||||
Copy_32_2
|
||||
CMP R2, #(04*10*01) ; Copy chunks of 10 32-bit words (40 octets per loop)
|
||||
BCC Copy_32_3
|
||||
LDMIA R1!, {R3-R12}
|
||||
STMIA R0!, {R3-R12}
|
||||
SUB R2, R2, #(04*10*01)
|
||||
B Copy_32_2
|
||||
|
||||
Copy_32_3
|
||||
CMP R2, #(04*01*01) ; Copy remaining 32-bit words
|
||||
BCC Copy_16_1
|
||||
LDR R3, [R1], #4
|
||||
STR R3, [R0], #4
|
||||
SUB R2, R2, #(04*01*01)
|
||||
B Copy_32_3
|
||||
|
||||
;$PAGE
|
||||
Copy_16_1
|
||||
CMP R2, #(02*01*16) ; Copy chunks of 16 16-bit words (32 bytes per loop)
|
||||
BCC Copy_16_2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
SUB R2, R2, #(02*01*16)
|
||||
B Copy_16_1
|
||||
|
||||
Copy_16_2
|
||||
CMP R2, #(02*01*01) ; Copy remaining 16-bit words
|
||||
BCC Copy_08_1
|
||||
LDRH R3, [R1], #2
|
||||
STRH R3, [R0], #2
|
||||
SUB R2, R2, #(02*01*01)
|
||||
B Copy_16_2
|
||||
|
||||
;$PAGE
|
||||
Copy_08_1
|
||||
CMP R2, #(01*01*16) ; Copy chunks of 16 8-bit words (16 bytes per loop)
|
||||
BCC Copy_08_2
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
SUB R2, R2, #(01*01*16)
|
||||
B Copy_08_1
|
||||
|
||||
Copy_08_2
|
||||
CMP R2, #(01*01*01) ; Copy remaining 8-bit words
|
||||
BCC Mem_Copy_END
|
||||
LDRB R3, [R1], #1
|
||||
STRB R3, [R0], #1
|
||||
SUB R2, R2, #(01*01*01)
|
||||
B Copy_08_2
|
||||
|
||||
|
||||
Mem_Copy_END
|
||||
LDMFD SP!, {R3-R12} ; restore registers from stack
|
||||
BX LR ; return
|
||||
|
||||
|
||||
END
|
||||
|
||||
@@ -0,0 +1,661 @@
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* uC/LIB
|
||||
* CUSTOM LIBRARY MODULES
|
||||
*
|
||||
* (c) Copyright 2004-2008; Micrium, Inc.; Weston, FL
|
||||
*
|
||||
* All rights reserved. Protected by international copyright laws.
|
||||
*
|
||||
* uC/LIB is provided in source form for FREE evaluation, for educational
|
||||
* use or peaceful research. If you plan on using uC/LIB in a commercial
|
||||
* product you need to contact Micrium to properly license its use in your
|
||||
* product. We provide ALL the source code for your convenience and to
|
||||
* help you experience uC/LIB. The fact that the source code is provided
|
||||
* does NOT mean that you can use it without paying a licensing fee.
|
||||
*
|
||||
* Knowledge of the source code may NOT be used to develop a similar product.
|
||||
*
|
||||
* Please help us continue to provide the Embedded community with the finest
|
||||
* software available. Your honesty is greatly appreciated.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
*
|
||||
* CORE CUSTOM LIBRARY MODULE
|
||||
*
|
||||
* Filename : lib_def.h
|
||||
* Version : V1.25
|
||||
* Programmer(s) : ITJ
|
||||
*********************************************************************************************************
|
||||
* Note(s) : (1) NO compiler-supplied standard library functions are used in library or product software.
|
||||
*
|
||||
* (a) ALL standard library functions are implemented in the custom library modules :
|
||||
*
|
||||
* (1) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (2) \<Custom Library Directory>\Ports\<cpu>\<compiler>\lib*_a.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (b) Product-specific library functions are implemented in individual products.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LIB_DEF_MODULE_PRESENT
|
||||
#define LIB_DEF_MODULE_PRESENT
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* CUSTOM LIBRARY MODULE VERSION NUMBER
|
||||
*
|
||||
* Note(s) : (1) (a) The custom library module software version is denoted as follows :
|
||||
*
|
||||
* Vx.yy
|
||||
*
|
||||
* where
|
||||
* V denotes 'Version' label
|
||||
* x denotes major software version revision number
|
||||
* yy denotes minor software version revision number
|
||||
*
|
||||
* (b) The software version label #define is formatted as follows :
|
||||
*
|
||||
* ver = x.yy * 100
|
||||
*
|
||||
* where
|
||||
* ver denotes software version number scaled as an integer value
|
||||
* x.yy denotes software version number
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define LIB_VERSION 124u /* See Note #1. */
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* INCLUDE FILES
|
||||
*
|
||||
* Note(s) : (1) The following common software files are located in the following directories :
|
||||
*
|
||||
* (a) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (b) (1) \<CPU-Compiler Directory>\cpu_def.h
|
||||
*
|
||||
* (2) \<CPU-Compiler Directory>\<cpu>\<compiler>\cpu*.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <CPU-Compiler Directory> directory path for common CPU-compiler software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (2) Compiler MUST be configured to include the '\<Custom Library Directory>\uC-LIB\',
|
||||
* '\<CPU-Compiler Directory>\' directory, & the specific CPU-compiler directory as
|
||||
* additional include path directories.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#include <uC-CPU\ARM-Cortex-M3\RealView\cpu.h>
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* STANDARD DEFINES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#define DEF_DISABLED 0
|
||||
#define DEF_ENABLED 1
|
||||
|
||||
#define DEF_FALSE 0
|
||||
#define DEF_TRUE 1
|
||||
|
||||
#define DEF_NO 0
|
||||
#define DEF_YES 1
|
||||
|
||||
#define DEF_OFF 0
|
||||
#define DEF_ON 1
|
||||
|
||||
#define DEF_CLR 0
|
||||
#define DEF_SET 1
|
||||
|
||||
#define DEF_ACTIVE 0
|
||||
#define DEF_INACTIVE 1
|
||||
|
||||
#define DEF_FAIL 0
|
||||
#define DEF_OK 1
|
||||
|
||||
|
||||
/* -------------------- BIT DEFINES ------------------- */
|
||||
#define DEF_BIT_NONE 0x00
|
||||
|
||||
#define DEF_BIT_00 0x01
|
||||
#define DEF_BIT_01 0x02
|
||||
#define DEF_BIT_02 0x04
|
||||
#define DEF_BIT_03 0x08
|
||||
#define DEF_BIT_04 0x10
|
||||
#define DEF_BIT_05 0x20
|
||||
#define DEF_BIT_06 0x40
|
||||
#define DEF_BIT_07 0x80
|
||||
|
||||
#define DEF_BIT_08 0x0100
|
||||
#define DEF_BIT_09 0x0200
|
||||
#define DEF_BIT_10 0x0400
|
||||
#define DEF_BIT_11 0x0800
|
||||
#define DEF_BIT_12 0x1000
|
||||
#define DEF_BIT_13 0x2000
|
||||
#define DEF_BIT_14 0x4000
|
||||
#define DEF_BIT_15 0x8000
|
||||
|
||||
#define DEF_BIT_16 0x00010000
|
||||
#define DEF_BIT_17 0x00020000
|
||||
#define DEF_BIT_18 0x00040000
|
||||
#define DEF_BIT_19 0x00080000
|
||||
#define DEF_BIT_20 0x00100000
|
||||
#define DEF_BIT_21 0x00200000
|
||||
#define DEF_BIT_22 0x00400000
|
||||
#define DEF_BIT_23 0x00800000
|
||||
|
||||
#define DEF_BIT_24 0x01000000
|
||||
#define DEF_BIT_25 0x02000000
|
||||
#define DEF_BIT_26 0x04000000
|
||||
#define DEF_BIT_27 0x08000000
|
||||
#define DEF_BIT_28 0x10000000
|
||||
#define DEF_BIT_29 0x20000000
|
||||
#define DEF_BIT_30 0x40000000
|
||||
#define DEF_BIT_31 0x80000000
|
||||
|
||||
/* ------------------- OCTET DEFINES ------------------ */
|
||||
#define DEF_OCTET_NBR_BITS 8
|
||||
#define DEF_OCTET_MASK 0xFF
|
||||
|
||||
#define DEF_NIBBLE_NBR_BITS 4
|
||||
#define DEF_NIBBLE_MASK 0x0F
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/* ------------------ INTEGER DEFINES ----------------- */
|
||||
#define DEF_INT_08_NBR_BITS 8
|
||||
#define DEF_INT_08_MASK 0xFF
|
||||
|
||||
#define DEF_INT_08U_MIN_VAL 0u
|
||||
#define DEF_INT_08U_MAX_VAL 255u
|
||||
|
||||
#define DEF_INT_08S_MIN_VAL -128
|
||||
#define DEF_INT_08S_MAX_VAL 127
|
||||
|
||||
#define DEF_INT_08S_MIN_VAL_ONES_CPL -127
|
||||
#define DEF_INT_08S_MAX_VAL_ONES_CPL 127
|
||||
|
||||
|
||||
#define DEF_INT_16_NBR_BITS 16
|
||||
#define DEF_INT_16_MASK 0xFFFF
|
||||
|
||||
#define DEF_INT_16U_MIN_VAL 0u
|
||||
#define DEF_INT_16U_MAX_VAL 65535u
|
||||
|
||||
#define DEF_INT_16S_MIN_VAL -32768
|
||||
#define DEF_INT_16S_MAX_VAL 32767
|
||||
|
||||
#define DEF_INT_16S_MIN_VAL_ONES_CPL -32767
|
||||
#define DEF_INT_16S_MAX_VAL_ONES_CPL 32767
|
||||
|
||||
|
||||
#define DEF_INT_32_NBR_BITS 32
|
||||
#define DEF_INT_32_MASK 0xFFFFFFFF
|
||||
|
||||
#define DEF_INT_32U_MIN_VAL 0u
|
||||
#define DEF_INT_32U_MAX_VAL 4294967295u
|
||||
|
||||
#define DEF_INT_32S_MIN_VAL -2147483648
|
||||
#define DEF_INT_32S_MAX_VAL 2147483647
|
||||
|
||||
#define DEF_INT_32S_MIN_VAL_ONES_CPL -2147483647
|
||||
#define DEF_INT_32S_MAX_VAL_ONES_CPL 2147483647
|
||||
|
||||
|
||||
#define DEF_INT_64_NBR_BITS 64
|
||||
#define DEF_INT_64_MASK 0xFFFFFFFFFFFFFFFF
|
||||
|
||||
#define DEF_INT_64U_MIN_VAL 0u
|
||||
#define DEF_INT_64U_MAX_VAL 18446744073709551615u
|
||||
|
||||
#define DEF_INT_64S_MIN_VAL -9223372036854775808
|
||||
#define DEF_INT_64S_MAX_VAL 9223372036854775807
|
||||
|
||||
#define DEF_INT_64S_MIN_VAL_ONES_CPL -9223372036854775807
|
||||
#define DEF_INT_64S_MAX_VAL_ONES_CPL 9223372036854775807
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/* ---------------- CPU INTEGER DEFINES --------------- */
|
||||
#define DEF_INT_CPU_NBR_BITS (CPU_CFG_DATA_SIZE * DEF_OCTET_NBR_BITS)
|
||||
|
||||
|
||||
#if (DEF_INT_CPU_NBR_BITS == DEF_INT_08_NBR_BITS)
|
||||
|
||||
#define DEF_INT_CPU_MASK DEF_INT_08_MASK
|
||||
|
||||
#define DEF_INT_CPU_U_MIN_VAL DEF_INT_08U_MIN_VAL
|
||||
#define DEF_INT_CPU_U_MAX_VAL DEF_INT_08U_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL DEF_INT_08S_MIN_VAL
|
||||
#define DEF_INT_CPU_S_MAX_VAL DEF_INT_08S_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL_ONES_CPL DEF_INT_08S_MIN_VAL_ONES_CPL
|
||||
#define DEF_INT_CPU_S_MAX_VAL_ONES_CPL DEF_INT_08S_MAX_VAL_ONES_CPL
|
||||
|
||||
|
||||
#elif (DEF_INT_CPU_NBR_BITS == DEF_INT_16_NBR_BITS)
|
||||
|
||||
#define DEF_INT_CPU_MASK DEF_INT_16_MASK
|
||||
|
||||
#define DEF_INT_CPU_U_MIN_VAL DEF_INT_16U_MIN_VAL
|
||||
#define DEF_INT_CPU_U_MAX_VAL DEF_INT_16U_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL DEF_INT_16S_MIN_VAL
|
||||
#define DEF_INT_CPU_S_MAX_VAL DEF_INT_16S_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL_ONES_CPL DEF_INT_16S_MIN_VAL_ONES_CPL
|
||||
#define DEF_INT_CPU_S_MAX_VAL_ONES_CPL DEF_INT_16S_MAX_VAL_ONES_CPL
|
||||
|
||||
|
||||
#elif (DEF_INT_CPU_NBR_BITS == DEF_INT_32_NBR_BITS)
|
||||
|
||||
#define DEF_INT_CPU_MASK DEF_INT_32_MASK
|
||||
|
||||
#define DEF_INT_CPU_U_MIN_VAL DEF_INT_32U_MIN_VAL
|
||||
#define DEF_INT_CPU_U_MAX_VAL DEF_INT_32U_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL DEF_INT_32S_MIN_VAL
|
||||
#define DEF_INT_CPU_S_MAX_VAL DEF_INT_32S_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL_ONES_CPL DEF_INT_32S_MIN_VAL_ONES_CPL
|
||||
#define DEF_INT_CPU_S_MAX_VAL_ONES_CPL DEF_INT_32S_MAX_VAL_ONES_CPL
|
||||
|
||||
|
||||
#elif (DEF_INT_CPU_NBR_BITS == DEF_INT_64_NBR_BITS)
|
||||
|
||||
#define DEF_INT_CPU_MASK DEF_INT_64_MASK
|
||||
|
||||
#define DEF_INT_CPU_U_MIN_VAL DEF_INT_64U_MIN_VAL
|
||||
#define DEF_INT_CPU_U_MAX_VAL DEF_INT_64U_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL DEF_INT_64S_MIN_VAL
|
||||
#define DEF_INT_CPU_S_MAX_VAL DEF_INT_64S_MAX_VAL
|
||||
|
||||
#define DEF_INT_CPU_S_MIN_VAL_ONES_CPL DEF_INT_64S_MIN_VAL_ONES_CPL
|
||||
#define DEF_INT_CPU_S_MAX_VAL_ONES_CPL DEF_INT_64S_MAX_VAL_ONES_CPL
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#error "CPU_CFG_DATA_SIZE illegally #defined in 'cpu.h' "
|
||||
#error " [See 'cpu.h CONFIGURATION ERRORS']"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/* ------------------- TIME DEFINES ------------------- */
|
||||
#define DEF_TIME_NBR_HR_PER_DAY 24uL
|
||||
|
||||
#define DEF_TIME_NBR_MIN_PER_HR 60uL
|
||||
#define DEF_TIME_NBR_MIN_PER_DAY (DEF_TIME_NBR_MIN_PER_HR * DEF_TIME_NBR_HR_PER_DAY)
|
||||
|
||||
#define DEF_TIME_NBR_SEC_PER_MIN 60uL
|
||||
#define DEF_TIME_NBR_SEC_PER_HR (DEF_TIME_NBR_SEC_PER_MIN * DEF_TIME_NBR_MIN_PER_HR)
|
||||
#define DEF_TIME_NBR_SEC_PER_DAY (DEF_TIME_NBR_SEC_PER_HR * DEF_TIME_NBR_HR_PER_DAY)
|
||||
|
||||
#define DEF_TIME_NBR_mS_PER_SEC 1000uL
|
||||
#define DEF_TIME_NBR_uS_PER_SEC 1000000uL
|
||||
#define DEF_TIME_NBR_nS_PER_SEC 1000000000uL
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* ERROR CODES
|
||||
*
|
||||
* Note(s) : (1) All generic library error codes are #define'd in 'lib_def.h';
|
||||
* Any module-specific error codes are #define'd in library module header files.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define LIB_ERR_NONE 0
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DATA TYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
typedef CPU_INT16U LIB_ERR;
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* GLOBAL VARIABLES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* BIT MACRO'S
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT()
|
||||
*
|
||||
* Description : Create bit mask with single, specified bit set.
|
||||
*
|
||||
* Argument(s) : bit Bit number of bit to set.
|
||||
*
|
||||
* Return(s) : Bit mask with single, specified bit set.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) 'bit' values that overflow the target CPU &/or compiler environment (e.g. negative
|
||||
* or greater-than-CPU-data-size values) MAY generate compiler warnings &/or errors.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT(bit) (1u << (bit))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_MASK()
|
||||
*
|
||||
* Description : Shift a bit mask.
|
||||
*
|
||||
* Argument(s) : bit_mask Bit mask to shift.
|
||||
*
|
||||
* bit_shift Number of bit positions to left-shift bit mask.
|
||||
*
|
||||
* Return(s) : Shifted bit mask.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) 'bit_shift' values that overflow the target CPU &/or compiler environment (e.g. negative
|
||||
* or greater-than-CPU-data-size values) MAY generate compiler warnings &/or errors.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_MASK(bit_mask, bit_shift) ((bit_mask) << (bit_shift))
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_FIELD()
|
||||
*
|
||||
* Description : Create & shift a contiguous bit field.
|
||||
*
|
||||
* Argument(s) : bit_field Number of contiguous bits to set in the bit field.
|
||||
*
|
||||
* bit_shift Number of bit positions to left-shift bit field.
|
||||
*
|
||||
* Return(s) : Shifted bit field.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) 'bit_field'/'bit_shift' values that overflow the target CPU &/or compiler environment
|
||||
* (e.g. negative or greater-than-CPU-data-size values) MAY generate compiler warnings
|
||||
* &/or errors.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_FIELD(bit_field, bit_shift) ((((bit_field) >= DEF_INT_CPU_NBR_BITS) ? (DEF_INT_CPU_U_MAX_VAL) \
|
||||
: (DEF_BIT(bit_field) - 1)) \
|
||||
<< (bit_shift))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_SET()
|
||||
*
|
||||
* Description : Set specified bit(s) in a value.
|
||||
*
|
||||
* Argument(s) : val Value to modify by setting specified bit(s).
|
||||
*
|
||||
* mask Mask of bits to set.
|
||||
*
|
||||
* Return(s) : Modified value with specified bit(s) set.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_SET(val, mask) { (val) |= (mask); }
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_CLR()
|
||||
*
|
||||
* Description : Clear specified bit(s) in a value.
|
||||
*
|
||||
* Argument(s) : val Value to modify by clearing specified bit(s).
|
||||
*
|
||||
* mask Mask of bits to clear.
|
||||
*
|
||||
* Return(s) : Modified value with specified bit(s) clear.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_CLR(val, mask) { (val) &= ~(mask); }
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_IS_SET()
|
||||
*
|
||||
* Description : Determine if specified bit(s) in a value are set.
|
||||
*
|
||||
* Argument(s) : val Value to check for specified bit(s) set.
|
||||
*
|
||||
* mask Mask of bits to check if set.
|
||||
*
|
||||
* Return(s) : DEF_YES, if ALL specified bit(s) are set in value.
|
||||
*
|
||||
* DEF_NO, if ALL specified bit(s) are NOT set in value.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_IS_SET(val, mask) ((((val) & (mask)) == (mask)) ? (DEF_YES) : (DEF_NO ))
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_IS_CLR()
|
||||
*
|
||||
* Description : Determine if specified bit(s) in a value are clear.
|
||||
*
|
||||
* Argument(s) : val Value to check for specified bit(s) clear.
|
||||
*
|
||||
* mask Mask of bits to check if clear.
|
||||
*
|
||||
* Return(s) : DEF_YES, if ALL specified bit(s) are clear in value.
|
||||
*
|
||||
* DEF_NO, if ALL specified bit(s) are NOT clear in value.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_IS_CLR(val, mask) (((val) & (mask)) ? (DEF_NO ) : (DEF_YES))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_IS_SET_ANY()
|
||||
*
|
||||
* Description : Determine if any specified bit(s) in a value are set.
|
||||
*
|
||||
* Argument(s) : val Value to check for specified bit(s) set.
|
||||
*
|
||||
* mask Mask of bits to check if set.
|
||||
*
|
||||
* Return(s) : DEF_YES, if ANY specified bit(s) are set in value.
|
||||
*
|
||||
* DEF_NO, if ALL specified bit(s) are NOT set in value.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_IS_SET_ANY(val, mask) (((val) & (mask)) ? (DEF_YES) : (DEF_NO ))
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_BIT_IS_CLR_ANY()
|
||||
*
|
||||
* Description : Determine if any specified bit(s) in a value are clear.
|
||||
*
|
||||
* Argument(s) : val Value to check for specified bit(s) clear.
|
||||
*
|
||||
* mask Mask of bits to check if clear.
|
||||
*
|
||||
* Return(s) : DEF_YES, if ANY specified bit(s) are clear in value.
|
||||
*
|
||||
* DEF_NO, if ALL specified bit(s) are NOT clear in value.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_BIT_IS_CLR_ANY(val, mask) ((((val) & (mask)) != (mask)) ? (DEF_YES) : (DEF_NO ))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MATH MACRO'S
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_MIN()
|
||||
*
|
||||
* Description : Determine the minimum of two values.
|
||||
*
|
||||
* Argument(s) : a First value.
|
||||
*
|
||||
* b Second value.
|
||||
*
|
||||
* Return(s) : Minimum of the two values.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_MAX()
|
||||
*
|
||||
* Description : Determine the maximum of two values.
|
||||
*
|
||||
* Argument(s) : a First value.
|
||||
*
|
||||
* b Second value.
|
||||
*
|
||||
* Return(s) : Maximum of the two values.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEF_ABS()
|
||||
*
|
||||
* Description : Determine the absolute value of a value.
|
||||
*
|
||||
* Argument(s) : a Value to calculate absolute value.
|
||||
*
|
||||
* Return(s) : Absolute value of the value.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : none.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define DEF_ABS(a) (((a) < 0) ? (-(a)) : (a))
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* FUNCTION PROTOTYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* CONFIGURATION ERRORS
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE END
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* End of lib def module include. */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,888 @@
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* uC/LIB
|
||||
* CUSTOM LIBRARY MODULES
|
||||
*
|
||||
* (c) Copyright 2004-2008; Micrium, Inc.; Weston, FL
|
||||
*
|
||||
* All rights reserved. Protected by international copyright laws.
|
||||
*
|
||||
* uC/LIB is provided in source form for FREE evaluation, for educational
|
||||
* use or peaceful research. If you plan on using uC/LIB in a commercial
|
||||
* product you need to contact Micrium to properly license its use in your
|
||||
* product. We provide ALL the source code for your convenience and to
|
||||
* help you experience uC/LIB. The fact that the source code is provided
|
||||
* does NOT mean that you can use it without paying a licensing fee.
|
||||
*
|
||||
* Knowledge of the source code may NOT be used to develop a similar product.
|
||||
*
|
||||
* Please help us continue to provide the Embedded community with the finest
|
||||
* software available. Your honesty is greatly appreciated.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
*
|
||||
* STANDARD MEMORY OPERATIONS
|
||||
*
|
||||
* Filename : lib_mem.h
|
||||
* Version : V1.25
|
||||
* Programmer(s) : ITJ
|
||||
*********************************************************************************************************
|
||||
* Note(s) : (1) NO compiler-supplied standard library functions are used in library or product software.
|
||||
*
|
||||
* (a) ALL standard library functions are implemented in the custom library modules :
|
||||
*
|
||||
* (1) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (2) \<Custom Library Directory>\Ports\<cpu>\<compiler>\lib*_a.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (b) Product-specific library functions are implemented in individual products.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LIB_MEM_MODULE_PRESENT
|
||||
#define LIB_MEM_MODULE_PRESENT
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* INCLUDE FILES
|
||||
*
|
||||
* Note(s) : (1) The following common software files are located in the following directories :
|
||||
*
|
||||
* (a) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (b) (1) \<CPU-Compiler Directory>\cpu_def.h
|
||||
*
|
||||
* (2) \<CPU-Compiler Directory>\<cpu>\<compiler>\cpu*.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <CPU-Compiler Directory> directory path for common CPU-compiler software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (2) Compiler MUST be configured to include the '\<Custom Library Directory>\uC-LIB\',
|
||||
* '\<CPU-Compiler Directory>\' directory, & the specific CPU-compiler directory as
|
||||
* additional include path directories.
|
||||
*
|
||||
* (3) NO compiler-supplied standard library functions SHOULD be used.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#include <uC-CPU\ARM-Cortex-M3\RealView\cpu.h>
|
||||
#include <lib_def.h>
|
||||
#include <app_cfg.h>
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* EXTERNS
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifdef LIB_MEM_MODULE
|
||||
#define LIB_MEM_EXT
|
||||
#else
|
||||
#define LIB_MEM_EXT extern
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEFAULT CONFIGURATION
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY LIBRARY ARGUMENT CHECK CONFIGURATION
|
||||
*
|
||||
* Note(s) : (1) Configure LIB_MEM_CFG_ARG_CHK_EXT_EN to enable/disable the memory libray suite external
|
||||
* argument check feature :
|
||||
*
|
||||
* (a) When ENABLED, arguments received from any port interface provided by the developer
|
||||
* or application are checked/validated.
|
||||
*
|
||||
* (b) When DISABLED, NO arguments received from any port interface provided by the developer
|
||||
* or application are checked/validated.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
/* Configure external argument check feature (see Note #1) : */
|
||||
#ifndef LIB_MEM_CFG_ARG_CHK_EXT_EN
|
||||
#define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_DISABLED
|
||||
/* DEF_DISABLED Argument check DISABLED */
|
||||
/* DEF_ENABLED Argument check ENABLED */
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY POOL CONFIGURATION
|
||||
*
|
||||
* Note(s) : (1) Configure LIB_MEM_CFG_POOL_EN to enable/disable memory pool functions.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
/* Configure memory pool feature (see Note #1) : */
|
||||
#ifndef LIB_MEM_CFG_POOL_EN
|
||||
#define LIB_MEM_CFG_POOL_EN DEF_DISABLED
|
||||
/* DEF_DISABLED Memory pool(s) DISABLED */
|
||||
/* DEF_ENABLED Memory pool(s) ENABLED */
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEFINES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* LIBRARY MEMORY ERROR CODES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define LIB_MEM_ERR_NONE 10000
|
||||
#define LIB_MEM_ERR_NULL_PTR 10001 /* Ptr arg(s) passed NULL ptr(s). */
|
||||
#define LIB_MEM_ERR_NONE_AVAIL 10010 /* NO avail mem rsrc's. */
|
||||
|
||||
#define LIB_MEM_ERR_INVALID_SEG_SIZE 10100 /* Invalid mem seg size. */
|
||||
#define LIB_MEM_ERR_INVALID_SEG_OVERLAP 10101 /* Invalid mem seg overlaps other mem seg(s). */
|
||||
#define LIB_MEM_ERR_INVALID_POOL 10102 /* Invalid mem pool. */
|
||||
#define LIB_MEM_ERR_INVALID_ADDR 10103 /* Invalid mem pool addr. */
|
||||
#define LIB_MEM_ERR_INVALID_BLK_NBR 10104 /* Invalid mem pool blk nbr. */
|
||||
#define LIB_MEM_ERR_INVALID_BLK_SIZE 10105 /* Invalid mem pool blk size. */
|
||||
#define LIB_MEM_ERR_INVALID_BLK_IX 10106 /* Invalid mem pool ix. */
|
||||
|
||||
#define LIB_MEM_ERR_SEG_EMPTY 10110 /* Mem seg empty; i.e. NO avail mem for mem pools. */
|
||||
#define LIB_MEM_ERR_POOL_FULL 10111 /* Mem pool full; i.e. All mem blks avail in mem pool. */
|
||||
|
||||
#define LIB_MEM_ERR_HEAP_NOT_FOUND 10115 /* Heap seg NOT found. */
|
||||
#define LIB_MEM_ERR_HEAP_EMPTY 10116 /* Heap seg empty; i.e. NO avail mem in heap. */
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY LIBRARY TYPE DEFINES
|
||||
*
|
||||
* Note(s) : (1) LIB_MEM_TYPE_??? #define values specifically chosen as ASCII representations of the memory
|
||||
* library types. Memory displays of memory library objects will display the library TYPEs
|
||||
* with their chosen ASCII names.
|
||||
**********************************************************************************************************/
|
||||
|
||||
/* ------------------- LIB_MEM TYPES ------------------ */
|
||||
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
|
||||
#define LIB_MEM_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
|
||||
#define LIB_MEM_TYPE_HEAP 0x48454150 /* "HEAP" in ASCII. */
|
||||
#define LIB_MEM_TYPE_POOL 0x504F4F4C /* "POOL" in ASCII. */
|
||||
|
||||
#else
|
||||
|
||||
#if (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32)
|
||||
#define LIB_MEM_TYPE_NONE 0x454E4F4E /* "NONE" in ASCII. */
|
||||
#define LIB_MEM_TYPE_HEAP 0x50414548 /* "HEAP" in ASCII. */
|
||||
#define LIB_MEM_TYPE_POOL 0x4C4F4F50 /* "POOL" in ASCII. */
|
||||
|
||||
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16)
|
||||
#define LIB_MEM_TYPE_NONE 0x4F4E454E /* "NONE" in ASCII. */
|
||||
#define LIB_MEM_TYPE_HEAP 0x45485041 /* "HEAP" in ASCII. */
|
||||
#define LIB_MEM_TYPE_POOL 0x4F504C4F /* "POOL" in ASCII. */
|
||||
|
||||
#else /* Dflt CPU_WORD_SIZE_08. */
|
||||
#define LIB_MEM_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
|
||||
#define LIB_MEM_TYPE_HEAP 0x48454150 /* "HEAP" in ASCII. */
|
||||
#define LIB_MEM_TYPE_POOL 0x504F4F4C /* "POOL" in ASCII. */
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DATA TYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* LIB MEM TYPE
|
||||
*
|
||||
* Note(s) : (1) 'LIB_MEM_TYPE' declared as 'CPU_INT32U' & all 'LIB_MEM_TYPE's #define'd with large, non-trivial
|
||||
* values to trap & discard invalid/corrupted library memory objects based on 'LIB_MEM_TYPE'.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
typedef CPU_INT32U LIB_MEM_TYPE;
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY POOL TABLE IX TYPE
|
||||
*
|
||||
* Note(s) : (1) MEM_POOL_IX_NONE SHOULD be #define'd based on 'MEM_POOL_IX' data type declared.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
typedef CPU_INT16U MEM_POOL_IX;
|
||||
|
||||
#define MEM_POOL_IX_NONE DEF_INT_16U_MAX_VAL /* Define as max unsigned val (see Note #1). */
|
||||
#define MEM_POOL_IX_MIN 1
|
||||
#define MEM_POOL_IX_MAX (MEM_POOL_IX_NONE - 1)
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY POOL DATA TYPES
|
||||
*
|
||||
* MEMORY SEGMENT
|
||||
* ----------------
|
||||
* MEMORY POOL'S | | <----
|
||||
* POINTERS TO | MEMORY | |
|
||||
* MEM_POOL MEMORY BLOCKS | BLOCKS | |
|
||||
* |----------------| |---------| | -------- | |
|
||||
* | O------------------> | O--------------------> | | | |
|
||||
* |----------------| |---------| | | | | |
|
||||
* | Pool Addr Ptrs | | O------------- | -------- | |
|
||||
* | Pool Size | |---------| | | | |
|
||||
* |----------------| | | | | -------- | |
|
||||
* | Blk Size | | | --------> | | | |
|
||||
* | Blk Nbr | | | | | | | |
|
||||
* | Blk Ix | | . | | -------- | |
|
||||
* |----------------| | . | | | |
|
||||
* |----------------| | . | | . | |
|
||||
* | O----------------- | | | . | |
|
||||
* |----------------| | | | | . | |
|
||||
* | O------------ | | | | | |
|
||||
* |----------------| | | |---------| | -------- | |
|
||||
* | Seg Size Tot | | | | O--------------------> | | | |
|
||||
* | Seg Size Rem | | | |---------| | | | | |
|
||||
* |----------------| | | | | | -------- | |
|
||||
* | Seg List Ptrs | | | |---------| | | |
|
||||
* |----------------| | | | ------------ | |
|
||||
* | | | | <--------
|
||||
* | | | | | |
|
||||
* | | | | | |
|
||||
* | | | | | |
|
||||
* | | | | | |
|
||||
* | | | | | |
|
||||
* | | ---------------- | |
|
||||
* | | | |
|
||||
* | -------------------------------------------------- |
|
||||
* | |
|
||||
* -----------------------------------------------------------
|
||||
*
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
typedef struct mem_pool MEM_POOL;
|
||||
|
||||
/* --------------------- MEM POOL --------------------- */
|
||||
struct mem_pool {
|
||||
LIB_MEM_TYPE Type; /* Pool type : LIB_TYPE_POOL or LIB_TYPE_HEAP. */
|
||||
|
||||
MEM_POOL *SegPrevPtr; /* Ptr to PREV mem seg. */
|
||||
MEM_POOL *SegNextPtr; /* Ptr to NEXT mem seg. */
|
||||
MEM_POOL *PoolPrevPtr; /* Ptr to PREV mem pool. */
|
||||
MEM_POOL *PoolNextPtr; /* Ptr to NEXT mem pool. */
|
||||
|
||||
void *PoolAddrStart; /* Ptr to start of mem seg for mem pool blks. */
|
||||
void *PoolAddrEnd; /* Ptr to end of mem seg for mem pool blks. */
|
||||
void **PoolPtrs; /* Ptr to mem pool's array of blk ptrs. */
|
||||
MEM_POOL_IX BlkIx; /* Ix into mem pool's array of blk ptrs. */
|
||||
CPU_SIZE_T PoolSize; /* Size of mem pool (in octets). */
|
||||
CPU_SIZE_T BlkNbr; /* Nbr of mem pool blks. */
|
||||
CPU_SIZE_T BlkSize; /* Size of mem pool blks (in octets). */
|
||||
CPU_SIZE_T BlkAlign; /* Align of mem pool blks (in octets). */
|
||||
|
||||
/* --------------------- MEM SEG ---------------------- */
|
||||
void *SegAddr; /* Ptr to mem seg's base/start addr. */
|
||||
void *SegAddrNextAvail; /* Ptr to mem seg's next avail addr. */
|
||||
CPU_SIZE_T SegSizeTot; /* Tot size of mem seg (in octets). */
|
||||
CPU_SIZE_T SegSizeRem; /* Rem size of mem seg (in octets). */
|
||||
};
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* GLOBAL VARIABLES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MACRO'S
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY DATA VALUE MACRO'S
|
||||
*
|
||||
* Note(s) : (1) (a) Some variables & variable buffers to pass & receive data values MUST start on appropriate
|
||||
* CPU word-aligned addresses. This is required because most word-aligned processors are more
|
||||
* efficient & may even REQUIRE that multi-octet words start on CPU word-aligned addresses.
|
||||
*
|
||||
* (1) For 16-bit word-aligned processors, this means that
|
||||
*
|
||||
* all 16- & 32-bit words MUST start on addresses that are multiples of 2 octets
|
||||
*
|
||||
* (2) For 32-bit word-aligned processors, this means that
|
||||
*
|
||||
* all 16-bit words MUST start on addresses that are multiples of 2 octets
|
||||
* all 32-bit words MUST start on addresses that are multiples of 4 octets
|
||||
*
|
||||
* (b) However, some data values macro's appropriately access data values from any CPU addresses,
|
||||
* word-aligned or not. Thus for processors that require data word alignment, data words can
|
||||
* be accessed to/from any CPU address, word-aligned or not, without generating data-word-
|
||||
* alignment exceptions/faults.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEM_VAL_GET_xxx()
|
||||
*
|
||||
* Description : Decode data values from any CPU memory address.
|
||||
*
|
||||
* Argument(s) : addr Lowest CPU memory address of data value to decode (see Notes #2 & #3a).
|
||||
*
|
||||
* Return(s) : Decoded data value from CPU memory address (see Notes #1 & #3b).
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) Decode data values based on the values' data-word order in CPU memory :
|
||||
*
|
||||
* MEM_VAL_GET_xxx_BIG() Decode big- endian data values -- data words' most
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_GET_xxx_LITTLE() Decode little-endian data values -- data words' least
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_GET_xxx() Decode data values using CPU's native or configured
|
||||
* data-word order
|
||||
*
|
||||
* See also 'cpu.h CPU WORD CONFIGURATION Note #2'.
|
||||
*
|
||||
* (2) CPU memory addresses/pointers NOT checked for NULL.
|
||||
*
|
||||
* (3) (a) MEM_VAL_GET_xxx() macro's decode data values without regard to CPU word-aligned addresses.
|
||||
* Thus for processors that require data word alignment, data words can be decoded from any
|
||||
* CPU address, word-aligned or not, without generating data-word-alignment exceptions/faults.
|
||||
*
|
||||
* (b) However, any variable to receive the returned data value MUST start on an appropriate CPU
|
||||
* word-aligned address.
|
||||
*
|
||||
* See also 'MEMORY DATA VALUE MACRO'S Note #1'.
|
||||
*
|
||||
* (4) MEM_VAL_COPY_GET_xxx() macro's are more efficient than MEM_VAL_GET_xxx() macro's & are
|
||||
* also independent of CPU data-word-alignment & SHOULD be used whenever possible.
|
||||
*
|
||||
* See also 'MEM_VAL_COPY_GET_xxx() Note #4'.
|
||||
*
|
||||
* (5) The 'CPU_CFG_ENDIAN_TYPE' pre-processor 'else'-conditional code SHOULD never be compiled/
|
||||
* linked since each 'cpu.h' SHOULD ensure that the CPU data-word-memory order configuration
|
||||
* constant (CPU_CFG_ENDIAN_TYPE) is configured with an appropriate data-word-memory order
|
||||
* value (see 'cpu.h CPU WORD CONFIGURATION Note #2'). The 'else'-conditional code is
|
||||
* included as an extra precaution in case 'cpu.h' is incorrectly configured.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define MEM_VAL_GET_INT08U_BIG(addr) (((CPU_INT08U)(*(((CPU_INT08U *)(addr)) + 0))) << (0 * DEF_OCTET_NBR_BITS))
|
||||
|
||||
#define MEM_VAL_GET_INT16U_BIG(addr) ((((CPU_INT16U)(*(((CPU_INT08U *)(addr)) + 0))) << (1 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT16U)(*(((CPU_INT08U *)(addr)) + 1))) << (0 * DEF_OCTET_NBR_BITS)))
|
||||
|
||||
#define MEM_VAL_GET_INT32U_BIG(addr) ((((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 0))) << (3 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 1))) << (2 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 2))) << (1 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 3))) << (0 * DEF_OCTET_NBR_BITS)))
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_GET_INT08U_LITTLE(addr) (((CPU_INT08U)(*(((CPU_INT08U *)(addr)) + 0))) << (0 * DEF_OCTET_NBR_BITS))
|
||||
|
||||
#define MEM_VAL_GET_INT16U_LITTLE(addr) ((((CPU_INT16U)(*(((CPU_INT08U *)(addr)) + 0))) << (0 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT16U)(*(((CPU_INT08U *)(addr)) + 1))) << (1 * DEF_OCTET_NBR_BITS)))
|
||||
|
||||
#define MEM_VAL_GET_INT32U_LITTLE(addr) ((((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 0))) << (0 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 1))) << (1 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 2))) << (2 * DEF_OCTET_NBR_BITS)) + \
|
||||
(((CPU_INT32U)(*(((CPU_INT08U *)(addr)) + 3))) << (3 * DEF_OCTET_NBR_BITS)))
|
||||
|
||||
|
||||
|
||||
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
|
||||
|
||||
#define MEM_VAL_GET_INT08U(addr) MEM_VAL_GET_INT08U_BIG(addr)
|
||||
#define MEM_VAL_GET_INT16U(addr) MEM_VAL_GET_INT16U_BIG(addr)
|
||||
#define MEM_VAL_GET_INT32U(addr) MEM_VAL_GET_INT32U_BIG(addr)
|
||||
|
||||
#elif (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_LITTLE)
|
||||
|
||||
#define MEM_VAL_GET_INT08U(addr) MEM_VAL_GET_INT08U_LITTLE(addr)
|
||||
#define MEM_VAL_GET_INT16U(addr) MEM_VAL_GET_INT16U_LITTLE(addr)
|
||||
#define MEM_VAL_GET_INT32U(addr) MEM_VAL_GET_INT32U_LITTLE(addr)
|
||||
|
||||
#else /* See Note #5. */
|
||||
|
||||
#error "CPU_CFG_ENDIAN_TYPE illegally #defined in 'cpu.h' "
|
||||
#error " [See 'cpu.h CONFIGURATION ERRORS']"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEM_VAL_SET_xxx()
|
||||
*
|
||||
* Description : Encode data values to any CPU memory address.
|
||||
*
|
||||
* Argument(s) : addr Lowest CPU memory address to encode data value (see Notes #2 & #3a).
|
||||
*
|
||||
* val Data value to encode (see Notes #1 & #3b).
|
||||
*
|
||||
* Return(s) : none.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) Encode data values into CPU memory based on the values' data-word order :
|
||||
*
|
||||
* MEM_VAL_SET_xxx_BIG() Encode big- endian data values -- data words' most
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_SET_xxx_LITTLE() Encode little-endian data values -- data words' least
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_SET_xxx() Encode data values using CPU's native or configured
|
||||
* data-word order
|
||||
*
|
||||
* See also 'cpu.h CPU WORD CONFIGURATION Note #2'.
|
||||
*
|
||||
* (2) CPU memory addresses/pointers NOT checked for NULL.
|
||||
*
|
||||
* (3) (a) MEM_VAL_SET_xxx() macro's encode data values without regard to CPU word-aligned addresses.
|
||||
* Thus for processors that require data word alignment, data words can be encoded to any
|
||||
* CPU address, word-aligned or not, without generating data-word-alignment exceptions/faults.
|
||||
*
|
||||
* (b) However, 'val' data value to encode MUST start on an appropriate CPU word-aligned address.
|
||||
*
|
||||
* See also 'MEMORY DATA VALUE MACRO'S Note #1'.
|
||||
*
|
||||
* (4) MEM_VAL_COPY_SET_xxx() macro's are more efficient than MEM_VAL_SET_xxx() macro's & are
|
||||
* also independent of CPU data-word-alignment & SHOULD be used whenever possible.
|
||||
*
|
||||
* See also 'MEM_VAL_COPY_SET_xxx() Note #4'.
|
||||
*
|
||||
* (5) The 'CPU_CFG_ENDIAN_TYPE' pre-processor 'else'-conditional code SHOULD never be compiled/
|
||||
* linked since each 'cpu.h' SHOULD ensure that the CPU data-word-memory order configuration
|
||||
* constant (CPU_CFG_ENDIAN_TYPE) is configured with an appropriate data-word-memory order
|
||||
* value (see 'cpu.h CPU WORD CONFIGURATION Note #2'). The 'else'-conditional code is
|
||||
* included as an extra precaution in case 'cpu.h' is incorrectly configured.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define MEM_VAL_SET_INT08U_BIG(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT08U)(val)) & 0xFF) >> (0 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
#define MEM_VAL_SET_INT16U_BIG(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT16U)(val)) & 0xFF00) >> (1 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT16U)(val)) & 0x00FF) >> (0 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
#define MEM_VAL_SET_INT32U_BIG(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0xFF000000) >> (3 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x00FF0000) >> (2 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 2)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x0000FF00) >> (1 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 3)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x000000FF) >> (0 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_SET_INT08U_LITTLE(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT08U)(val)) & 0xFF) >> (0 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
#define MEM_VAL_SET_INT16U_LITTLE(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT16U)(val)) & 0x00FF) >> (0 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT16U)(val)) & 0xFF00) >> (1 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
#define MEM_VAL_SET_INT32U_LITTLE(addr, val) { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x000000FF) >> (0 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x0000FF00) >> (1 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 2)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0x00FF0000) >> (2 * DEF_OCTET_NBR_BITS))); \
|
||||
(*(((CPU_INT08U *)(addr)) + 3)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & 0xFF000000) >> (3 * DEF_OCTET_NBR_BITS))); }
|
||||
|
||||
|
||||
|
||||
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
|
||||
|
||||
#define MEM_VAL_SET_INT08U(addr, val) MEM_VAL_SET_INT08U_BIG(addr, val)
|
||||
#define MEM_VAL_SET_INT16U(addr, val) MEM_VAL_SET_INT16U_BIG(addr, val)
|
||||
#define MEM_VAL_SET_INT32U(addr, val) MEM_VAL_SET_INT32U_BIG(addr, val)
|
||||
|
||||
#elif (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_LITTLE)
|
||||
|
||||
#define MEM_VAL_SET_INT08U(addr, val) MEM_VAL_SET_INT08U_LITTLE(addr, val)
|
||||
#define MEM_VAL_SET_INT16U(addr, val) MEM_VAL_SET_INT16U_LITTLE(addr, val)
|
||||
#define MEM_VAL_SET_INT32U(addr, val) MEM_VAL_SET_INT32U_LITTLE(addr, val)
|
||||
|
||||
#else /* See Note #5. */
|
||||
|
||||
#error "CPU_CFG_ENDIAN_TYPE illegally #defined in 'cpu.h' "
|
||||
#error " [See 'cpu.h CONFIGURATION ERRORS']"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEM_VAL_COPY_GET_xxx()
|
||||
*
|
||||
* Description : Copy & decode data values from any CPU memory address to any CPU memory address.
|
||||
*
|
||||
* Argument(s) : addr_dest Lowest CPU memory address to copy/decode source address's data value
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* addr_src Lowest CPU memory address of data value to copy/decode
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* Return(s) : none.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) Copy/decode data values based on the values' data-word order :
|
||||
*
|
||||
* MEM_VAL_COPY_GET_xxx_BIG() Decode big- endian data values -- data words' most
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_COPY_GET_xxx_LITTLE() Decode little-endian data values -- data words' least
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_COPY_GET_xxx() Decode data values using CPU's native or configured
|
||||
* data-word order
|
||||
*
|
||||
* See also 'cpu.h CPU WORD CONFIGURATION Note #2'.
|
||||
*
|
||||
* (2) CPU memory addresses/pointers NOT checked for NULL.
|
||||
*
|
||||
* (3) MEM_VAL_COPY_GET_xxx() macro's copy/decode data values without regard to CPU word-aligned
|
||||
* addresses. Thus for processors that require data word alignment, data words can be copied/
|
||||
* decoded to/from any CPU address, word-aligned or not, without generating data-word-alignment
|
||||
* exceptions/faults.
|
||||
*
|
||||
* (4) MEM_VAL_COPY_GET_xxx() macro's are more efficient than MEM_VAL_GET_xxx() macro's & are
|
||||
* also independent of CPU data-word-alignment & SHOULD be used whenever possible.
|
||||
*
|
||||
* See also 'MEM_VAL_GET_xxx() Note #4'.
|
||||
*
|
||||
* (5) Since octet-order copy/conversion are inverse operations, memory data value gets/sets are
|
||||
* inverse operations.
|
||||
*
|
||||
* See also 'MEM_VAL_COPY_SET_xxx() Note #5'.
|
||||
*
|
||||
* (6) The 'CPU_CFG_ENDIAN_TYPE' pre-processor 'else'-conditional code SHOULD never be compiled/
|
||||
* linked since each 'cpu.h' SHOULD ensure that the CPU data-word-memory order configuration
|
||||
* constant (CPU_CFG_ENDIAN_TYPE) is configured with an appropriate data-word-memory order
|
||||
* value (see 'cpu.h CPU WORD CONFIGURATION Note #2'). The 'else'-conditional code is
|
||||
* included as an extra precaution in case 'cpu.h' is incorrectly configured.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
/*$PAGE*/
|
||||
|
||||
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT16U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT32U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 2)) = (*(((CPU_INT08U *)(addr_src)) + 2)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 3)) = (*(((CPU_INT08U *)(addr_src)) + 3)); }
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT16U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT32U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 3)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 2)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 2)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 3)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT08U_BIG(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_GET_INT16U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT16U_BIG(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_GET_INT32U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U_BIG(addr_dest, addr_src)
|
||||
|
||||
|
||||
|
||||
|
||||
#elif (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_LITTLE)
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT16U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT32U_BIG(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 3)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 2)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 2)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 3)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT16U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); }
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT32U_LITTLE(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 2)) = (*(((CPU_INT08U *)(addr_src)) + 2)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 3)) = (*(((CPU_INT08U *)(addr_src)) + 3)); }
|
||||
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_GET_INT08U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT08U_LITTLE(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_GET_INT16U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT16U_LITTLE(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_GET_INT32U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U_LITTLE(addr_dest, addr_src)
|
||||
|
||||
|
||||
|
||||
|
||||
#else /* See Note #6. */
|
||||
|
||||
#error "CPU_CFG_ENDIAN_TYPE illegally #defined in 'cpu.h' "
|
||||
#error " [See 'cpu.h CONFIGURATION ERRORS']"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEM_VAL_COPY_SET_xxx()
|
||||
*
|
||||
* Description : Copy & encode data values from any CPU memory address to any CPU memory address.
|
||||
*
|
||||
* Argument(s) : addr_dest Lowest CPU memory address to copy/encode source address's data value
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* addr_src Lowest CPU memory address of data value to copy/encode
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* Return(s) : none.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) Copy/encode data values based on the values' data-word order :
|
||||
*
|
||||
* MEM_VAL_COPY_SET_xxx_BIG() Encode big- endian data values -- data words' most
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_COPY_SET_xxx_LITTLE() Encode little-endian data values -- data words' least
|
||||
* significant octet @ lowest memory address
|
||||
* MEM_VAL_COPY_SET_xxx() Encode data values using CPU's native or configured
|
||||
* data-word order
|
||||
*
|
||||
* See also 'cpu.h CPU WORD CONFIGURATION Note #2'.
|
||||
*
|
||||
* (2) CPU memory addresses/pointers NOT checked for NULL.
|
||||
*
|
||||
* (3) MEM_VAL_COPY_SET_xxx() macro's copy/encode data values without regard to CPU word-aligned
|
||||
* addresses. Thus for processors that require data word alignment, data words can be copied/
|
||||
* encoded to/from any CPU address, word-aligned or not, without generating data-word-alignment
|
||||
* exceptions/faults.
|
||||
*
|
||||
* (4) MEM_VAL_COPY_SET_xxx() macro's are more efficient than MEM_VAL_SET_xxx() macro's & are
|
||||
* also independent of CPU data-word-alignment & SHOULD be used whenever possible.
|
||||
*
|
||||
* See also 'MEM_VAL_SET_xxx() Note #4'.
|
||||
*
|
||||
* (5) Since octet-order copy/conversion are inverse operations, memory data value gets/sets
|
||||
* are inverse operations.
|
||||
*
|
||||
* See also 'MEM_VAL_COPY_GET_xxx() Note #5'.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/* See Note #5. */
|
||||
#define MEM_VAL_COPY_SET_INT08U_BIG(addr_dest, addr_src) MEM_VAL_COPY_GET_INT08U_BIG(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT16U_BIG(addr_dest, addr_src) MEM_VAL_COPY_GET_INT16U_BIG(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT32U_BIG(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U_BIG(addr_dest, addr_src)
|
||||
|
||||
#define MEM_VAL_COPY_SET_INT08U_LITTLE(addr_dest, addr_src) MEM_VAL_COPY_GET_INT08U_LITTLE(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT16U_LITTLE(addr_dest, addr_src) MEM_VAL_COPY_GET_INT16U_LITTLE(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT32U_LITTLE(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U_LITTLE(addr_dest, addr_src)
|
||||
|
||||
|
||||
#define MEM_VAL_COPY_SET_INT08U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT08U(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT16U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT16U(addr_dest, addr_src)
|
||||
#define MEM_VAL_COPY_SET_INT32U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U(addr_dest, addr_src)
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEM_VAL_COPY_xxx()
|
||||
*
|
||||
* Description : Copy data values from any CPU memory address to any CPU memory address.
|
||||
*
|
||||
* Argument(s) : addr_dest Lowest CPU memory address to copy source address's data value
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* addr_src Lowest CPU memory address of data value to copy
|
||||
* (see Notes #2 & #3).
|
||||
*
|
||||
* Return(s) : none.
|
||||
*
|
||||
* Caller(s) : Application.
|
||||
*
|
||||
* Note(s) : (1) MEM_VAL_COPY_xxx() macro's copy data values based on CPU's native data-word order.
|
||||
*
|
||||
* See also 'cpu.h CPU WORD CONFIGURATION Note #2'.
|
||||
*
|
||||
* (2) CPU memory addresses/pointers NOT checked for NULL.
|
||||
*
|
||||
* (3) MEM_VAL_COPY_xxx() macro's copy data values without regard to CPU word-aligned addresses.
|
||||
* Thus for processors that require data word alignment, data words can be copied to/from any
|
||||
* CPU address, word-aligned or not, without generating data-word-alignment exceptions/faults.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#define MEM_VAL_COPY_08(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); }
|
||||
|
||||
#define MEM_VAL_COPY_16(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); }
|
||||
|
||||
#define MEM_VAL_COPY_32(addr_dest, addr_src) { (*(((CPU_INT08U *)(addr_dest)) + 0)) = (*(((CPU_INT08U *)(addr_src)) + 0)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 1)) = (*(((CPU_INT08U *)(addr_src)) + 1)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 2)) = (*(((CPU_INT08U *)(addr_src)) + 2)); \
|
||||
(*(((CPU_INT08U *)(addr_dest)) + 3)) = (*(((CPU_INT08U *)(addr_src)) + 3)); }
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* FUNCTION PROTOTYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
void Mem_Init (void);
|
||||
|
||||
/* -------------- MEM API FNCTS -------------- */
|
||||
void Mem_Clr (void *pmem,
|
||||
CPU_SIZE_T size);
|
||||
|
||||
void Mem_Set (void *pmem,
|
||||
CPU_INT08U data_val,
|
||||
CPU_SIZE_T size);
|
||||
|
||||
void Mem_Copy (void *pdest,
|
||||
void *psrc,
|
||||
CPU_SIZE_T size);
|
||||
|
||||
CPU_BOOLEAN Mem_Cmp (void *p1_mem,
|
||||
void *p2_mem,
|
||||
CPU_SIZE_T size);
|
||||
|
||||
|
||||
|
||||
#if (LIB_MEM_CFG_POOL_EN == DEF_ENABLED) /* -------------- MEM POOL FNCTS -------------- */
|
||||
|
||||
void Mem_PoolCreate (MEM_POOL *pmem_pool,
|
||||
void *pmem_base_addr,
|
||||
CPU_SIZE_T mem_size,
|
||||
CPU_SIZE_T blk_nbr,
|
||||
CPU_SIZE_T blk_size,
|
||||
CPU_SIZE_T blk_align,
|
||||
CPU_SIZE_T *poctets_reqd,
|
||||
LIB_ERR *perr);
|
||||
|
||||
void *Mem_PoolBlkGet (MEM_POOL *pmem_pool,
|
||||
CPU_SIZE_T size,
|
||||
LIB_ERR *perr);
|
||||
|
||||
void Mem_PoolBlkFree(MEM_POOL *pmem_pool,
|
||||
void *pmem_blk,
|
||||
LIB_ERR *perr);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* CONFIGURATION ERRORS
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LIB_MEM_CFG_ARG_CHK_EXT_EN
|
||||
#error "LIB_MEM_CFG_ARG_CHK_EXT_EN not #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
|
||||
#elif ((LIB_MEM_CFG_ARG_CHK_EXT_EN != DEF_DISABLED) && \
|
||||
(LIB_MEM_CFG_ARG_CHK_EXT_EN != DEF_ENABLED ))
|
||||
#error "LIB_MEM_CFG_ARG_CHK_EXT_EN illegally #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifndef LIB_MEM_CFG_POOL_EN
|
||||
#error "LIB_MEM_CFG_POOL_EN not #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
|
||||
#elif ((LIB_MEM_CFG_POOL_EN != DEF_DISABLED) && \
|
||||
(LIB_MEM_CFG_POOL_EN != DEF_ENABLED ))
|
||||
#error "LIB_MEM_CFG_POOL_EN illegally #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
|
||||
|
||||
#elif (LIB_MEM_CFG_POOL_EN == DEF_ENABLED)
|
||||
|
||||
#ifndef LIB_MEM_CFG_HEAP_SIZE
|
||||
#error "LIB_MEM_CFG_HEAP_SIZE not #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be > 0] "
|
||||
|
||||
#elif (LIB_MEM_CFG_HEAP_SIZE < 1)
|
||||
|
||||
#error "LIB_MEM_CFG_HEAP_SIZE illegally #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be > 0] "
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE END
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* End of lib mem module include. */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,279 @@
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* uC/LIB
|
||||
* CUSTOM LIBRARY MODULES
|
||||
*
|
||||
* (c) Copyright 2004-2008; Micrium, Inc.; Weston, FL
|
||||
*
|
||||
* All rights reserved. Protected by international copyright laws.
|
||||
*
|
||||
* uC/LIB is provided in source form for FREE evaluation, for educational
|
||||
* use or peaceful research. If you plan on using uC/LIB in a commercial
|
||||
* product you need to contact Micrium to properly license its use in your
|
||||
* product. We provide ALL the source code for your convenience and to
|
||||
* help you experience uC/LIB. The fact that the source code is provided
|
||||
* does NOT mean that you can use it without paying a licensing fee.
|
||||
*
|
||||
* Knowledge of the source code may NOT be used to develop a similar product.
|
||||
*
|
||||
* Please help us continue to provide the Embedded community with the finest
|
||||
* software available. Your honesty is greatly appreciated.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
*
|
||||
* ASCII STRING MANAGEMENT
|
||||
*
|
||||
* Filename : lib_str.h
|
||||
* Version : V1.25
|
||||
* Programmer(s) : ITJ
|
||||
* JDH
|
||||
*********************************************************************************************************
|
||||
* Note(s) : (1) NO compiler-supplied standard library functions are used in library or product software.
|
||||
*
|
||||
* (a) ALL standard library functions are implemented in the custom library modules :
|
||||
*
|
||||
* (1) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (2) \<Custom Library Directory>\Ports\<cpu>\<compiler>\lib*_a.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (b) Product-specific library functions are implemented in individual products.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LIB_STR_MODULE_PRESENT
|
||||
#define LIB_STR_MODULE_PRESENT
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* INCLUDE FILES
|
||||
*
|
||||
* Note(s) : (1) The following common software files are located in the following directories :
|
||||
*
|
||||
* (a) \<Custom Library Directory>\lib*.*
|
||||
*
|
||||
* (b) (1) \<CPU-Compiler Directory>\cpu_def.h
|
||||
*
|
||||
* (2) \<CPU-Compiler Directory>\<cpu>\<compiler>\cpu*.*
|
||||
*
|
||||
* where
|
||||
* <Custom Library Directory> directory path for custom library software
|
||||
* <CPU-Compiler Directory> directory path for common CPU-compiler software
|
||||
* <cpu> directory name for specific processor (CPU)
|
||||
* <compiler> directory name for specific compiler
|
||||
*
|
||||
* (2) Compiler MUST be configured to include the '\<Custom Library Directory>\uC-LIB\',
|
||||
* '\<CPU-Compiler Directory>\' directory, & the specific CPU-compiler directory as
|
||||
* additional include path directories.
|
||||
*
|
||||
* (3) NO compiler-supplied standard library functions SHOULD be used.
|
||||
*
|
||||
* #### The reference to standard library header files SHOULD be removed once all custom
|
||||
* library functions are implemented WITHOUT reference to ANY standard library function(s).
|
||||
*
|
||||
* See also 'STANDARD LIBRARY MACRO'S Note #1'.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#include <uC-CPU\ARM-Cortex-M3\RealView\cpu.h>
|
||||
#include <lib_def.h>
|
||||
#include <app_cfg.h>
|
||||
|
||||
/* See Note #3. */
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* EXTERNS
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifdef LIB_STR_MODULE
|
||||
#define LIB_STR_EXT
|
||||
#else
|
||||
#define LIB_STR_EXT extern
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEFAULT CONFIGURATION
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MEMORY POOL CONFIGURATION
|
||||
*
|
||||
* Note(s) : (1) Configure LIB_STR_CFG_FP_EN to enable/disable floating point string function(s).
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
/* Configure floating point feature(s) [see Note #1] : */
|
||||
#ifndef LIB_STR_CFG_FP_EN
|
||||
#define LIB_STR_CFG_FP_EN DEF_DISABLED
|
||||
/* DEF_DISABLED Floating point functions DISABLED */
|
||||
/* DEF_ENABLED Floating point functions ENABLED */
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DEFINES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* DATA TYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* GLOBAL VARIABLES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MACRO'S
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* STANDARD LIBRARY MACRO'S
|
||||
*
|
||||
* Note(s) : (1) NO compiler-supplied standard library functions SHOULD be used.
|
||||
*
|
||||
* #### The reference to standard memory functions SHOULD be removed once all custom library
|
||||
* functions are implemented WITHOUT reference to ANY standard library function(s).
|
||||
*
|
||||
* See also 'INCLUDE FILES Note #3'.
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
/* See Note #1. */
|
||||
#define Str_IsPrint(a) isprint(a)
|
||||
|
||||
#define Str_ToLong(a, b, c) strtol((char *)a, (char **)b, c)
|
||||
#define Str_FmtPrint snprintf
|
||||
#define Str_FmtScan sscanf
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* FUNCTION PROTOTYPES
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
CPU_SIZE_T Str_Len (CPU_CHAR *pstr);
|
||||
|
||||
|
||||
|
||||
CPU_CHAR *Str_Copy (CPU_CHAR *pdest,
|
||||
CPU_CHAR *psrc);
|
||||
|
||||
CPU_CHAR *Str_Copy_N (CPU_CHAR *pdest,
|
||||
CPU_CHAR *psrc,
|
||||
CPU_SIZE_T len_max);
|
||||
|
||||
|
||||
CPU_CHAR *Str_Cat (CPU_CHAR *pdest,
|
||||
CPU_CHAR *pstr_cat);
|
||||
|
||||
CPU_CHAR *Str_Cat_N (CPU_CHAR *pdest,
|
||||
CPU_CHAR *pstr_cat,
|
||||
CPU_SIZE_T len_max);
|
||||
|
||||
|
||||
|
||||
CPU_INT16S Str_Cmp (CPU_CHAR *p1_str,
|
||||
CPU_CHAR *p2_str);
|
||||
|
||||
CPU_INT16S Str_Cmp_N (CPU_CHAR *p1_str,
|
||||
CPU_CHAR *p2_str,
|
||||
CPU_SIZE_T len_max);
|
||||
|
||||
|
||||
CPU_CHAR *Str_Char (CPU_CHAR *pstr,
|
||||
CPU_CHAR srch_char);
|
||||
|
||||
CPU_CHAR *Str_Char_N (CPU_CHAR *pstr,
|
||||
CPU_SIZE_T len_max,
|
||||
CPU_CHAR srch_char);
|
||||
|
||||
CPU_CHAR *Str_Char_Last(CPU_CHAR *pstr,
|
||||
CPU_CHAR srch_char);
|
||||
|
||||
|
||||
CPU_CHAR *Str_Str (CPU_CHAR *pstr,
|
||||
CPU_CHAR *srch_str);
|
||||
|
||||
|
||||
|
||||
#if (LIB_STR_CFG_FP_EN == DEF_ENABLED)
|
||||
CPU_CHAR *Str_FmtNbr_32(CPU_FP32 nbr,
|
||||
CPU_INT08U nbr_dig,
|
||||
CPU_INT08U nbr_dp,
|
||||
CPU_BOOLEAN lead_zeros,
|
||||
CPU_BOOLEAN nul,
|
||||
CPU_CHAR *pstr_fmt);
|
||||
#endif
|
||||
|
||||
|
||||
/*$PAGE*/
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* CONFIGURATION ERRORS
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LIB_STR_CFG_FP_EN
|
||||
#error "LIB_STR_CFG_FP_EN not #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
|
||||
#elif ((LIB_STR_CFG_FP_EN != DEF_DISABLED) && \
|
||||
(LIB_STR_CFG_FP_EN != DEF_ENABLED ))
|
||||
#error "LIB_STR_CFG_FP_EN illegally #define'd in 'app_cfg.h'"
|
||||
#error " [MUST be DEF_DISABLED] "
|
||||
#error " [ || DEF_ENABLED ] "
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************************************
|
||||
* MODULE END
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* End of lib str module include. */
|
||||
|
||||
Reference in New Issue
Block a user