Keil™, An ARM® Company

RealView Libraries and Floating Point Support Guide

Technical Support

On-Line Manuals

RealView Libraries and Floating Point Support Guide

Preface
Introduction
The C and C++ Libraries
About the C and C++ libraries
Features of the C and C++ libraries
Namespaces
Writing reentrant and thread‑safe code
Introduction to reentrancy and thread‑safety
Use of static data in the C libraries
The __user_libspace static data area
Managing locks in multithreaded applications
Using the ARM C libraries with a multithreaded app
Thread‑safety in the ARM C libraries
Thread‑safety in the ARM C++ libraries
Building an application with the C library
Using the libraries with an application
Building an application for a semihosted environme
Building an application for a non semihosting envi
Building an application without the C library
Integer and FP helper functions
Bare machine integer C
Bare machine C with floating‑point
Exploiting the C library
The standalone C library functions
Tailoring the C library to a new execution environ
How C and C++ programs use the library functions
__rt_entry
Exiting from the program
__rt_exit()
__rt_lib_init()
__rt_lib_shutdown()
Tailoring static data access
Tailoring locale and CTYPE using assembler macros
Selecting locale at link time
Selecting locale at runtime
Defining a locale block
LC_CTYPE data block
LC_COLLATE data block
LC_MONETARY data block
LC_NUMERIC data block
LC_TIME data block
_get_lconv()
localeconv()
setlocale()
_findlocale()
The lconv structure
Tailoring locale and CTYPE using C macros
Selecting locale at link time
Selecting locale at runtime
Macros and utility functions
_get_lc_ctype()
_get_lc_collate()
_get_lc_monetary()
_get_lc_numeric()
_get_lc_time()
_get_lconv()
localeconv()
setlocale()
_findlocale()
__LC_CTYPE_DEF
__LC_COLLATE_DEF
__LC_TIME_DEF
__LC_NUMERIC_DEF
__LC_MONETARY_DEF
__LC_INDEX_END
The lconv structure
Tailoring error signaling, error handling, and pro
_sys_exit()
errno
__rt_errno_addr()
__raise()
__rt_raise()
__default_signal_handler()
_ttywrch()
__rt_fp_status_addr()
Tailoring storage management
Avoiding the ARM‑supplied heap and heap‑using
Support for malloc
Tailoring the runtime memory model
The memory models
Controlling the runtime memory model
Writing your own memory model
__user_initial_stackheap()
__user_setup_stackheap()
__user_heap_extend()
__user_heap_extent()
__user_stack_cleanup_space()
__rt_heap_extend()
__rt_stack_postlongjmp()
Tailoring the input/output functions
Dependencies on low‑level functions
Target‑dependent input/output support functions
_sys_open()
_sys_close()
_sys_read()
_sys_write()
_sys_ensure()
_sys_flen()
_sys_seek()
_sys_istty()
_sys_tmpnam()
_sys_command_string()
#pragma import(_main_redirection)
Tailoring other C library functions
clock()
_clock_init()
time()
remove()
rename()
system()
getenv()
_getenv_init()
Selecting real‑time division
ISO implementation definition
ISO C library implementation definition
Standard C++ library implementation definition
C library extensions
atoll()
strtoll()
strtoull()
printf()
snprintf()
vsnprintf()
lldiv()
llabs()
wcstombs()
alloca()
strlcpy()
strlcat()
_fisatty()
__heapstats()
__heapvalid()
Library naming conventions
Placing ARM libraries
Helper libraries
Identifying library variants
The C Micro-library
Floating‑point Support

The __user_libspace static data area

2.2.3. The __user_libspace static data area

The __user_libspace static data area holds the static data for the C libraries. This is a block of 96 bytes of zero-initialized data, supplied by the C library. It is also used as a temporary stack during C library initialization.

The default ARM C libraries use the __user_libspace area to hold:

  • errno, used by any function that is capable of setting errno. By default, __rt_errno_addr() returns a pointer to errno.

  • The FP status word for software floating‑point (exception flags, rounding mode). It is unused in hardware floating‑point. By default, __rt_fp_status_addr() returns a pointer to the FP status word.

  • A pointer to the base of the heap (that is, the __Heap_Descriptor), used by all the malloc‑related functions.

  • The alloca state, used by alloca() and its helper functions.

  • The current locale settings, used by functions such as setlocale(), but also used by all other library functions which depend on them. For example, the ctype.h functions have to access the LC_CTYPE setting.

The C++ libraries use the __user_libspace area to hold:

  • The new_handler field and ddtor_pointer:

    • the new_handler field is used to keep track of the value passed to std::set_new_handler()

    • the ddtor_pointer is used by __cxa_atexit() and __aeabi_atexit().

  • C++ exception handling information for functions such as std::set_terminate() and std::set_unexpected().

For more information on __aeabi_atexit(), std::set_terminate() and std::set_unexpected(), see the ARM website for the following specifications: CPPABI and the Exception Handling ABI for the ARM Architecture.

Note

How the C and C++ libraries use the __user_libspace area might change in future releases.

Addressing __user_libspace

Two wrapper functions are provided to return a subsection of the __user_libspace static data area:

__user_perproc_libspace()

Returns a pointer to 96 bytes used to store data that is global to an entire process, that is data shared between all threads.

__user_perthread_libspace()

Returns a pointer to 96 bytes used to store data that is local to a particular thread. This means that __user_perthread_libspace() returns a different address depending on the thread it is called from.

Re‑implementing __user_libspace

The __user_libspace() function does not normally have to be redefined. However, if you are writing an operating system or a process switcher, you must re‑implement this function. See Tailoring static data access for more information.

Where you are porting single‑threaded processes to RVCT that re‑implement this function, you can continue to do this without having to change your code. The change in behavior is, however, important if you are using RVCT to write multithreaded applications.

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0378A