c - 嵌入式 newlib-nano printf 导致硬故障

标签 c gcc embedded cortex-m newlib

我在 2 个目标上编译了“相同”的代码(一个是飞思卡尔,一个是 STM32,都带有 cortex M4)。我使用 --specs=nano.specs 并将 _write 函数实现为一个空函数,这会导致整个 printf 得到优化远离 GCC 的 -Wno-unused-function 即使在 STM32 目标上使用 -O0(见 map )。这很好,我想在飞思卡尔目标上重现它。

但在 Freescale 目标(具有相同的编译标志)上,printf 会导致硬故障。但是,如果我使用调试器(汇编步进)一步步进行,printf 会在没有硬故障的情况下通过库。简单断点断点有时不会从 printf 中的任何位置命中并运行也会导致硬故障(因此不太可能是外围问题)。

到目前为止,我检查了堆栈和堆没有重叠以及其他一些牵强的反汇编。

为什么 printf 没有针对飞思卡尔目标进行优化? 什么会导致库代码出现硬故障? 为什么组装的时候一步一步debug就OK了?

编辑:

  • 对具有相同库的两个 MCU 使用 arm-none-eabi-gcc 5.4.1。
  • 我不想删除 printf,这只是能够使用的第一步 他们与否。
  • vector 表有所有 ISR 的默认弱 vector ,所以应该没问题
  • 使用register dump错误指令似乎在地址 4(复位 vector )处,所以现在的新问题是:为什么芯片会复位?

最佳答案

当 ARM 应用程序似乎在使用 printf 之前正常工作时,最常见的问题是堆栈未对齐。在调用 printf 的函数的入口点放置一个断点并检查堆栈指针。如果指针不是双字对齐的,那么您就发现了问题。

关于c - 嵌入式 newlib-nano printf 导致硬故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46399152/

相关文章:

c++11 - 在给定 GLIBCXX 版本的情况下,如何找到已实现的 C++11 功能

c - 在 C11 中使用 strdup

embedded - 在哪里可以找到有关编程 TI TMS320C64xx DMA Controller 的信息

c - C 中时间结构所需的帮助

python - UNIX套接字编程: Issues Getting a C Client to Connect to a Python Server

c - mlt XML 和 C 接口(interface)中的不一致呈现以及 'hold' 生产者和 avformat 消费者

c - C中大写和小写双(浮点)类型说明符的区别

c - 汇编语言中的 getchar()

embedded - 将编译后的程序上传到 C51 微 Controller

Codevision AVR 使用 TWI 访问外部 eeprom 24c02B