2.4.4. 使用 C 库

如果创建的应用程序包含 main() 函数,链接器将自动包含执行环境所需的初始化代码。 有关说明,请参阅使用 C 库构建应用程序。 但在某些情况下,您可能不希望或无法这样做。

可以创建一个由自定义启动代码组成的应用程序,并且应用程序仍使用很多库函数。 您必须满足以下条件之一:

程序设计

必须重新实现的函数取决于您需要多少库功能:

  • 如果仅需要用于除法、结构复制和 FP 算法的编译器支持函数,则必须提供 __rt_raise()。 这还可以启用非常简单的库函数,如 errno.hsetjmp.h 中的函数以及 string.h 中的大多数函数。

  • 如果显式地调用 setlocale(),则会激活与区域设置相关的函数。 这样,您便可使用 atoi 系列、sprintf()sscanf() 以及 ctype.h 中的函数。

  • 使用浮点的程序必须调用 _fp_init()。 如果选择软件浮点,程序还必须提供 __rt_fp_status_addr()。 如果未重新实现此函数,则缺省操作是创建一个 __user_libspace 区。 有关 __user_libspace 区的说明,请参阅__user_libspace 静态数据区

  • 对于使用 fprintf()fputs() 的函数,必须实现高级输入/输出支持。 高级输出函数依赖于 fputc()ferror()。 高级输入函数依赖于 fgetc()__backspace()

通过实现这些函数和堆,您几乎可以使用整个库。

使用低级函数

如果在没有 main() 函数的应用程序中使用库,则必须重新实现库中的某些函数。 有关详细信息,请参阅独立 C 库函数

__rt_raise() 是基本函数。 所有 FP 函数、整数除法(以便在除数为零时报告出现错误)以及某些其他库例程都需要使用此函数。 如果不实现一些需要 __rt_raise() 的操作,则可能无法编写出好的程序。

Note

如果要调用 rand(),则必须 先调用 srand()。 这是在库初始化期间自动完成的,但如果避免进行库初始化,则不会自动完成。

使用高级函数

如果重新实现了低级函数(如 fputc()),则可以使用高级 I/O 函数(如 fprintf())。 大多数设置了格式的输出函数也需要调用 setlocale()。 有关说明,请参阅调整输入/输出函数

要调用使用 locale 的任何内容,必须先调用 setlocale() 以对其进行初始化,例如,调用 setlocale(LC_ALL, "C")独立 C 库函数中介绍了使用区域设置的函数, 其中包括 ctype.hlocale.h 中的函数、printf() 系列、scanf() 系列、ato*strto*strcoll/strxfrm 以及 time.h 中的大多数函数。

使用 malloc()

如果裸机 C 需要堆支持,则必须先调用 _init_alloc() 以提供初始堆范围,并且必须 提供 __rt_heap_extend(),即使它只返回错误。 rt_heap.h 中提供了这两个函数的原型。

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0349AC
Non-Confidential