memcpy(), memcpy_isr()

Updated: May 06, 2022

Copy bytes from one buffer to another

Synopsis:

#include <string.h>

void* memcpy( void* dst,
              const void* src,
              size_t length );

void* memcpy_isr( void* dst,
                  const void* src,
                  size_t length );

Arguments:

dest
A pointer to where you want the function to copy the data.
src
A pointer to the buffer that you want to copy data from.
length
The number of bytes to copy.

Library:

libc

Use the -l c option to qcc to link against this library. This library is usually included automatically.

Description:

The memcpy() function copies length bytes from the buffer pointed to by src into the buffer pointed to by dst. The memcpy_isr() function is similar, but it's safe for you to use in an interrupt service routine.

Note: Copying overlapping buffers isn't guaranteed to work; use memmove() to copy buffers that overlap.

Returns:

A pointer to the destination buffer (that is, the value of dst).

Examples:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
    char buffer[80];

    memcpy( buffer, "Hello", 5 );
    buffer[5] = '\0';
    printf( "%s\n", buffer );
    
    return EXIT_SUCCESS;
}

Environment variables:

LIBC_STRINGS
On certain targets, you can use this environment variable to select the implementation of memcpy(). It doesn't affect the implementation of memcpy_isr(). The value is one of the strings given below.
  • for AArch64 targets:
    • aarch64_neon — optimized for AARCH64 targets using NEON
    • generic — the default
  • for ARMv7 targets:
    • cortex_a9 — optimized for the ARM Cortex-A9 processor; assumes that no unaligned access is supported
    • cortex_a9_aligned — optimized for ARM Cortex-A9; requires that unaligned memory access be enabled on the platform. If memory access is misaligned, this implementation falls back to the NEON version.
    • cortex_a9_neon — optimized for ARM Cortex-A9 using NEON
    • generic — the default
    • krait — optimized for the Qualcomm Krait CPU
    • krait_neon — optimized for Qualcomm Krait using NEON

Processes that register ISRs shouldn't use the NEON versions.

Classification:

memcpy() is ANSI, POSIX 1003.1; memcpy_isr() is QNX Neutrino.

Table 1. memcpy()
Safety:  
Cancellation point No
Interrupt handler Read the Caveats
Signal handler Yes
Thread Yes
Table 2. memcpy_isr()
Safety:  
Cancellation point No
Interrupt handler Yes
Signal handler Yes
Thread Yes

Caveats:

Implementations of memcpy() that are optimized using SIMD instructions aren't safe to use in an interrupt handler. These include the NEON implementations on ARMv7 and AArch64.