ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 апреля
960863
Mefod (26.11.2019 07:22, просмотров: 1989)
Объясните логику работы дебаг или где-то закралась ошибка: 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.