a DSB instruction should be used after writing a new value to the VTOR register. This ensures that the write to the VTOR register is complete.
This is very interesting stuff, and makes sense, even to me 
The Q is why the thousands of designs out there, which don't do any of this, don't just blow up. The answer must be that in practical scenarios you set up e.g. VTOR many many instructions before interrupts get enabled. And probably same with enabling the FPU. STM's own "HAL" code (as generated by e.g. Cube MX) doesn't do DSB either.
These instructions guarantee certain things. Often you have enough fluff around your code that the correct behaviour gets
implied.
If you look at the cmsis where it is used, in the cm0plus it isn't use that much, but for example:
/**
\brief Disable Interrupt
\details Disables a device specific interrupt in the NVIC interrupt controller.
\param [in] IRQn Device specific interrupt number.
\note IRQn must not be negative.
*/
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
__DSB();
__ISB();
}
}For example, using the above function without barriers would probably work fine if any of the next instructions don't do anything with the nvic or with the peripheral sending an irq.
Race conditions, these instructions prevent them.
...
I think ARM wraps certain registers with logic that triggers DSB/ISB behavior. Maybe chip manufacturers like ST might do something similar with certain critical peripheral registers?
I don't think they do. Some registers are just slower because they are on a slower clock, that might imply some of this effect.
I only had to use a DMB barrier
once to ensure writes to the irq flag register were finished on exception return. Which it sometimes appears as it didn't on the F103.