Keil Logo Arm Logo

Technical Support

On-Line Manuals

Libraries and Floating Point Support Guide

Conventions and feedback The ARM C and C++ libraries Mandatory linkage with the C library C and C++ runtime libraries C and C++ library features Library heap usage requirements of the ARM C and C Compliance with the Application Binary Interface ( Increasing portability of object files to other CL ARM C and C++ library directory structure Selection of ARM C and C++ library variants based Thumb C libraries C++ and C libraries and the std namespace ARM C libraries and multithreading ARM C libraries and reentrant functions ARM C libraries and thread-safe functions Use of static data in the C libraries Use of the __user_libspace static data area by the C library functions to access subsections of the _ Re-implementation of legacy function __user_libspa Management of locks in multithreaded applications How to ensure re-implemented mutex functions are c Using the ARM C library in a multithreaded environ Thread safety in the ARM C library Thread safety in the ARM C++ library The floating-point status word in a multithreaded Using the C library with an application Using the C and C++ libraries with an application Using $Sub$$ to mix semihosted and nonsemihosted I Using the libraries in a nonsemihosting environmen C++ exceptions in a non-semihosting environment Direct semihosting C library function dependencies Indirect semihosting C library function dependenci C library API definitions for targeting a differen Building an application without the C library Creating an application as bare machine C without Integer and floating-point compiler functions and Bare machine integer C Bare machine C with floating-point processing Customized C library startup code and access to C Program design when exploiting the C library Using low-level functions when exploiting the C li Using high-level functions when exploiting the C l Using malloc() when exploiting the C library Tailoring the C library to a new execution environ How C and C++ programs use the library functions Initialization of the execution environment and ex C++ initialization, construction and destruction Legacy support for C$$pi_ctorvec instead of .init_ Exceptions system initialization Emergency buffer memory for exceptions Library functions called from main() Program exit and the assert macro Assembler macros that tailor locale functions in t Link time selection of the locale subsystem in the ISO8859-1 implementation Shift-JIS and UTF-8 implementation Runtime selection of the locale subsystem in the C Definition of locale data blocks in the C library LC_CTYPE data block LC_COLLATE data block LC_MONETARY data block LC_NUMERIC data block LC_TIME data block Modification of C library functions for error sign Modification of memory management functions in the Avoiding the heap and heap-using library functions C library support for memory allocation functions Heap1, standard heap implementation Heap2, alternative heap implementation Using a heap implementation from bare machine C Stack pointer initialization and heap bounds Defining __initial_sp, __heap_base and __heap_limi Extending heap size at runtime Legacy support for __user_initial_stackheap() Tailoring input/output functions in the C and C++ Target dependencies on low-level functions in the The C library printf family of functions The C library scanf family of functions Redefining low-level library functions to enable d The C library functions fread(), fgets() and gets( Re-implementing __backspace() in the C library Re-implementing __backspacewc() in the C library Redefining target-dependent system I/O functions i Tailoring non-input/output C library functions Real-time integer division in the ARM libraries Selecting real-time division in the ARM libraries How the ARM C library fulfills ISO C specification mathlib error handling ISO-compliant implementation of signals supported ISO-compliant C library input/output characteristi Standard C++ library implementation definition C library functions and extensions Persistence of C and C++ library names across rele Link time selection of C and C++ libraries Managing projects that have explicit C or C++ libr Compiler generated and library-resident helper fun C and C++ library naming conventions Using macro__ARM_WCHAR_NO_IO to disable FILE decla The ARM C micro-library Floating-point support

Libraries and Floating Point Support Guide

Stack pointer initialization and heap bounds

Stack pointer initialization and heap bounds

The C library requires you to specify where the stack pointer begins. If you intend to use ARM library functions that use the heap, for example, malloc(), calloc(), or if you define argc and argv command-line arguments for main(), the C library also requires you to specify which region of memory the heap is initially expected to use.

The region of memory used by the heap can be extended at a later stage of program execution, if required.

You can specify where the stack pointer begins, and which region of memory the heap is intially expected to use, with any of the following methods:

  • Define the symbol __intial_sp to point to the top of the stack. If using the heap, also define symbols __heap_base and __heap_limit.

  • In a scatter file, either:

    • define ARM_LIB_STACK and ARM_LIB_HEAP regions

    • if you do not intend to use the heap, only define an ARM_LIB_STACK region

    • define an ARM_LIB_STACKHEAP region.

    If you define an ARM_LIB_STACKHEAP region, the stack starts at the top of that region. The heap starts at the bottom.

    Note

    The above two methods are the only methods that microlib supports, of defining where the stack pointer starts and of defining the heap bounds.

  • Implement __user_setup_stackheap() to set up the stack pointer and return the bounds of the initial heap region.

  • If you are using legacy code that uses __user_initial_stackheap(), and you do not want to replace __user_initial_stackheap() with __user_setup_stackheap(), continue to use __user_initial_stackheap().

    Note

    ARM recommends that you switch to using __user_setup_stackheap() if you are still using __user_initial_stackheap(), unless your implementation of __user_initial_stackheap() is:

    • specialized in some way such that it is complex enough to require its own temporary stack to run on before it has created the proper stack

    • has some user-specific special requirement that means it has to be implemented in C rather than in assembly language.

The initial stack pointer must be aligned to a multiple of eight bytes.

By default, if memory allocated for the heap is destined to overlap with memory that lies in close proximity with the stack, the potential collision of heap and stack is automatically detected and the requested heap allocation fails. If you do not require this automatic collision detection, you can save a small amount of code size by disabling it with #pragma import __use_two_region_memory.

Note

The memory allocation functions (malloc(), realloc(), calloc(), posix_memalign()) attempt to detect allocations that collide with the current stack pointer. Such detection cannot be guaranteed to always be successful.

Although it is possible to automatically detect expansion of the heap into the stack, it is not possible to automatically detect expansion of the stack into heap memory.

For legacy purposes, it is possible for you to bypass all of these methods and behavior. You can do this by defining the following functions to perform your own stack and heap memory management:

  • __rt_stackheap_init()

  • __rt_heap_extend().

Copyright © 2007-2008, 2011-2012 ARM. All rights reserved.ARM DUI 0378D
Non-ConfidentialID062912

Keil logo

Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.