gpt4 book ai didi

c - 当其中一个函数/宏在代码中时,Keil 创建 'faulty' hex 文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:53 25 4
gpt4 key购买 nike

我正在将代码从 STM32L0 转移到 STM32L4。该项目在 L0 上运行良好,但在使用其中一个功能时在 L4 上运行良好......处理器立即进入硬故障,在我打开调试 session 后立即(我什至不必启动程序,它会立即启动并进入硬故障)。奇怪的事情:

  • 导致问题的函数实际上是 stm32l4xx_ll_spi.hex 中的 __STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) 中的宏:SET_BIT(SPIx->CR1, SPI_CR1_SPE) .

  • 当我注释掉包含该函数的行时,不会创建使用 LL_SPI_Enable().s 文件。当函数存在时,它会从使用该函数的 .c 文件创建 .s 文件。

  • LL_SPI_Enable() 函数存在于许多其他地方并且很好。一个文件中只有一个我的函数(定义为静态内联 __attribute__((__always_inline__)) )导致了这种奇怪的行为。还有其他函数使用相同的 LL_SPI_Enable() 做同样的事情(打开 SPI),这些都不是问题。看起来我的函数中只有一个不能使用 LL_SPI_Enacle()

  • 禁用 SPI 的功能不会导致任何问题。

  • 程序甚至没有命中第一行代码,它立即进入硬故障。

我认为分散文件是问题所在,所以我为我的 CPU 使用了默认配置,结果是一样的。我也尝试了不同的优化级别,也没有改变。编译器或链接器没有任何错误。

有人遇到过这样的事情吗?

最佳答案

这里面没有什么“奇怪”的。

如果立即着陆(即在调用主函数之前),通常会出现三种可能的问题:

  1. 链接器文件不适用于您的微应用
  2. 启动文件不适合你的 micro
  3. 错误的寄存器地址(使用了错误的头文件)

在keil中查看Peripherals -> Core Peripherals -> Fault report.

在那里你会看到寄存器和HF发生的地方的地址等信息(取决于实际的HF来源)

进一步阅读:www.keil.com/appnotes/files/apnt209.pdf

关于c - 当其中一个函数/宏在代码中时,Keil 创建 'faulty' hex 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com