memset(), memset_isr()

Updated: May 06, 2022

Set memory to a given value

Synopsis:

#include <string.h>

void* memset( void* dst,
              int c,
              size_t length );

void* memset_isr( void* dst,
                  int c,
                  size_t length );

Arguments:

dst
A pointer to the memory that you want to set.
c
The value that you want to store in each byte.
length
The number of bytes to set.

Library:

libc

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

Description:

The memset() function fills length bytes starting at dst with the value c. The memset_isr() function is similar, but it's safe for you to use it in an interrupt service routine.

Note: The compiler might optimize out calls to memset if it appears that the memory isn't used again in the calling function. For a secure routine that forces the memory to be set, call memset_s().

Returns:

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

Examples:

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

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

    memset( buffer, '=', 80 );
    buffer[79] = '\0';
    
    puts( buffer );
    
    return EXIT_SUCCESS;
}

Environment variables:

LIBC_STRINGS
On certain targets, you can use this environment variable to select the implementation of memset(). It doesn't affect the implementation of memset_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:

memset() is ANSI, POSIX 1003.1; memset_isr() is QNX Neutrino.

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

Caveats:

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