Вы думаете, что ESP8266 не содержит проприетарных частей, скрытых от пользователя?
Если Вы подставляете callback-функцию для обработки какого-либо прерывания, то считаете, что эта функция будет аппаратно вызвана при наступлении прерывания?
Ничего подобного! При наступлении прерывания происходит переход по вектору, который указывает на внутреннюю процедуру, Вам не доступную. В этой процедуре первым делом сохраняется контекст прерванной задачи, производится аппаратный отбой прерывания, подготовка и вызов по указателю Вашей callback-функции. Выход из функции возвращает в системную процедуру ISR, в которой производится восстановление контекста прерываемой задачи и возврат в нее.
Те, кто пишут здесь, что программируют на голом железе, глубоко ошибаются: к их собственному коду в обязательном порядке подключаются некие библиотечные функции, обеспечивающие правильный запуск процессора, настройку всей аппаратной части и обработку прерываний, драйверы устройств ввода/вывода и многое другое. Подумайте, если Вы пишете код на C++, кто, когда и где вызовет конструкторы глобальных объектов, которые Вы вполне можете использовать? А кто производит обработку исключительных ситуаций?
Когда разработчик предоставляет Вам IDE, то оно уже включает в себя некую операционную систему, о существовании которой многие даже не подозревают!