ARM: Получение жестких ошибок по определенной строке в коде - это должно быть неправильно - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть часть (строка) кода, которая вызывает hardfault в моей системе. Поскольку я не очень опытен, у меня, вероятно, есть очевидная ошибка в коде (то есть из библиотеки GUI).

Код:

const uint8_t* GeneratedFont::getPixelData(const GlyphNode* glyph) const
{
    const uint8_t* const* table = (const uint8_t* const*)glyphData;

    return &(table[glyph->unicode / 2048][glyph->dataOffset]);
}

Последняя строка в определенной комбинации параметры запускают отказоустойчивый доступ без выравнивания.

Отладка подтвердила, что Hardfault P C указывает на строку 0800e186 ниже:

//           return &(table[glyph->unicode / 2048][glyph->dataOffset]);
0800e174:   ldr     r3, [r7, #0]
0800e176:   ldrh    r3, [r3, #4]
0800e178:   lsrs    r3, r3, #11
0800e17a:   uxth    r3, r3
0800e17c:   lsls    r3, r3, #2
0800e17e:   ldr     r2, [r7, #12]
0800e180:   add     r3, r2
0800e182:   ldr     r2, [r3, #0]
0800e184:   ldr     r3, [r7, #0]
0800e186:   ldr     r3, [r3, #0]
0800e188:   add     r3, r2
//        }
0800e18a:   mov     r0, r3
0800e18c:   adds    r7, #20
0800e18e:   mov     sp, r7
0800e190:   ldr.w   r7, [sp], #4
0800e194:   bx      lr

, а когда происходит сбой, R3 действительно имеет контент, не кратный 4 - 134275462 (я нахожусь на STM32).

Что не так в этой последней строке кода, которая вызывает hardfault?

Я думаю, что, несмотря на то, что, возможно, параметры находятся вне диапазона, это все равно следует вычислить правильный адрес (сам адрес может быть не выровнен, но при вычислении происходит сбой - если я правильно понял).

...