ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1035675 Топик полностью
evgeniy1294 (11.09.2020 19:16, просмотров: 659) ответил fk0 на Стартап делает гораздо больше вещей. Вообще отчасти это задача операционной системы: как-то разместить в памяти аргументы программы, переменные окружения, и передать указатели на них. И заодно сделать доступной в адресном пространстве программу (загрузить её, библиотеки, релоцировать...), стек, настроить регистры... C-стартап должен подготовить "рантайм" к работе и инициализировать C-библиотеку....
BSS и Data у меня обнуляются и копируются из flash в ram соответственно, надо перед ними инициализацию pll воткнуть. Статические конструкторы вызываются через __libc_init_array(); 

Вообще в libc есть вот это:

void libc_init() {
    __sinit(_impure_ptr);
    __libc_init_array();
}

Собственно, она инастроит стандартные потоки ввода/вывода и вызовет конструкторы. Только в МК настройка стандартных потоков ввода/вывода это лишняя на мой взгляд, поэтому я просто зову конструкторы.

Ещё в линкере определены переменные fini_array_start/end - это как раз таки список деструкторов, для МК вещь действительно бесполезная.


"std::terminate() в C++, последний вызывается из необрабатываемых исключений." - у меня код собирается с ключом -fno-exceptions, технически исключения должны приводить к HardFault. Надо подумать, как их ловить.

У меня есть написанный код для обработчика HardFault, который сохраняет контекст, определяет причину падения, а далее либо делает сброс (релиз), либо зависает (в дебажной сборке). Для дебажных сборок делаю это специально, чтобы можно было вернуться в точку падения. В этой реализации пока не доделано, скоро займусь.