微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440开发工具realview MDK4.22之库的使用

S3C2440开发工具realview MDK4.22之库的使用

时间:11-19 来源:互联网 点击:
一。与c库会强制链接

如果你写了一个c程序,必然会和c库链接,尽管你没有直接使用c库函数。这是因为编译器为了改进程序,可能隐含的产生了对c库函数调用。

即便你的程序没有main()函数,也只是说c库没变初始化而已,一些c库函数仍然可以使用并且编译器可以隐含地调用这些函数。

二。ARM的c的运行时库

c标准库由以下组成:

ISO99标准库定义的所有函数。

依赖于目标的函数,用来在semihosted环境中执行c库函数。你可以在你的应用程序中重定义这些函数。

被编译器隐含调用的函数。

由ARM扩展的,但是不是由ISO C定义,且包含在这个库里的。

c微型库由以下组成(可以代替c标准库,它是非常适合只有小容量内存的深度嵌入式应用):

为了达到最小的代码体积,已经高度优化的函数。

不服从ISO C规范的函数。

不服从1985 IEEE 754 标准

三。c库的特性

c库用标准的ARM semihosted 环境提供一些功能,不如说输入、输出。该环境由ARM RVI调试单元和Real-Time Simulator Model/(RTSM)所支持的。

你可以重新定义任何与设备相关的c库函数,写在自己的应用程序中即可。这允许你裁剪c库以应用在自己的执行环境中。

也可以裁剪与设备无关的函数,以适应自己的特殊应用要求。例如malloc簇,ctype簇,所有的locale-specific函数。

许多c库函数与其他函数是独立的并且是目标无关的,你可以简单的从库里利用这些函数。

c库函数负责以下事情:

1.创建一个c环境的执行环境(创建栈,如果需要创建堆,初始化程序里用到的库的部分)

2.开始执行main()

3.支持ISO C定义的函数

4.捕获允许错误、信号,根据情况终止程序或者退出程序

四。ARM C库的堆使用需求

任何暗含的使用堆或者显示调用使用堆都需要事先准备好堆。

在c标准库里,暗含的堆使用发生在:

1.调用库函数fopen()并且一个I/O操作第一次使用这个fopen()所产生的stream

2.传递命令行参数给main()函数

分配80字节堆作为FILE结构体的存储空间。当第一次I/O操作发生,且直到这个操作产生,一个附加的512字节堆空间分配给与该操作相关的buffer区。可以利用setvbuf()重新

定义堆大小。

当fclose()调用的时候,80字节未被释放,保存在一个自由表中以备再次使用。512字节在fclose()时候被释放了。

声明带参数的main()需要256字节的堆空间。这个内存一直未释放,因为要在main()期间有效。在microlib里,不允许声明带参的main(),因此这个用法仅使用于标准库。在

标准库的环境里,如果存在堆,它就可以生效。

五。c库基于不同的build options会选择不同的目标集

比如说,目标架构,指令集(ARM,Thumb,Thumb-2);字节须(大小端);浮点支持(softVFP,VFP);位置无关

六。Thumb C 库

当连接器探测到以下事情发生的时候,会自动连接Thumb C库:

1.Thumb or Thumb-2 or --thumb选项 or #pragma thumb

2.在ARMv4T下,使用--apcs / interwork

3.ARMv6-M Cortex-M1/MO

4.ARMv7-M Cortex-M3

七。ARM C库和多线程

当你使用RTOS,ARM C库支持多线程

八。__user_libspace

__user_libspace为C库保持了静态数据。这是一个96字节,0初始化的数据块,该块由C库创建。在C库初始化期间可以用来当做临时栈。

默认的ARM C库用__user_libspace区域保持以下内容:

1.errno,由可以设置errno的函数使用。默认,__rt_errno_addr()返回指向errno的指针。

2.浮点状态字,用于软件浮点。在硬件浮点里,不使用。默认,__re_fp_status_addr()返回指向FP状态字的指针。

3.一个指向堆基址的指针,也就是__Heap_Descriptor,被所有malloc-相关的函数使用。

4.当前的locale设置,被像setlocale()函数使用,同时也被所有依赖于它们的其它函数使用。

九。在一个程序中使用库

可以用以下方法在应用程序使用C库:

1.建立一个semihosting应用,它可以在一个semihosted环境中调试,比如说利用RV。

2.建立一个非host的应用,它可以嵌入到ROM中。

3.建立一个不包含main()的应用,且不初始化库。该应用具有非常有限的库功能,除非重定义一些函数。

十。在一个semihosting环境利用C库

如果你开发一个应用,为了调试,运行在semihosted环境,你必须有一个执行环境,可以支持ARM 或者 Thumb semihosting,且有足够的存储空间。

1.用标准的半主机功能,默认情况下,在RVI中会提供。

2.为半主机调用执行自己的处理过程。

如果使用默认的C库的半主机功能,不必重写任何函数和头文件。ARM调试代理支持半主机,但是C库所假定的内存格局需要裁减以匹配正在调试的硬件。

十一。使用$sub$$使用半主机和非半主机I/O功能

例如,fputc()的实现是直接往UART写,还有

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top