__rt_entry, __rt_exit(), __rt_lib_init(), __rt_lib_shutdown(), --strict, --no_strict

  2.5.2 __rt_entry

The symbol __rt_entry is the starting point for a program using the ARM C library.

Control passes to __rt_entry after all scatter-load regions have been relocated to their

execution addresses.

Usage

The default implementation of __rt_entry :

1. Sets up the heap and stack.

2. Initializes the C library, by calling __rt_lib_init .

3. Calls main() .

4. Shuts down the C library, by calling __rt_lib_shutdown .

5. Exits.

__rt_entry must end with a call to one of the following functions:

exit() Calls atexit()- registered functions and shuts down the library.

__rt_exit() Shuts down the library but does not call atexit() functions.

_sys_exit() Exits directly to the execution environment. It does not shut down the

library and does not call atexit() functions. See _sys_exit() on

page 2-60.

2.5.3 Exiting from the program

The program can exit normally at the end of main() or it can exit prematurely because

of an error.

Exiting from an assert

The behavior of the assert macro depends on the conditions in operation at the most

recent occurrence of #include <assert.h> :

1. If the NDEBUG macro is defined (on the command line or as part of a source file),

the assert macro has no effect.

2. If the NDEBUG macro is not defined, the assert expression (the expression given to

the assert macro) is evaluated. If the result is TRUE , that is != 0 , the assert macro

has no more effect.

3. If the assert expression evaluates to FALSE , the assert macro calls the

__aeabi_assert() function if any of the following are true:

• you are compiling with --strict

• you are using - O0 or - O1

• you are compiling with --library_interface=aeabi_clib or

--library_interface=aeabi_glibc

__ASSERT_MSG is defined

_AEABI_PORTABILITY_LEVEL is defined and not 0.

4. Otherwise, if the assert expression evaluates to FALSE and the conditions

in point 3 do not apply, the assert macro calls abort() . Then:

a. abort() calls __rt_raise() .

b. If __rt_raise() returns, abort() tries to finalize the library.

If you are creating an application that does not use the library, __aeabi_assert()

if you reimplement abort() and the stdio functions.

Another solution for retargeting is to reimplement the __aeabi_assert() function

The function prototype is:

void __aeabi_assert( const char * expr , const char * file , int line );

where:

expr points to the string representation of the expression that was not TRUE

file and line identify the source location of the assertion.

The behavior for __aeabi_assert() supplied in the ARM C library is to print a message

on stderr and call abort() .

You can restore the default behavior for __aeabi_assert() at higher optimization levels

by defining __ASSERT_MSG .

2.5.4 __rt_exit()

This function shuts down the library but does not call functions registered with

atexit() .

Syntax

void __rt_exit( int code )

Where code is not used by the standard function.

Usage

Shuts down the C library by calling __rt_lib_shutdown , and then calls _sys_exit to

terminate the application. Reimplement _sys_exit rather than __rt_exit . See

_sys_exit() on page 2-60 for more information.

Return

The function does not return.

2.5.5 __rt_lib_init()

This is the library initialization function and is the companion to __rt_lib_shutdown() .

Syntax

extern value_in_regs struct __argc_argv __rt_lib_init( unsigned heapbase ,

unsigned heaptop )

where:

heapbase The start of the heap memory block.

heaptop The end of the heap memory block.

Usage

This is the library initialization function. It is called immediately after

__rt_stackheap_init() and passed an initial chunk of memory to use as a heap. This

function is the standard ARM library initialization function and must not be

reimplemented.

Return

The function returns argc and argv ready to be passed to main() . The structure is

returned in the registers as:

struct __argc_argv

{ int argc;

char **argv;

int r2, r3;

};

2.5.6 __rt_lib_shutdown()

This is the library shutdown function and is the companion to __rt_lib_init() .

Syntax

void __rt_lib_shutdown( void )

Usage

This is the library shutdown function and is provided in case a user must call it directly.

This is the standard ARM library shutdown function and must not be reimplemented.

 

--strict , --no_strict

This option enforces or relaxes strict C or strict C++, depending on the choice of source language used.

When --strict is selected:

·         features that conflict with ISO C or ISO C++ are disabled

·         error messages are returned when nonstandard features are used.

Default

The default is --no_strict .

Usage

--strict enforces compliance with:

ISO C90

·   ISO/IEC 9899:1990, the 1990 International Standard for C.

·   ISO/IEC 9899 AM1, the 1995 Normative Addendum 1.

ISO C99

ISO/IEC 9899:1999, the 1999 International Standard for C.

ISO C++

ISO/IEC 14822:2003, the 2003 International Standard for C++.

Errors

When --strict is in force and a violation of the relevant ISO standard occurs, the compiler issues an error message.

The severity of diagnostic messages can be controlled in the usual way.

Example

void foo(void)

{

    long long i; /* okay in nonstrict C90 */

}

Compiling this code with --strict generates an error.

 

 

 

Reference :

       RealView® Compilation ToolsVersion 4.0-Libraries and Floating Point Support Guide

       http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0349bc/Chdeehge.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章