У меня есть часть (строка) кода, которая вызывает 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?
Я думаю, что, несмотря на то, что, возможно, параметры находятся вне диапазона, это все равно следует вычислить правильный адрес (сам адрес может быть не выровнен, но при вычислении происходит сбой - если я правильно понял).