Это делается для того, чтобы они случайно не совпали с переменными, созданными программистом. Обычные программисты не используют нижнее подчёркивание в начале имён переменных и функций.
Функция для внутреннего использования, которую не следует использовать пользователям библиотеки.
Почему не следует? Чтобы авторам библиотеки не иметь гемор с тестированием еще и этого на разных вызовах, раз оно публичное. А потом гемор с обратной совместимостью. когда выпустят новую версию библиотеки. Да и просто не очень то эта функция и нужна пользователям, мб.
__HAS_DELAY_CYCLES
void _delay_us(double __us) {...}
__builtin_avr_delay_cycles(__ticks_dc);
__OPTIMIZE__
_delay_loop_2(__ticks);
Вот эти вот __ и _ по бокам, они какую-то смысловую нагрузку несут в себе или это просто "дизайн" имён такой?