arm-gcc-none-eabi-gcc выбрасывает присвоение указателя со включенной оптимизацией

используется следующая функция:

SimpleBUSFrame_TypeDef* GetFrame (const uint8_t* buffer)
{
    SimpleBUSFrame_TypeDef* frame;
    frame = (SimpleBUSFrame_TypeDef*) buffer;
    frame->DataFrame = buffer + sizeof(SimpleBUSFrameHeader_TypeDef);
    frame->CRCFrame = *((uint16_t*)(frame->DataFrame+frame->FrameHeader.DataLength));
    return frame;
}

При включенной оптимизации -Og, да и любой другой, кроме -O0, первое присвоение выкидывается:

          GetFrame:
0800323c:   adds    r2, r0, #7
0800323e:   str     r2, [r0, #8]
 73         frame->CRCFrame = *((uint16_t*)(frame->DataFrame+frame->FrameHeader.DataLength));
08003240:   ldrb    r1, [r0, #6]
08003242:   ldrh    r2, [r2, r1]
08003244:   strh    r2, [r0, #12]

При отключенной оптимизации все проходит, как и должно быть. В чем ошибка?


Ответы (0 шт):