问题标签 [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 投票
0 回答
245 浏览

multithreading - LLVM-IR,进程间通信,管理层

是否可以在 LLVM-IR 的基础上实现一个管理多个正在运行的程序的层?

背景:我有几个小程序(应该直接用 IR 编码或从 clang 转换为 IR)。它们可能会在 IR 级别上进行更改,然后应该在给定架构上/针对给定架构进行编译并在那里运行(并行)。应该有一个中央实例,它监督个体,可能产生新个体。程序间通信应该是可能的。

不使用 IR,我可以使用 c/c++ 和一些系统特定的线程/消息传递工具。

如果我理解正确,我可以将代码翻译成 IR;但如果 IR 与目标无关,这不会失败吗?如果不是,这意味着应该有用于程序间通信的 IR 级工具......

所以我对此感到困惑。我通读了 LLVM 文档,但到目前为止还不清楚。有什么提示吗?

更新:

到目前为止,我找到了一个可能的(依赖于目标的)解决方案。On 可以在 clang 中对管理层进行编码,使用 clang 解释器 (jit) 方法来处理那些被“jitted”然后由管理层作为线程(例如使用 pthread)产生的个体。

如果我理解正确,目标特定部分作为外部输入 IR 代码。从这个意义上说,IR 与平台无关,因为给定 clang 代码生成的 IR 使用了特定于平台的包含。使用 newlib,可以获得标准 clib 功能作为源,适用于多个目标。所以使用 newlib+clang,IR 不是平台独立的,但是从源代码到最终机器代码的过程是灵活的(在可用的 newlib&llvm 目标中)。

正确的?

使用循环类型调度生成线程怎么样?我猜这将取决于平台(例如通过使用 pthread)。

正确的?

0 投票
1 回答
991 浏览

c - Newlib 的 Malloc 正在“忽略”一大堆空闲内存

因此,我将裸机 malloc 与自写的 _sbrk 结合使用。我在 Stellaris Launchpad 上运行一切。该板包含一个皮质 M4。它还包含 32K RAM,从 memaddr 0x20000000 开始,一直运行到 0x20007FFF。在程序一开始,情况如下:

  • _ebss 是可分配内存的开始,所有具有低地址然后 _ebss 是常量、程序指令等。它在链接描述文件中定义。开始时的值为 0x200008b0
  • 在软件的加载阶段,主堆栈指针设置为 0x20007FFF,并且堆栈增长。这意味着,在一开始,大约有 30,5K RAM 可供分配。

_sbrk 想要分发这个 RAM 并确认正确的可用 RAM 数量:在初始化阶段之后(这意味着堆栈已经增长了一点,因此可用 RAM 的数量更低),存在以下 mem 打印输出:

前四行来自 _sbrk,后两行来自 mallinfo()。(S) 表示在 _sbrk 的开头(在移动堆指针之前),(F) 表示在移动堆指针之后。如果我可以正确阅读 mallinfo 的文档(我担心这是棘手的部分),那么 arena 表示从 _sbrk 请求的堆数量。这是有道理的,因为第一个打印的 heap_end 和最后一个打印的 heap_end 之间的差异确实是 1816。fordblks 应该是指可用堆的总量,因此仍然可以从 _sbrk 请求的最大堆量。这是不正确的。从最后一个差异中可以看出,heap_end 和 MSP 之间的差异是 28K。当然,我们希望在两者之间保留一个缓冲区,以便 MSP 可以在不破坏所有内容的情况下增长,但我们希望提供超过 2 个。

当我让程序运行更长时间时,这成为一个问题:最终 fordblks 将接近零,malloc 将开始返回 NULL,而 heap_end 还没有达到 MSP。所以 malloc 拒绝在需要之前提供更多的内存方式。我该如何解决这种行为?fordblks 值基于什么?

编辑: 更多信息!在上面你看到了 Malloc 拒绝的实际时刻:它在Could not create process..排队。如您所见,就在 Malloc 上面最后一次尝试从 _sbrk 获取堆,并且 _sbrk 被迫(堆指针已更改)。还剩下 24K 的空 RAM。当 malloc 告诉我时,我试图 malloc 1024 字节的 RAM NULL

编辑: linker_script.ld 文件:

编辑: 我对该主题进行了更多研究,发现了一些有趣的东西。首先:fordblks 与实际的空堆无关,我不知道它基于什么。因为如果您在 while true 循环中 malloc 很多 100 字节,mallocing 将继续,直到 _sbrk 返回 -1,这是预期的行为。在某些情况下,malloc 将返回 NULL 而没有实际填充堆。一个示例是 malloc(1024) 返回 NULL,但允许使用五个 malloc(555)。所以它似乎与 Malloc 的内部结构有关。

免责声明:上次我问一个裸机问题时,我被嘲笑为傲慢:我并不是说 newlib Malloc 做错了什么,我怀疑我需要在链接器脚本中定义一些东西或解决这个问题。我知道所有这一切都是我的错,我在这里问为什么会出现这个问题以及我需要如何修复我的代码来修复这种行为。并不是说 Newlib 的人不知道他们在做什么。

0 投票
2 回答
6434 浏览

c - snprintf() 使用 newlib nano 打印垃圾浮点数

我正在运行一个带有 ARM Cortex-M3 (STM32F205) 的裸机嵌入式系统。当我尝试使用snprintf()浮点数时,例如:

我把垃圾放进去s。该格式似乎受到尊重,即垃圾是一个格式良好的字符串,带有数字、小数点和两个尾随数字。但是,如果我重复snprintf,字符串可能会在两次调用之间发生变化。

浮点数学似乎以其他方式工作,并且snprintf适用于整数,例如:

我将newlib-nano实现与-u _printf_float链接器开关一起使用。编译器是arm-none-eabi-gcc.

我确实非常怀疑内存分配问题,因为整数的打印没有任何问题,但浮点数的行为就好像它们在这个过程中被破坏了一样。printf系列函数使用浮点数调用,而malloc不是整数。

在此上下文中使用的唯一不属于newlib我的代码是 my _sbrk(),这是malloc.

据我所知,这应该有效。似乎没有人用负增量调用它,但我想这是由于 newlib 的设计malloc。唯一有点奇怪的是,第一次调用_sbrk的增量为零。(但这可能只是malloc对堆起始地址的好奇。)

堆栈不应与堆发生冲突,因为两者大约有 60 KiB RAM。链接描述文件可能很疯狂,但至少堆和堆栈地址似乎是正确的。

0 投票
2 回答
1790 浏览

c - Newlib 在 ARM 嵌入式系统中首次调用时无法分配堆

我正在使用 gcc-arm-none-eabi 4.9 2014q4 为 Cortex-M4 编写裸机应用程序。当应用程序加载第一个调用_sbrk似乎是无效的。

我已经实现_sbrk如下:

链接器定义堆限制如下:

程序代码运行快速堆栈和堆测试:

产生以下输出:

第一次分配是 1040965006 字节,这似乎不正确并且失败了。在此之后,我假设malloc继续分配 626 个字节。malloc对for 的每个后续调用halb似乎都返回了一个超出我的堆栈范围的地址。这个第一次调用看起来像一个错误,还是应该被忽略,如果是,返回的地址是malloc怎么回事?

谢谢,德文

0 投票
1 回答
589 浏览

llvm - 使用 LLVM 自定义标准 C 库(支持 llvm 后端优化)

目的:

我在 LLVM 后端实现了一个传递,它改变了ARM程序集/二进制的输出格式(例如,在每个基本块的末尾添加一个跳转以消除失败)。通过调用:

它生成在 arm gnu linux 上正常运行的预期 arm 程序集/二进制文件(我使用 qemu-arm 和 gem5 来模拟它)。现在我想在标准 c 库上做同样的事情,但这里有问题。

问题:

根据:

使用 llvm 编译 glibc 可能不是一个合适的选择。另一方面,根据:

llvm 可以编译 newlib,因此人们认为 newlib 作为替代方案。但是,根据:

newlib 打算支持裸机(无操作系统)软件的二进制文件。它只实现与硬件无关的部分(例如 libc 和 libm),并为每个与硬件相关的系统调用(例如 libgloss 中的所有内容)保留一个存根。

事实上,我尝试使用配置了“--with-newlib”选项的 arm-none-eabi-gcc 编译一个简单的“hello world”c 程序,程序执行最终在 qemu-arm 和 gem5 上出现分段错误.

问题:

我不确定 newlib 是否与 glibc 兼容。我想知道我是否可以使用 llvm 从 newlib 交叉编译与机器无关的部分(同时更改 arm 输出格式)并使用 arm-none-linux-gnueabi-gcc 从交叉编译机器相关部分glibc 并将这两个部分放在一起生成我自己的标准 c 库?

我的工作中可能存在错误/误解。是否有任何其他可能的方法可以将我的更改添加到至少部分标准 c 库中,并使程序在 qemu-arm 或 gem5 上运行?

0 投票
0 回答
110 浏览

c - 切换到 newlib-nano 会导致应用程序停止运行

我有一个在我的 Cortex-M4 平台上运行良好的 newlib 4.9.3 2014q4 应用程序。串行控制台的所有输出都使用自定义函数iprintf或自定义send_str函数。send_str只是将字节写入串行外设 tx 缓冲区(循环调用 my )fputc

在我的应用程序的主程序中(在初始化数据重定位和 bss 归零之后)我打印了一个横幅。当我使用 newlib-nano( --specs=nano.specs) 时send_str,如果我使用iprintf.

相对

仅使用 newlib(不是 nano)这两个函数都可以工作。

我一直在阅读的所有内容都表明,不应该要求对我的应用程序进行更改以在两者之间进行交换。这有例外吗?

0 投票
1 回答
415 浏览

c++11 - Cygwin gcc.4.9.2 : 错误: '::lrintl' 尚未声明

这个问题与这个线程有关:cygwin support for C++11 in g++4.9.2

我遇到过同样的问题:

我应用了建议的补丁,只是得到另一个错误。包括 cmath 这里

返回此错误

我在 cygwin IRC 频道上寻求帮助:

遗憾的是,谈话就这样结束了。我不知道应该在哪里“删除 std::”,也不知道这是否可以解决问题。有人能帮忙吗?

0 投票
2 回答
525 浏览

gcc - 用于 ARM 的 GCC 正在链接额外的数据

我目前正在尝试将一些代码上传到 LPC810,它是一个 Cortex-M0+ 微控制器。我有一个我正在尝试使用的简单程序,它只是让 LED 闪烁。

编辑:这个文件叫做main.c.

我没有编写此代码,但我知道它有效。问题是当我把它编译成一个二进制文件上传时,它原来是 75 kiB 的数量级!这对我的微控制器来说太大了。

在elf文件上运行后size,似乎有一堆额外的函数和数据被链接进来。我正在使用newlib。

下面是我的 Makefile。我确信这可能与我的编译/链接标志有关,但我一直无法弄清楚。

我正在生成一个带有十六进制扩展名的二进制文件,对于任何混淆非常抱歉。

关于如何解决这个问题的任何想法?谢谢你的帮助!

0 投票
0 回答
423 浏览

c - 通过 newlib 传递的 GDB 调试参数

我正在尝试在 TI CC2538 ARM Cortex M3 部件上使用 newlib。目标是使用 printf 来调试消息,我实际上已经开始工作了。然而,系统会在收到大量消息后出现段错误(ARM 称之为 HardFault),我不知道为什么。

我使用 GDB 获取以下堆栈跟踪:

如您所见,newlib 部分(#2 - #5)没有任何信息,因此难以调试。我认为这是因为 newlib 被剥夺了调试符号,但是我重新编译了 newlib 并得到了相同的结果。

我正在使用官方存储库中提供的工具链运行 Arch linux。

-

我使用 Arch 构建系统 (ABS) 手动构建了 newlib 包,我认为应该包含调试符号(函数名称显示在 GDB 中。够了吗?)

关于下一步我可以尝试什么的任何想法?

编辑

我已经修改了输出,因此故障状态寄存器实际上是可读的。

这是解码后的输出:

解释这一点,我们遇到了一个总线故障异常,违规指令的地址存储在 FAULTADDR 中。我不确定是什么导致 CPU 尝试调用 0xffffff8 但我很确定这会导致问题。

0 投票
1 回答
8060 浏览

c - 用 Newlib 实现 write()、_write() 或 _write_r()?

我正在尝试printf()在将 Newlib 用于标准 C 库的 ARM GCC 工具链环境中重新定位 STM32F411RET 微控制器的功能。

当我搜索如何重新定位printf()时,很多人说我需要实施_write()_write_r()。似乎两者都有效。

但我仍然对他们有疑问:

  1. 当我查看Newlib 的文档时,它说我可以实现write()输出文件,但它看起来不起作用。看起来我们可以实现_write(),但文档中从未提及此功能。怎么了write()?下划线有什么不同吗?

  2. 在哪种情况下_write_r()更可取_wirte()?我不明白 C 中重新进入的概念。有什么例子吗?

感谢您阅读本文。