• Система автоматизации с открытым исходным кодом на базе 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
Тоже так думал. Менял по всякому все равно выкидывает. Ответ неправильный.
 
Сверху Снизу