Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пт дек 22, 2023 16:11:06

Приветствую котоединомышленников!

При запуске дебага простой прошивки (просто для проверки) на С++ для 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

FS и FT локальные, при выходе из конструктора они уничтожаются.

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

Пт дек 22, 2023 16:59:04

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

В комплекте с оптимизиатором, который выкидывает почти весь это код как ничего не делающий, дело даже до вызова не доходит, падает на попытке прочитать адрес метода. При выполнении зелёной строки будет HF. Обратите внимение, что от конструктора осталась одна команда BKPT, остальное почикалось.
СпойлерИзображение
321.png
(67.84 KiB) Скачиваний: 27


Добавлено after 30 minutes 9 seconds:
PS: Прикольно, с включенной оптимизацией GCC этот код выкидывает как ничего не делающий и ошибка маскируется. Без оптимизации падает, как и положено. Ссылка на godbolt.

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

Чт дек 28, 2023 05:10:44

Всем спасибо. Вопрос решен.
Ответить