Keil создает "неисправный" шестнадцатеричный файл, когда одна из функций / макросов находится в коде - PullRequest
0 голосов
/ 16 декабря 2018

Я в процессе передачи кода из STM32L0 в STM32L4.Проект работал нормально на L0, но на L4, когда одна из функций используется тогда ... процессор сразу выходит из строя сразу после того, как я включаю сеанс отладки (мне даже не нужно запускатьпрограмма, она запускает его немедленно и идет в серьезную ошибку).Странные вещи:

  • Функция, которая вызывает проблему, - это действительно макрос в __STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) из stm32l4xx_ll_spi.hex: SET_BIT(SPIx->CR1, SPI_CR1_SPE).

  • *Файл 1011 *, который использует LL_SPI_Enable(), не создается, когда я закомментирую эту строку, содержащую функцию.Когда функция там, она создает файл .s из файла .c, который использует функцию.

  • Функция LL_SPI_Enable() существует во многих других местах, и это нормально.В одном файле есть только одна из моих функций (определенных как статические inline __attribute__((__always_inline__))), что вызывает такое странное поведение.Есть другие функции, которые делают то же самое (включение SPI), используя тот же LL_SPI_Enable(), и это не проблема.Похоже, что только одна из моих функций не может использовать LL_SPI_Enacle()

  • Функция отключения SPI не вызывает никаких проблем.

  • Программа не попадает даже в первую строку кода, она сразу выходит из строя.

Я думал, что разброс файла был проблемой, поэтому я использовал конфигурацию по умолчанию для моегоПроцессор и результат тот же.Я также пробовал разные уровни оптимизации, а также без изменений.У меня нет ошибок от компилятора или компоновщика.

У кого-нибудь было что-то подобное?

1 Ответ

0 голосов
/ 16 декабря 2018

В этом нет ничего "странного".

Если вы приземлились немедленно (т.е. до вызова основной функции), обычно есть три возможные проблемы:

  1. Файл компоновщика не для вашего микро
  2. Запускаемых файлов нетдля вашего микро
  3. Неправильные адреса регистров (использовались неправильные заголовочные файлы)

В разделе keil смотрите Периферийные устройства -> Основные периферийные устройства -> Отчет об ошибках.

Вы будетесм. там регистры и адрес места, где произошла ВЧ, и другую информацию (в зависимости от фактического источника ВЧ)

Подробнее: www.keil.com/appnotes/files/apnt209.pdf

...