ESP32 GPIO времянки

Esp32. Есть проблема, при первом заходе в эту функцию, первый импульс всегда затянут. Вызывается ow_bit_io(1) в цикле.

    inline uint8_t ow_bit_io(uint8_t b)
    {
        cli();
        delayMicroseconds(50); 
        BUS_DOWN; // line down
        delayMicroseconds(3); 
        if (b)
            BUS_UP; // if bit is 1 set bus high (by ext. pull-up)
        delayMicroseconds(12);
        if (BUS_RD == 0)
            b = 0; // sample at end of read-timeslot
        sei();
        delayMicroseconds(45);
        BUS_UP;
        delayMicroseconds(10);
        return b;
    }

Как победить? Есть возможность объявить критические секции в arduino esp32? cli() sei() не помогают.

void IRAM_ATTR test_interrupt()

IRAM_ATTR uint8_t ow_bit_io(uint8_t b)
ошибка компиляции. ICACHE_RAM_ATTR с этим компилируется, первый вызов, как и было, с большой задержкой, потом нормально.
А с чем связана первоначальная задержка?

ну не может же быть такого, что виновато то, что происходит до первого вызова

В общем не помогло ICACHE_RAM_ATTR . Во все функции которые связаны с ow_bit_io(uint8_t b) добавил ICACHE_RAM_ATTR. Все равно, первые импульсы затянуты.


132us остальные по 70us

кстати, работа с gpio, может здесь что не то

#define BUS_DOWN                               \
    gpio_set_direction(Pin, GPIO_MODE_OUTPUT); \
    gpio_set_level(Pin, 0);                    \
    gpio_pullup_dis(Pin)

#define BUS_UP                                \
    gpio_set_direction(Pin, GPIO_MODE_INPUT); \
    gpio_pullup_en(Pin)

Без понятия, это же не велосипед, в котором все проблемы сразу видны.
Делайте пустой тестовый скетч и просто блинкайте в прерывании. ЛА подскажет - беда на ESP в целом или в конкретно вашей реализации ow.

Да, все дело в работе с портами. Оставил

#define BUS_DOWN  gpio_set_direction(Pin, GPIO_MODE_OUTPUT)
#define BUS_UP  gpio_set_direction(Pin, GPIO_MODE_INPUT) 

Заработало.