1. Проверка if (dl != ds) не нужна. На этапе компиляции значения dl
и ds неизвестны, их линкер подставляет. Поэтому оптимизация тут не
сработает. А дальше while и без этой проверки всё правильно
сделает. 2. Можно __libc_init_array(); написать самому и компилировать с ключом -nostartfiles. Тогда можно неплохо сэкономить на размере кода.
extern void (*__preinit_array_start[]) (void) __attribute__((weak));
extern void (*__preinit_array_end[]) (void) __attribute__((weak));
extern void (*__init_array_start[]) (void) __attribute__((weak));
extern void (*__init_array_end[]) (void) __attribute__((weak));
extern void (*__fini_array_start[]) (void) __attribute__((weak));
extern void (*__fini_array_end[]) (void) __attribute__((weak));
// Iterate over all the preinit/init routines (mainly static constructors).
inline void __attribute__((always_inline)) __run_init_array (void)
{
int count = __preinit_array_end - __preinit_array_start;
for (int i = 0; i < count; i++)
__preinit_array_start[i] ();
count = __init_array_end - __init_array_start;
for (int i = 0; i < count; i++)
__init_array_start[i] ();
}
3. Всё что после вызова main() как бы не имеет смысла, зачем этот код?
4. __set_MSP нужен только при отладке, отладчик обычно не устанавливает стек при загрузке как это делается при ресете. Уместно спрятать его под ifdef, чтобы в релиз не попадало.
5. По феншую вызывать Init() до инициализации сегментов данных. Они ведь могут быть в каком-нибудь внешнем SDRAM, который Init() как раз и инициализирует. Да даже просто на более высокой тактовой инициализация быстрее выполнится.
Казалось бы, мелочи, но когда их много...