ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
971306 Топик полностью
Nikolay_Po (17.01.2020 21:57, просмотров: 528) ответил Nikolay_Po на В общем, пока проблема с компилятором (или моим пониманием стандарта C) такова:
Удалось повторить проблему в пустом проекте STM32CubeIDE. 
  • 1. Создаю проект. Выбираю чип STM32F107VCT.
  • 2. В окне CubeMX, открываемом в IDE после создания проекта, вношу единственное изменение: в категории SYS выбираю Debug = Serial Wire.
  • 3. В текст шаблона main.c, вне функций, добавляю: /* USER CODE BEGIN PV */ volatile uint16_t TestArray[16384] = {0}; volatile uint32_t Count = 0; /* USER CODE END PV */
  • 4. В текст main.h добавляю /* USER CODE BEGIN EC */ extern volatile uint16_t TestArray[16384]; extern volatile uint32_t Count; /* USER CODE END EC */
  • 5. В текст stm32f1xx_it.c, в код SysTick_Handler() добавляю: /* USER CODE BEGIN SysTick_IRQn 1 */ unsigned Index = Count & 16383u; TestArray[Index] = (int16_t) Count; Count++; /* USER CODE END SysTick_IRQn 1 */
  • 6. Ставлю точку останова в HardFault_Handler() (можно не ставить, просто зависнет в цикле тут).
  • Настраиваю отладку GDB через openocd --pipe. Запускаю. На Count==1999 вылетает HardFault. Если комментировать строчку с обращением к массиву TestArray в stm32f1xx_it.c, спокойно "тикает" в без вылетов, Counter приращивается нормально. Из особенностей, вдруг влияют:
  • OpenOCD самосборный, так как CMSIS-DAP-отладчик потребовал увеличения буфера данных USB с (64+1) до (1024+1) из-за того, что интерфейс не 12Мбит/с, а 480Мбит/с.
  • GDB самосборный, 8.3, так как комплектный к STM32CubeIDE, по утверждению OpenOCD, пытался прочитать несуществующий регистр, в чём OpenOCD оказывал и разъединял GDB.
  • Примечательно, что массив присутсвует в .bss. Кто по-опытнее, гляньте пожалуйста файл /Debug/Global_Array_Access_Bug.map из архива. Архив проекта, собранного в STM32CubeIDE от 20200117 прилагаю во вложении. С.п.а.с.и.б.о.