问题标签 [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.
arm - vfprintf 在 NXP K64 ARM Cortex-M4 上运行的基于 FreeRTOS 的多任务环境中崩溃
我在获取 NewLib 库提供的“vfprintf”时遇到问题,该库在基于 NXP K64 ARM Cortext-M4 处理器上运行的 FreeRTOS 的多任务环境中工作。
代码使用 arm gcc 编译器编译。
FreeRTOS 配置为启用 configUSE_NEWLIB_REENTRANT 开关。
我已经提供了 _write_r 系统调用,因此最终数据将被传递到 MCU 的 UART 之一。
访问“fp->_p”时会在 __sfvwrite_r 中触发硬故障异常。在这种情况下, fp 是默认分配给 xNewLib_reent.__sf[2] 的标准错误。
xNewLib_reent.__sf[2]._p 指针的默认值为 NULL,并且未分配到其他任何地方。
任何有关这方面的建议都将受到高度赞赏。
更新:在硬故障 ISR 中,我从堆栈框架中提取 PC,并通过检查我的调试器(即 Eclipse CDT 独立调试器)中的程序集视图,我可以看到它在取消引用 _p 指针时崩溃。
arm - 如何构建 newlib 以优化大小?
我正在构建一个以 Newlib 2.5.0 作为目标 C 库的 arm-eabi-gcc 工具链。
目标嵌入式系统更喜欢较小的代码大小而不是执行速度。如何配置 newlib 以支持更小的代码大小?
默认构建会生成一个strstr
代码大小超过 1KB 的版本。
embedded - newlib-nano 中的 printf() 和 _write()
我在嵌入式项目中使用 newlib-nano。
我已经实现了_write()
将printf()
输出字符输出到 UART 的版本。
我想知道单个调用是否会printf()
导致单个调用_write()
,或者,否则_write()
可以多次调用printf()
.
最好的问候马克斯
c - newlib 中的 printf 在裸机 ARM 环境中不起作用
我正在尝试集成 newlib 库的裸机 ARM 项目。作为初学者,我试图让该printf
功能首先工作,以便我可以通过 UART 看到标准输出。我已经浏览了许多描述如何完成此操作的在线文档。我没有盲目地遵循这些步骤,而是通过从这些文档中学习来自己完成所有事情。我一开始犯了很多错误,但都一个一个地改正,让工作不断进步。但是现在我遇到了一个问题,根据我的互联网搜索,到目前为止似乎没有人遇到过。现在让我来谈谈实际的问题。
该printf
函数在没有调用我的_write
函数实现的情况下返回。当我调试时,我可以看到它printf
正在调用我自己编写的其他系统调用(例如_isatty
,_sbrk
和_fstat
)。
这些是我为了解决链接问题而实现的系统调用(未定义的引用)
我的链接器脚本
我的 Makefile
如果我需要任何进一步的信息,请告诉我。先感谢您
编辑:
启动代码
c - 嵌入式 newlib-nano printf 导致硬故障
我在 2 个目标上编译“相同”代码(一个飞思卡尔,一个 STM32 都带有皮质 M4)。我使用--specs=nano.specs
并且我已经将该_write
函数实现为一个空函数,这会导致整个printf
被 GCC 优化掉,-Wno-unused-function
即使-O0
在 STM32 目标上也是如此(见地图)。这很好,我想在飞思卡尔目标上重现它。
但是在飞思卡尔目标(具有相同的编译标志)上, printf 会导致硬故障。但是,如果我使用调试器(程序集步进)一步一步printf
地通过库而不会出现硬故障。简单的断点断点有时不会从任何位置命中并运行也会printf
导致硬故障(因此它不太可能是外围问题)。
到目前为止,我检查了堆栈和堆没有重叠以及其他一些牵强的反汇编。
为什么 printf 没有在 freescale 目标上优化?什么会导致库代码出现硬故障?为什么一步步调试组装就可以了?
编辑:
- 对具有相同库的两个 MCU 使用 arm-none-eabi-gcc 5.4.1。
- 我不想删除 printf,这只是能否使用它们的第一步。
- 向量表有所有 ISR 的默认弱向量,所以应该没问题
- 使用寄存器转储,错误指令似乎位于地址 4(复位向量),所以现在的新问题是:为什么芯片会复位?
c - 错误:signal.h 中的未知类型名称“pthread_attr_t”
我正在尝试在 Cygwin 上构建 Emacs。Cygwin 是最新的且已完全修补。由于 Newlib,我使用该平台作为测试平台。Emacs 失败了:
检查/usr/include/cygwin/signal.h
大约 175,我看到:
但我没有在signal.h
头文件中看到包含 pthread 齿轮的内容。我相信标题应该是<sys/types.h>
or <pthread.h>
。
如果我正在解析 Open Group 的2.2.1 POSIX.1 符号
并在 cygwin 的 features.h 中定义 _POSIX_SOURCE?_XOPEN_SOURCE
正确地,定义to应该足够了600
。从Open Group 文档中的“_XOPEN_SOURCE 功能测试宏”部分:
由于这卷 IEEE Std 1003.1-2001 与 ISO C 标准一致,并且由于 _POSIX_C_SOURCE 设置等于 200112L 启用的所有功能都由 _XOPEN_SOURCE 设置等于 600 启用,如果 _XOPEN_SOURCE 是这样定义的,则不需要定义 _POSIX_C_SOURCE . 因此,如果 _XOPEN_SOURCE 设置为 600 且 _POSIX_C_SOURCE 设置为 200112L,则行为与仅定义 _XOPEN_SOURCE 并设置为 600 相同...
我在使用 gcc-5.4.0 编译 gnutls-3.3.17 时发现了一条与错误类似的过去消息,但它被报告为上游错误,并且似乎已修复。我认为它不适用于这里,因为 pthread 数据结构的使用没有明显的声明或定义。
任何人都可以确认事情(不是?)按预期工作吗?如果事情按预期工作,那么解决失败的提示将不胜感激。
提前致谢,
c - Newlib:嵌入式与桌面
我正在为一个玩具项目编译一个基于 Newlib 的 Linux 工具链。
Newlib的官方页面报道:
Newlib 是一个用于嵌入式系统的 C 库。
但没有提供任何特别的理由。
我想弄清楚的是:
- 为什么 newlib 认为自己是“仅”嵌入的?
- 在桌面或服务器环境中使用它有什么缺点?
newlib - 目录中的 newlib 构建失败:arm-none-eabi/libgloss/arm
在构建一套 ARM 工具的过程中。我以前多次使用过这些步骤。我在“newlib-2.5.0.20170922”和“newlib-2.5.0.20170922”目录中尝试了相同的配置/制作。仍然得到错误。我还以超级用户的身份尝试了我的步骤。没变。过去构建 Newlib 一直是个问题。有人可以帮忙吗?
构建进行了相当长的一段时间,直到出现以下错误。我检查了仅有的两个目录“cpu_init”和“semihv2m”。
make 输出结束:
c - 在没有语言环境支持的情况下使用 newlib 解析浮点数的实用方法
我正在试验 NIOS II 软核,试图最小化我的嵌入式应用程序的占用空间。我获得的最大收获之一来自使用小型 C 库(第 206 页):
对于嵌入式系统,完整的 newlib 库功能通常是不必要的,对于需要最小 RAM 占用空间的系统来说,它的功能也太大了。Altera 提供了一个缩减功能的缩减尺寸“Small C”版本的 newlib,它允许实现更小的 RAM 占用空间。
从小型 C 库中剥离的功能之一是语言环境支持。但是,当我尝试使用atof()
时,链接失败,因为它调用localeconv()
了不存在的。例如,构建以下示例
导致“ /path/to/strtod.c:341 : undefined reference to _localeconv_r
”错误。这真的很遗憾,因为唯一atof()
需要的是decimal_point
定义。
如果我需要解析浮点数,除了strtod.c
在我的软件中包含修改后的副本之外,我还有哪些选择?使用常规的 C 库(而不是小的库)将我的代码占用空间增加了 35kB,这对于嵌入式软件来说是个大问题。
c - 为 ARM 构建 Newlib 共享库
我正在使用 i686 机器作为构建平台为 ARM 设置交叉编译工具链。
我已经能够使用工具链来编译一个基本的 C 程序并在目标 ARM 设备上运行它,但是由于 Newlib 只会构建静态库,因此文件大小最终变得太大。
我使用的 GCC 版本和 Newlib 本身都是使用该--enable-shared
选项配置的——但在构建时似乎只是忽略了这一点。
我在 Newlib 文档中读到,如果主机和目标机器都是 i*86 机器,那么 Newlib 将使用 libtool 构建自己,它会自动构建共享和静态库 - 但这对 ARM 目标没有多大帮助!
有谁知道将 Newlib 构建为 ARM 设备的共享库而不仅仅是静态的方法?
鉴于 Newlib 旨在用于嵌入式系统,令我惊讶的是,它只能在用于英特尔机器上的本机编译时生成共享库。
谢谢!