глобальные переменные области видимости в С++ неправильно инициализированы

Я перенес свой код с stm32f072 на stm32f105. С тех пор у меня проблема с глобальными переменными, кажется, они не инициализируются. Я использую Atollic TrueStudio и их инструменты компиляции и сборки. Для новой платформы я попытался преобразовать существующий проект eclipse, а также создать новый из CubeMx.

Я получил Hardfault при доступе к глобальному объекту. Обходной путь заключался в перемещении оператора new в функцию доступа. Отладчик показал, что даже при наличии оператора new глобальная переменная была 0x00.

Я также использую std::queue, который имеет size() из 0xffffffe7, когда еще ничего не вставлено, что позволяет мне поверить, что это также происходит из-за отсутствия инициализации.

Я хочу решить проблему, а не перемещать все инициализации в начало основной функции в качестве обходного пути.

Мой код выглядит примерно так:

#include <queue>

std::queue<Telegram> telegram_in_fifo;
Port *port1 = new IoPort(/* some args */);

void some_function() { // tried calling from Interrupt or from main 
    // port1 is 0x00 here
    port1 = new IoPort(/* some args */);
    // now port1 has proper address and accessing internal data works without hardfaults

    uint64_t size = telegram_in_fifo.size(); // this is 0xffffffe7
    if(size <= fifo_max) {
        telegram_in_fifo.push(telegram);
    }
}

person Fritz    schedule 27.12.2020    source источник
comment
Откуда вы звоните some_function? Это может быть случаем фиаско статического порядка инициализации.   -  person john    schedule 27.12.2020
comment
Мой хрустальный шар говорит мне, что some_function() вызывается из инициализатора некоторой глобальной переменной в другом исходном файле. Порядок инициализации глобальных переменных из разных исходных файлов не указан.   -  person Igor Tandetnik    schedule 27.12.2020
comment
попробуйте подготовить минимально воспроизводимый пример. Только с кодом, который вы разместили, невозможно получить размер 0xffffffe7 для очереди.   -  person 463035818_is_not_a_number    schedule 27.12.2020
comment
some_function вызывается в прерывании или из основного   -  person Fritz    schedule 27.12.2020
comment
@Fritz Может ли прерывание вызываться перед основным?   -  person john    schedule 27.12.2020
comment
Взгляните на это: stackoverflow.com/questions/43650493/ Вероятно, среда выполнения C не инициализирует ваши переменные, возможно, из-за несоответствия цепочки инструментов или проблемы с другими инструментами. Пройдитесь по среде сборки гребешком с зубьями, чтобы найти несоответствия.   -  person Tumbleweed53    schedule 27.12.2020
comment
@john нет, так как я разрешаю прерывание в основном и отправляю позже. Теперь мне нужно продолжить расследование фиаско статического порядка инициализации.   -  person Fritz    schedule 27.12.2020
comment
@Fritz Лучше использовать класс с ленивой оценкой Singleton , который содержит все необходимые переменные static как инкапсулированные переменные-члены класса (не статические).   -  person πάντα ῥεῖ    schedule 27.12.2020