Функция:
после компиляции превращается в
Во первых там все выкинуто а во вторых она зацикливается на адресе 1000a854
Компилятор менял - пофиг.
---
Уже нашел. Как обычно "сам дурак".
Интересно кто найдет баг первым.
Код:
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}
Компилятор менял - пофиг.
---
Уже нашел. Как обычно "сам дурак".
Интересно кто найдет баг первым.