现在的位置: 首页 > 综合 > 正文

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

2013年10月12日 ⁄ 综合 ⁄ 共 4507字 ⁄ 字号 评论关闭



 
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

 

抱歉!评论已关闭.