Объясните логику работы дебаг или где-то закралась ошибка: stm32, atolic, gcc. Есть RAM функция прерывания вызываемая каждую 1 мсек:
RAMFUNC void TIM6_DAC_IRQHandler(void)
{
__HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
InnerTime_IncMsec();
}
В случае установки точки останова на InnerTime_IncMsec();
перед дебагом asm код получается
TIM6_DAC_IRQHandler:
20000f6a: push {r3, lr}
314 __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c: ldr r3, [pc, #12] ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e: ldr r3, [r3, #0]
20000f70: mvn.w r2, #1
20000f74: str r2, [r3, #16]
315 InnerTime_IncMsec();
20000f76: lsrs r0, r0, #28
20000f78: blx r3
20000f7a: pop {r3, pc}
20000f7c: strb r0, [r4, #8]
20000f7e: movs r0, #0
20000f80: asrs r5, r2, #6
20000f82: movs r0, #0
И падает в hardfault.
Убираем точку останова ( все еще в дебаге ), перезапускаем, и приложение работает. asm код следующий:
TIM6_DAC_IRQHandler:
20000f6a: push {r3, lr}
314 __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c: ldr r3, [pc, #12] ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e: ldr r3, [r3, #0]
20000f70: mvn.w r2, #1
20000f74: str r2, [r3, #16]
315 InnerTime_IncMsec();
20000f76: ldr r3, [pc, #8] ; (0x20000f80 <TIM6_DAC_IRQHandler+22>)
20000f78: blx r3
20000f7a: pop {r3, pc}
20000f7c: strb r0, [r4, #8]
20000f7e: movs r0, #0
20000f80: asrs r5, r2, #6
20000f82: movs r0, #0
Далее, выходим из дебага, удаляем точку останова. Дебажимся, доходит до main. Ставим точку останова и уже все норм:
TIM6_DAC_IRQHandler:
20000f6a: push {r3, lr}
314 __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c: ldr r3, [pc, #12] ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e: ldr r3, [r3, #0]
20000f70: mvn.w r2, #1
20000f74: str r2, [r3, #16]
315 InnerTime_IncMsec();
20000f76: ldr r3, [pc, #8] ; (0x20000f80 <TIM6_DAC_IRQHandler+22>)
20000f78: blx r3
20000f7a: pop {r3, pc}
20000f7c: strb r0, [r4, #8]
20000f7e: movs r0, #0
20000f80: asrs r5, r2, #6
20000f82: movs r0, #0
Получается, что если точка останова стоит в RAM функции до дебага, получаем hardfault.
InnerTime_IncMsec() тоже RAM.