随锐旗下互动传媒:

Newlib库的优势利用

http://www.weaseek.com  2006-02-19 00:00:00  来源:e800开发者频道

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

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

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

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

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

    发布与授权许可

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

    Newlib 包括了从各种资源中收集来的代码,多个免费软件授权的分发也反映了其起源的多样性。基本上它有一个嵌入式系统开发者所喜爱的像BSD一样的非限制性授权。允许你不需要公开你的源代码来使用该库。你可以从newlibhome 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 web