Страница 1 из 1

HardFault при дебаге прошивки для stm32 в CubeIde на С++

Добавлено: Пт дек 22, 2023 16:11:06
erlbriton
Приветствую котоединомышленников!

При запуске дебага простой прошивки (просто для проверки) на С++ для stm32f405, stm32F103 в CubeIde вываливаюсь в HardFault при достижении обращения программы к виртуальному методу:

Код: Выделить всё

#ifndef TEST103_HPP_
#define TEST103_HPP_
#include "gpio.h"
#include "main.h"
 
class PtrFoo {
public:
    virtual void fooVirt(){};
};
class FooSecond: public PtrFoo {
public:
    void fooVirt() override {
        int a = 2 + 3;
    }
};
 
class FooTherd: public PtrFoo {
public:
    void fooVirt() override {
        int b = 5 + 4;
    }
};
 
class PtrFoo;
 
class ComCom {
public:
    PtrFoo* arrPtrFoo[2] ;
    ComCom(){
    FooSecond FS;
    FooTherd FT;
    arrPtrFoo[0] = &FS;
    arrPtrFoo[1] = &FT;
    }
 
    void fooVirt(int y) {
        arrPtrFoo[y]->fooVirt();//На следующем шаге уходит в HardFault
    }
};
 
#endif /* TEST103_HPP_ */
В main.cpp перед while:

Код: Выделить всё

ComCom comCom;
comCom. fooVirt(0);
Долгое время пытался найти решение проблемы в сети, но безрезультатно. Тот же эффект наблюдается при работе в IARe. Давно пишу на С для stm32, на С++ перешел совсем недавно.
При отладке в Visual Studio все работает корректно. Куда копать? Спасибо.

Re: HardFault при дебаге прошивки для stm32 в CubeIde на С++

Добавлено: Пт дек 22, 2023 16:25:37
Reflector
FS и FT локальные, при выходе из конструктора они уничтожаются.

Re: HardFault при дебаге прошивки для stm32 в CubeIde на С++

Добавлено: Пт дек 22, 2023 16:59:04
VladislavS
Объекты FS и FT после выполнения конструктора перестают существовать. Получаете массив указателей arrPtrFoo в никуда.

В комплекте с оптимизиатором, который выкидывает почти весь это код как ничего не делающий, дело даже до вызова не доходит, падает на попытке прочитать адрес метода. При выполнении зелёной строки будет HF. Обратите внимение, что от конструктора осталась одна команда BKPT, остальное почикалось.
СпойлерИзображение
321.png
(67.84 КБ) 133 скачивания
Добавлено after 30 minutes 9 seconds:
PS: Прикольно, с включенной оптимизацией GCC этот код выкидывает как ничего не делающий и ошибка маскируется. Без оптимизации падает, как и положено. Ссылка на godbolt.

Re: HardFault при дебаге прошивки для stm32 в CubeIde на С++

Добавлено: Чт дек 28, 2023 05:10:44
erlbriton
Всем спасибо. Вопрос решен.