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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Сб ноя 04, 2023 07:49:00

Сообщение 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 все работает корректно. Куда копать? Спасибо.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

FS и FT локальные, при выходе из конструктора они уничтожаются.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Объекты FS и FT после выполнения конструктора перестают существовать. Получаете массив указателей arrPtrFoo в никуда.

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

Сообщение erlbriton »

Всем спасибо. Вопрос решен.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «ARM»