У меня возникает HardFault при выполнении моей программы. Я нашел десятки способов повысить ценность ПК, но я использую Keil uVision 5, и ни один из них не сработал.
Насколько я знаю, я не нахожусь в контексте многозадачности, а PSP содержит 0xFFFFFFFF1, поэтому добавление к нему 24 приведет к переполнению.
Вот что мне удалось заставить работать (например, оно компилируется и выполняется):
enum { r0, r1, r2, r3, r12, lr, pc, psr};
extern "C" void HardFault_Handler()
{
uint32_t *stack;
__ASM volatile("MRS stack, MSP");
stack += 0x20;
pc = stack[pc];
psr = stack[psr];
__ASM volatile("BKPT #01");
}
Обратите внимание на «+= 0x20», который здесь компенсирует стек функций C.
Всякий раз, когда я читаю значение ПК, оно равно 0. У кого-нибудь есть рабочий код для этого?
В противном случае, вот как я делаю это вручную:
- Поставьте точку останова на HardFault_Handler (исходный)
- Когда он сломается, посмотрите, как MSP
- Добавьте 24 к его значению.
- Дамп памяти по этому адресу. И вот он, 0x00000000.
Что я делаю не так?