• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

компилятор выкидывает большую часть функции

sharikov

Active member
Функция:
Код:
void write_one_page(UploadState_t* state)
{
    uint8_t  locked=0;
    int32_t  check_result;
    uint32_t vAddr;
    uint32_t vLen;
    //uint32_t prevAddress, lastAddress;
    uint32_t firstBlock, lastBlock;   // erase area
    int8_t   tmp;

    check_result =check_exclude_area(state);
    vLen = abs(check_result);

    if (check_result) {

        vAddr = (check_result < 0)? EXCLUDE_AREA_END : vAddr;

        firstBlock = vAddr & ~(SPI_FLASH_SEC_SIZE-1);
        lastBlock = (vAddr + vLen - 1) & ~(SPI_FLASH_SEC_SIZE-1);

        tmp=firstBlock;
        while (tmp <= lastBlock) {
            if (tmp > state->erasedAddress)
            {
                printf("E : 0x%x\n", tmp);
                device_mutex_lock(RT_DEV_LOCK_FLASH);
                locked=1;
                //    flash_erase_sector(&flashobj, tmp);
                state->erasedAddress = tmp;
                tmp+=SPI_FLASH_SEC_SIZE;
            }
        }
        printf("PS: 0x%x\t%d", state->currentAddress, state->pagePos);

        if (!locked)
            device_mutex_lock(RT_DEV_LOCK_FLASH);
        // unaligned multi-page write
        //flash_stream_write(&flashobj, state->currentAddress, state->pagePos,
        //        state->pageData);
        device_mutex_unlock(RT_DEV_LOCK_FLASH);
    }

    state->currentAddress+=state->pagePos;
    state->pagePos=0;
}
после компиляции превращается в
Код:
1000a84a <write_one_page>:
1000a84a:    b508          push    {r3, lr}
1000a84c:    4601          mov    r1, r0
1000a84e:    f7ff ffe3     bl    1000a818 <check_exclude_area>
1000a852:    b100          cbz    r0, 1000a856 <write_one_page+0xc>
1000a854:    e7fe          b.n    1000a854 <write_one_page+0xa>
1000a856:    f8b1 310c     ldrh.w    r3, [r1, #268]    ; 0x10c
1000a85a:    680a          ldr    r2, [r1, #0]
1000a85c:    f8a1 010c     strh.w    r0, [r1, #268]    ; 0x10c
1000a860:    4413          add    r3, r2
1000a862:    600b          str    r3, [r1, #0]
1000a864:    bd08          pop    {r3, pc}
Во первых там все выкинуто а во вторых она зацикливается на адресе 1000a854

Компилятор менял - пофиг.


---
Уже нашел. Как обычно "сам дурак".
Интересно кто найдет баг первым.
 

pvvx

Активный участник сообщества
Функция:
после компиляции превращается в
Во первых там все выкинуто а во вторых она зацикливается на адресе 1000a854
Компилятор менял - пофиг.
Не выкидывает, а оптимизирует. Описывайте правильно что хотите получить от компилятора и всё будет хорошо.
device_mutex_unlock(RT_DEV_LOCK_FLASH) ка работает без вызова lock?
Толпа ошибок в исходнике... При чем тут компилятор?
 

sharikov

Active member
Тоже так думал. Менял по всякому все равно выкидывает. Ответ неправильный.
 
Сверху Снизу