On Fri, Jul 14, 2023 at 6:53 PM Tomas Vanek <tom_...@users.sourceforge.net> wrote: > > On 14/07/2023 00:30, Tomas Vanek wrote: > > > Unfortunately (if I'm not completely wrong guessing the mechanism of the > errata) each rogue break also means that > one semihosting operation gets skipped. So your test will keep running, time > to time some semihosted output get lost. > > T > > Not really! The semihosting operation or any other BKPT is executed again > after return from the interrupt! > > The code reliably replicating the issue on STM32F767 without semihosting is > as simple as that:
Cool! It could be interesting to check under Segger or other tools to confirm they have some workaround and maybe try to figure out what the workaround does; maybe they simply continue if the halt does not match any set breakpoint. Antonio > #include "stm32f7xx_hal.h" > int pendsv_cnt, loop_cnt; > > void PendSV_Handler(void) > { > pendsv_cnt++; } > int main(void) > { > while (1) { > SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; // you may insert 0..8 __NOP() > instructions as a delay here // no issue observed with a delay longer than 8 > __NOP() instructions > __BKPT(0); loop_cnt++; } } > // empty SystemInit to keep STM startup_stm32f767xx.s happy > void SystemInit(void) > { > } > The code running under OpenOCD/gdb stops first in PendSV_Handler() and then > correctly at __BKPT(0) location. OpenOCD setting cortex_m interrupt mask on > suppresses interrupts and no surprise that rogue breaks in PendSV_Handler() > disappear as well. T