首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 操作系统 > Linux > Newlib库的优势利用
【标  题】:Newlib库的优势利用
【关键字】:Newlib
【来  源】:http://blog.chinaunix.net/article.php?articleId=60367&blogId=11037

Newlib库的优势利用

Newlib 是一个用于嵌入式系统的开放源代码的C语言程序库。特点是轻量级,速度快,可移植到很多CPU结构上。

Newlib库是一个复杂的标准C库,包括字符串支持,浮点运算,内存分配(malloc),和I/O流函数(printf,fprinf(),等等)。Newlib有两个组件构成:libc提供了主要的c语言库的实现,而libm提供了浮点运算支持。

为什么要为Newlib费心呢?如果你正在写一个非常小的嵌入式系统,你可能有自己的C标准库的子集。但是如果你要求很多的基本函数,那么一个现存的库能够帮你跳过大量的工作而使你集中力量在真正的任务上。这就是Newlib的价值,你可以从Newlib中的得到100,000多行的预先写好的经过测试的库代码。

尽管Newlib 提供了复杂的函数集,你不用担心它胀满你的ROM。代码是非常模块化的,所以你的目标代码连接器将在需要的时候从库中调用相应的功能。

发布与授权许可

Newlib库的发布是源代码级的,你在嵌入式应用中使用它前需要交叉编译生成二进制库。由于主要使用GNU GCC交叉编译器工具链,所以使用GCC配置和生成二进制库是一个简单的处理过程。你也可以使用非GCC工具,但需要更多的手工配置。

Newlib 包括了从各种资源中收集来的代码,多个免费软件授权的分发也反映了其起源的多样性。基本上它有一个嵌入式系统开发者所喜爱的像BSD一样的非限制性授权。允许你不需要公开你的源代码来使用该库。你可以从newlib home page 得到更详细的信息。

系统调用例程

Newlib依赖于少量的系统调用例程,你必须对依赖于系统的任务提供处理,特别是I/O支持。例如,你调用了printf()函数,Newlib库负责创建一个格式化的字符串,但是不知道在那里或如何显示它。因此它需要调用_write系统例程来执行最后输出。

    int _write(int handle, char *ptr, size_t len);

当调用printf()的时候,”handle”将被保留其中”1”意味着stdout标准输出,”ptr” 指向包含格式化字符串的缓冲区,”len”将是格式化字符串的长度。你的_write()系统调用例程的实现是通过一个串行调试端口发送缓冲区内容到一个远端的调试终端上显示出来。

下面是Newlib可能需要的系统调用例程的列表。不要被这个列表吓住:很少需要你来实现所有这些调用。而且经常是返回-1来指示一个错误或者一个合适的伪结果。

    * _sbrk: 改变堆的分配(对 malloc而言)
    * _open: 打开文件(基于句柄的)
    * _close: 关闭文件
    * _write: 写文件
    * _read: 读文件
    * _lseek: 重新定向文件中的位置
    * _fcntl: 执行一个文件描述符的操作
    * _fstat: 得到文件状态的句柄
    * _stat: 按名称得到文件状态
    * _link: 生成一个文件链接(文件命名)
    * _unlink: 删除目录项
    * _times: 读取时间信息
    * _gettimeofday: 得到时间日期
    * _execve: 执行一个文件
    * _kill: 杀死一个进程
    * _getpid: 得到进程标识
    * _fork: 创建一个新的进程
    * _wait: 等待子进程的终止

实现系统调用例程的最简单方法是按照需要来实现。直接使用Newlib库,直到目标代码连接器警告一个库函数缺少了一个系统调用函数再去实现它。通过这样的方法,你就不会为那些你的系统不需要的系统调用浪费时间了。

接下来,我们来看一下 Newlib库中的文件流I/O函数,并且讨论在一个实时操作系统环境中使用Newlib库的重进入和多线程问题。

GEF源码分析(六) GEF 的EditPart的职能分离 __ 跨国时尚媒体集团广告部门 的故事 二:【上一篇】
SLES FAQ -- 创建SLES9 http 安装服务器的步骤:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 增强网站的可访问性
  • 解决hibernator在eclipse3.x下面无法使用的问题
  • Word文档损坏,怎么办?
  • 网吧组网 光纤接入与ADSL接入的较量
  • SetUID, SetGID, Sticky bit 與 file 指令
  • 一个比较好的mutt文章及配置文件
  • 光纤距离延伸模块
  • 一个队列模块的接口 动态数组
  • 最近很忙,很郁闷,也很有收获
  • 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简解(提供博客园本地下载)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.