问题标签 [newlib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
832 浏览

c - 在为定制平台构建 newlib 时指示 libgloss 机器

我正在为没有操作系统的定制 PowerPC 平台编译 newlib。在网上阅读信息我意识到我需要在<newplatform>libgloss 的子目录中实现存根函数。

我的困惑是当我编译 newlib 时将如何处理它。--target它是配置例如参数的最后一部分powerpc-ibm-<newplatform>吗?

如果是这种情况,那么我想我应该--target在编译 binutils 和 gcc 时使用相同的?

谢谢

0 投票
1 回答
1762 浏览

c - FreeRTOS 在调度程序启动之前(或在它停止之后)排队等待 IO

我正在寻找有关如何在操作系统调度程序可能尚未启动、正在运行、暂停或可能已停止的环境中最好地实现线程安全 IO(例如,用于调试串行端口的 printf)的建议,或者坠毁。我正在使用 Newlib 和 FreeRTOS。

目前,我正在使用(看似标准的)FreeRTOS 方法,将 _write 系统调用(Newlib)队列字符放入 FreeRTOS队列,然后从中断服务例程中清空(填充串行端口硬件 FIFO,然后等待FIFO 空中断)。

这样做的缺点是(至少在 FreeRTOS 上)队列只能在调度程序运行时安全使用,并且在禁用中断时无法打印调试输出(因为它们在引导期间直到调度程序启动,或者在致命之后错误条件(正是调试 printf 输出最有用的地方:-)。

最好让_write系统调用查询调度程序和/或中断状态,如果调度程序正在运行,则使用队列,并在禁用中断时使用阻塞/轮询串行IO?有没有更优雅的想法我还没有想到?

谢谢

0 投票
3 回答
2502 浏览

c - 移植 NewLib:crt0

我正在按照教程为我自己的操作系统移植 NewLib 。

它说一旦我完成了我的 crt0,我必须“将它作为第一个对象链接”。我怎样才能做到这一点?

0 投票
6 回答
17145 浏览

c++ - 如何获得调用堆栈回溯?(深度嵌入,无库支持)

我希望我的异常处理程序和调试函数能够打印调用堆栈回溯,基本上就像 glibc 中的 backtrace() 库函数一样。不幸的是,我的 C 库(Newlib)没有提供这样的调用。

我有这样的事情:

这基本上可以工作,但生成的跟踪并不总是完整的。例如,如果我这样做

回溯只显示 func3() 和 main()。(这是一个玩具示例,但我检查了反汇编并确认这些功能都在这里完整,没有优化或内联。)

更新:我在旧的 ARM7 系统上尝试了这个回溯代码,但使用相同(或至少尽可能等效)的编译器选项和链接器脚本,它打印出正确的完整回溯(即 func1 和 func2 没有丢失)和事实上,它甚至可以追溯到过去的 main 引导初始化代码。所以大概问题不在于链接描述文件或编译器选项。(另外,通过反汇编确认在此 ARM7 测试中也没有使用帧指针)。

代码是用 -fomit-frame-pointer 编译的,但我的平台(裸机 ARM Cortex M3)定义了一个无论如何都不使用帧指针的 ABI。(该系统的早期版本使用 ARM7 上的旧 APCS ABI,具有强制堆栈帧和帧指针,以及类似此处的回溯,效果很好)。

整个系统使用 -fexception 编译,确保 _Unwind 使用的必要元数据包含在 ELF 文件中。(我认为_Unwind 是为异常处理而设计的)。

所以,我的问题是: 在使用 GCC 的嵌入式系统中,是否有一种“标准”、可接受的方式来获得可靠的回溯?

如有必要,我不介意乱用链接器脚本和 crt0 代码,但不想让工具链本身有任何机会。

谢谢!

0 投票
1 回答
1094 浏览

c - 为我的操作系统移植 NewLib:一些问题

我正在尝试为我的操作系统移植 NewLib(我正在关注本教程: http ://wiki.osdev.org/Porting_Newlib ),我有一些问题。

  • 一旦 LibGloss 完成并编译,我什么时候必须使用已创建的 libnosys.a?是我何时编译我的 main.c 吗?

    /li>
  • 我的 crt0.c 完成了。我必须“将它作为第一个对象链接”。我怎样才能做到这一点?是这样的吗?

    /li>

感谢您的回答!

0 投票
1 回答
1791 浏览

c - 寻找纯 c 版本的 math.h 函数(无协处理器支持)

我必须使用一些静态处理 C 源代码的(半)自动验证软件(CBMC (链接) )。支持浮点,但没有所有数学函数的定义。尝试检查是否可以用它检查数字软件。

所以我需要这些功能。我正在寻找一些math.h不使用协处理器的定义(例如sqrt,、、pow余数、tanint// floatdouble

当我在一些 linux 发行版(可能是现在的 eglibc)附带的 libc 中寻找它时,我总是达到一个点,其中有一些处理器内在特性,例如硬件 sqrt 函数。

第 1 部分:搜索软件实现

我需要的是一个支持具有以下特征的数学函数的库:

  • 支持 IEEE 浮点数,但纯粹基于整数运行的库也会很棒,也许更好。
  • 正确性是一个关键因素。(隐藏在某些来源中的特殊情况的已知错误并不那么酷)。根据 IEEE-754(例如 sqrt 规则),结果也应该是正确的。
  • 不使用协处理器调用。纯软件。C 是首选,但 asm 也应该没问题。

到目前为止,我搜索了一些 libc 实现,尤其是关于嵌入式系统的实现。我认为这些库中的大多数都针对已编译程序的可移植性和大小,但很难判断它们是否使用了特定于处理器的指令。

  • ** fdlibm 乍一看似乎有一些纯软件定义。我将进一步检查。但是源代码中提到了一些错误(代码不是标准的)。
  • ** newlib似乎带来了相同的定义(基于 sun 微系统的代码)。但目前我不能确定是否始终使用这些软件版本,因此可能有一些我目前看不到的协处理器调用(见第 2 部分)。
  • ** uClibc似乎与 newlib 共享该特性。

第 2 部分:了解这些实现的结构

  • 有人能给我简要介绍一下这些数学库的结构吗?他们如何分派各种版本(例如特定的协处理器)?

  • 文件名中这些不同前缀的含义是什么。e_sqrt.c, k_sin, s_sin?

我很高兴听到一些对我有用的库。我更喜欢自带库,但有必要的时候,也可以找一些单一的函数实现,搭建一个小库。我不会使用 math.h 中定义的所有函数。

这个这个SO-posts 说 Java 数学实现是/是基于fdlibm的,这听起来这个库是要走的路。我应该知道有关此库的更多信息的人吗?

似乎我有很多可能性,包括以下两种:

  1. 使用 glibc 并在软件模式下编译。问题是,我不能使用任何自动系统检查工具(在配置中)。我必须手动提供所有信息。是否有任何标志禁止使用 fp 协处理器和禁止 simd 操作?fp-without 应该是一个开始,然后如果它编译它也使用软浮点。我希望编译过程或多或少取决于主机的特定决定(如 arm ...)。
  2. 使用 fdlibm(目前首选)。问题:如何将我的程序链接到它?我需要像 assert 这样的非 libm 函数,但想要链接到我的 fdlibm 而不是已安装的 system-libm(因此 -nodefaultlibs 将禁止使用 assert)。
0 投票
2 回答
3001 浏览

embedded - Porting newlib to a custom ARM setup

this is my first post, and it covers something which I've been trying to get working on and off for about a year now.

Essentially it boils down to the following: I have a copy of newlib which I'm trying to get working on an LPC2388 (an ARM7TDMI from NXP). This is on a linux box using arm-elf-gcc

The question I have is that I've been looking at a lot of the tutorials talking about porting newlib, and they all talk about the stubs (like exit, open, read/write, sbrk), and I have a pretty good idea of how to implement all of these functions. But where should I put them?

I have the newlib distribution from sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz and after poking around I found "syscalls.c" (in newlib-1.18.0/newlib/libc/sys/arm) which contains all of the stubs which I have to update, but they're all filled in with rather finished looking code (which does NOT seem to work without the crt0.S, which itself does not work with my chip).

Should I just be wiping out those functions myself, and re-writing them? Or should I write them somewhere else. Should I make a whole new folder in newlib/libc/sys with the name of my "architecture" and change the target to match?

I'm also curious if there's proper etiquette on distribution of something like this after releasing it as an open source project. I currently have a script which downloads binutils, arm-elf-gcc, newlib, and gdb, and compiles them. If I am modifying files which are in the newlib directory, should I hand a patch which my script auto-applies? Or should I add the modified newlib to the repository?

Thanks for bothering to read! Following this is a more detailed breakdown of what I'm doing.


For those who want/need more info about my setup:

I'm building a ARM videogame console based loosely on the Uzebox project ( http://belogic.com/uzebox/ ).

I've been doing all sorts of things pulling from a lot of different resources as I try and figure it out. You can read about the start of my adventures here (sparkfun forums, no one responds as I figure it out on my own): forum.sparkfun.com/viewtopic.php?f=11&t=22072

I followed all of this by reading through the Stackoverflow questions about porting newlib and saw a few of the different tutorials (like wiki.osdev.org/Porting_Newlib ) but they also suffer from telling me to implements stubs without mentioning where, who, what, when, or how!

0 投票
3 回答
9562 浏览

gcc - gcc 使用 newlib 而不是 glibc?

我想使用 newlib 而不是 glibc 来编译小型静态二进制文件。(我不打算交叉编译,因为二进制文件将由同一台计算机使用。)我相信我需要为此编译一个单独的 gcc ?

我编译了 gcc:

它编译时没有错误,但现在当我尝试编译一个简单的 Hello World!它想使用 /usr 中的标头而不是我上面指定的路径的程序。这些是一些错误:

我究竟做错了什么 ?是否需要编译新的 gcc 或者我可以使用现有的 gcc 并使用 newlib 而不是 glibc ???

0 投票
1 回答
2193 浏览

scanf - newlib sscanf() throw hardfault exception in stm32

i use gcc compile my project, use the function sscanf() in main, the stack size is 4k, i debug the program in gdb, show VPUSH instruction throw the exception.

and i test the function sprintf(), it work nice. why the function sscanf() is not work in newlib for stm32?

0 投票
2 回答
1198 浏览

malloc - 为什么 malloc 只在刷完 cortex-m3 后立即起作用?

我正在尝试使用在 cortex-m3(裸机)上运行的 newlib 的 malloc 动态分配内存,我遇到了一个令人困惑的问题。刷新设备后,malloc 和 free 立即按预期工作。但是,一旦我重置设备 malloc 只返回 NULL。除 malloc 外,其他一切都有效。关于什么可能导致这种行为的任何提示?

这是我的链接器脚本:

这是来自我的内存映射:

当 malloc 成功时,它从 0x10000d48 开始分配。