当函数/宏之一在代码中时,Keil创建“故障”十六进制文件

时间:2018-12-16 01:03:51

标签: c arm stm32 keil

我正在将代码从STM32L0传输到STM32L4。该项目在L0上工作正常,但在使用其中一个功能的L4上运行正常,然后...在打开调试会话后,处理器立即陷入严重故障(我什至不必启动)程序,它将立即启动它并进入严重故障)。 奇怪的事情:

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

  • 当我注释掉包含函数的那一行时,不会创建使用.s的{​​{1}}文件。有了该功能后,它将从使用该功能的LL_SPI_Enable()文件中创建一个.s文件。

  • .c函数存在于许多其他地方,很好。一个文件中只有我的一个函数(定义为静态内联LL_SPI_Enable())会导致这种奇怪的行为。还有其他功能使用相同的__attribute__((__always_inline__))执行相同的操作(打开SPI),而这些都不是问题。看来我只有一个功能不能使用LL_SPI_Enable()

  • 禁用SPI的功能不会引起任何问题。

  • 该程序甚至连代码的第一行都没有命中,它立即陷入了严重故障。

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

有人有这样的东西吗?

1 个答案:

答案 0 :(得分:2)

其中没有任何“怪异”。

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

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

在keil中,请参阅外围设备->核心外围设备->故障报告。

您将在其中看到发生HF的寄存器和地址以及其他信息(取决于实际的HF源)

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