1. "Проверка if (dl != ds) не нужна" - да, действительно не нужна,
выпилю. 2. "Можно __libc_init_array(); написать самому и компилировать с ключом -nostartfiles." - можно, ваша функция почти полная копия таковой из libc. В коде есть некоторые ненужные вещи:
080004a1 196 FUNC GLOBAL DEFAULT 2 __register_exitproc
Это как пример, надо будет их повыпиливать, пока руки не дошли. Просто выпиливанием __libc_init_array() тут не обойтись.
3. Я пишу библиотеки, не могу гарантировать, что кто-нибудь не вернется из main. Это ловушка, в идеале она должна приводить систему к безопасному состоянию и делать сброс.
4. "__set_MSP нужен только при отладке" - кроилово ведет к попадалову, не вижу смысла в экономии максимум 3-х тактов на всё время жизни программы.
5. Инициализация у меня дробится на две части: в первой настраивается pll и память (ResetHandler), во второй всякие Eth'ты/USB и прочее - это уже можно где-угодно позвать. В данном случае пример - программа-мигалка, в ней нет настройки pll.