S3C2440开发工具realview MDK4.22之库的使用
如果你写了一个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写,还有
S3C2440开发工具realviewMDK4 2 相关文章:
- S3C2440开发工具realview MDK4.22使用入门(11-19)
- Linux2.4内核为我们带来了什么?(11-12)
- RedHatLinux新手入门教程(11-12)
- RedHatLinux新手入门教程(2)(11-12)
- 让Windows系统也能访问Linux文件系统(04-15)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)