问题标签 [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.
c - ARM Cortex M-3 GCC/newlib 初始化
我刚刚开始深入研究 ARM Cortex-M 微控制器的世界,我决定不使用现有的开发板或易于使用的 IDE,而是直接进入这些东西的裸机,所以我已经将一个 STM32F103 焊接到原型板上,现在我正在尝试使用 Launchpad 中的 gcc-arm-embedded Toolchain 进行工作。在阅读了有关链接器脚本之类的手册之后,我现在编写了自己的链接器脚本和启动代码,它们基本上什么都不做,只是将 .data 部分从 ROM 复制到 RAM,将 .bss 清零,然后调用 SystemInit()从 ST 的标准外设库进行基本的 uC 初始化,最后调用 main()。
现在,从我找到的有关 Cortex M-3 开发的几个教程中,我看到他们使用 -nostartfiles 标志连接器,但现在我想知道:在这种情况下我是否必须自己初始化 newlib?还是我应该使用 GCC/newlib 中的默认启动文件并删除 -nostartfiles?但在这种情况下,我仍然需要进行一些初始化,例如将 .data 复制到 RAM 并设置向量表,这需要自定义链接器脚本。那么我在哪里做呢?
而且我什至不想开始考虑 C++!
那么,初始化这种基于 Cortex-M3 的微控制器及其 libc(不包括外围设备)的推荐方法是什么?
提前致谢!
c - Newlib printf 延迟
我对 newlib 的 printf 函数有一个奇怪的问题,它被重定向到 uart 端口。
这个问题可以用一个例子很好地解释。
现在,当我运行程序时,直到到达/调用下一个 printf 才会出现“hi”。即,当应该打印“hello”时,它会打印“hi”,.. 1 呼叫的延迟总是进行。最后一个 printf 根本没有打印出来。
我的 UART 代码在哪里:
解决方案是什么?
c - __init_array 是什么?
我有一个用 GCC 编译的 Cortex-M3 项目。startup_LPC177x_8x.s 代码将初始化数据从闪存复制到 RAM,初始化bss,调用时钟初始化 SystemInit
。在调用_main
函数之前,代码还会调用函数_libc_init_array
。
__libc_init_array函数调用在 中定义的所有初始化例程,__preinit_array
调用该_init
函数,以及在 中定义的所有例程__init_array
:
使用 GDB,我可以发现它__preinit_array
是空的(start==end),并且第二次调用__init_array_start[i] ()
崩溃。
我不知道这个数组中包含哪些函数。链接描述文件使所有.init.array.*
部分都位于此处。但是如何找到对应的.o
源文件呢?
linux - 为 msp430-elf 目标构建 gcc
我正在尝试为 msp430 构建 gcc-4.9。我已经构建了最新版本binutils
并尝试gcc-4.9
使用基本配置进行构建:
configure --target=msp430-elf --enable-languages=c,c++ --with-newlib=yes
但问题是 gcc 为我的机器构建自己x86-unknown-linux
然后我认为它开始msp430
使用新编译器构建目标但我已经安装了 gcc-4.8 并且只想要msp430-elf
已经安装的目标4.8
。
注意:msp430
目标仅在其中可用4.9
,我只想为msp430
不为我的主机构建 4.9,因为我已经安装了它。
首先构建失败,其次,即使它确实成功了,我也不想安装,x86
恐怕make install
会这样做。
的文档configure
非常模糊,我非常感谢一些帮助。
linux-kernel - 内核头文件如何参与构建 gcc 工具链?
我了解到内核头文件指定程序如何与内核交互,因此它们必须参与构建标准库,或者?我刚刚阅读了一个教程,它很好地解释了如何构建一个 arm-elf 工具链(http://wiki.ubuntuusers.de/GNU_ARM-Toolchain)。
让我感到困惑的是,这个过程不涉及内核头文件。他们用
和 Newlib
在我看来,他们只从 newlib 中获取标头(他们使用 newlib 而不是 glibc)。这个目录中的文件看起来很一般。我希望Linux“内核版本”出现在这个过程中的某个地方,但它没有。我认为 Linux ABI 可以从内核版本更改为内核版本。内核(头文件)和 gcc 工具链之间的“连接”如何?
c++ - GNU gcc/ld 部分之间的额外字节
我使用arm-eabi-gcc (ver 4.6.4 / binutils 2.24)
with newlib (ver 2.1.0)
(不带AngelSWI
)。
我不使用Exception
也不RTTI
。
链接描述文件几乎与默认相同。
在链接文件中,一个 section 之后有额外的 32K 空间.eh_frame
。
我可以删除这个多余的空间吗?
问候。
c - 如何替换newlib的malloc
我正在使用带有 LPC1768 的 LPCXpresso。我正在尝试实现几个内存池。我有我的旧代码允许这样做,所以我很好。我无法做的是阻止 newlib 使用它自己的 malloc。newlib 中调用 malloc 的函数很少。我避开了它们,除了 _Csys_alloc,不幸的是它被 _initio 调用。由于 malloc 并不弱,我不能简单地用我自己的实现替换它。那么除了修改 newlib 并重新编译或编写我自己的 _initio 例程之外,还有其他方法吗?
谢谢你的帮助。
linux - Cygwin 不支持 glibc
Cygwin 常见问题解答有以下关于“glibc 在哪里?”的信息。: Cygwin 不提供 glibc。它使用 newlib 代替,它提供了许多(但不是全部)相同的功能。将 glibc 移植到 Cygwin 会很困难。
我很惊讶并检查了我之前使用过的发布包。虽然我检查了存储库,但似乎 glibc 实际上确实是 cygwin 的一部分,直到 2.10 版。谁能说出 glibc 后续版本的移植困难?
arm - 尝试打印数字> = 10时的STM32硬故障
临时解决方法
我用小 printf 解决了这个问题:
可能 newlib printf 只是占用了太多内存。在这之后PC变成了一些奇怪的东西,理论上应该是数组的结尾char[100]
。
后来它尝试执行
它崩溃了。内存错误?有很多事情我不明白。例如,我不确定链接描述文件是否正确,或者是否是系统调用函数。在进一步了解之前,我必须坚持使用微小的 printf。
原来的
我有一块 STM32F103RB 板(Nucleo),我刚刚让 USART1 工作。另外,我测试了 Newlib 函数,并按puts()
预期工作。但是,当我尝试使用printf()
整数时,如下所示:
如果test < 10
程序有效,但如果test >= 10
生成硬故障。经过一些 GDB 调试后,我发现它是从 vfprintf 生成的:
我想不出任何解决方案。这是我的_sbrk()
:
我的最小堆栈大小配置为 1024 字节。我试图增加到 10k,但它仍然会产生这个硬故障。我不知道如何调试或找到问题。我该如何解决?
我注意到一件事。失败发生在vfprintf.c:1601
,我检查了cp
GDB 中的指针:
我不知道为什么地址0x20004f57
指向一个不存在的地址。
另外,p _stackend
给
显然不存在
似乎在_VFPRINTF_R()
执行时,在goto number
执行时,指针cp
已损坏:
链接器脚本:
对这个linker script不是很了解,修改了《Discovering the STM32 Microcontroller》附带的那个。