Я перенес свой код с 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);
}
}
some_function
? Это может быть случаем фиаско статического порядка инициализации. - person john   schedule 27.12.2020some_function()
вызывается из инициализатора некоторой глобальной переменной в другом исходном файле. Порядок инициализации глобальных переменных из разных исходных файлов не указан. - person Igor Tandetnik   schedule 27.12.20200xffffffe7
для очереди. - person 463035818_is_not_a_number   schedule 27.12.2020static
как инкапсулированные переменные-члены класса (не статические). - person πάντα ῥεῖ   schedule 27.12.2020