You copied the Doc URL to your clipboard.

Use of static data in the C libraries

Static data refers to persistent read/write data that is not stored on the stack or the heap. This persistent data can be external or internal in scope, and is at a fixed address.

Libraries that use static data might be reentrant, but this depends on their use of the __user_libspace static data area, and on the build options you choose:

  • When compiled with --apcs /norwpi, read/write static data is addressed in a position-dependent fashion. This is the default. Code from these variants is single-threaded because it uses read/write static data.

  • When compiled with --apcs /rwpi, read/write static data is addressed in a position-independent fashion using offsets from the static base register sb. Code from these variants is reentrant and can be multithreaded if each thread uses a different static base value.

The following describes how the C libraries use static data:

  • The floating-point arithmetic libraries fz_* and fj_* do not use static data and are always reentrant. However, the f_* and g_* libraries do use static data.

  • All statically-initialized data in the C libraries is read-only.

  • All writable static data is zero initialized.

  • Most C library functions use no writable static data and are reentrant

  • Some functions have static data implicit in their definitions. You must not use these in a reentrant application.

Note

Exactly which functions use static data in their definitions might change in future releases.

Callouts from the C library enable access to static data. C library functions that use static data can be categorized as:

  • Functions that do not use any static data of any kind, for example fprintf().

  • Functions that manage a static state, such as malloc(), rand(), and strtok().

  • Functions that do not manage a static state, but use static data in a way that is specific to the implementation in the ARM compiler, for example isalpha().

When the C library does something that requires implicit static data, it uses a callout to a function you can replace. These functions are shown in Table 1. They do not use semihosting.

Table 1. C library callouts
FunctionDescription
__rt_errno_addr()Called to get the address of the variable errno.
__rt_fp_status_addr()Called by the floating-point support code to get the address of the floating-point status word.
locale functionsThe function __user_libspace() creates a block of private static data for the library.

The default implementation of __user_libspace creates a 96-byte block in the ZI region. Even if your application does not have a main() function, the __user_libspace() function does not normally have to be redefined.

Note

Exactly which functions use static data in their definitions might change in future releases.

Was this page helpful? Yes No