来自Cortex-M0+ Devices Generic User Guide关于内存区域的信息>
2.2.1。内存区域,类型和属性
顺序强:
处理器保留相对于所有其他交易的交易顺序。
和-
地址范围: 0xE0000000- 0xE00FFFFF
内存区域:专用外围总线
内存类型:严格排序
说明:此区域包括NVIC,系统计时器和系统控制 块。在该区域只能使用单词访问。
现在,从CMSIS documentation-
#define __DMB()
确保显式内存操作在执行之前的明显顺序 并在没有说明完成的情况下。
根据上述信息,似乎在访问0xE0000000- 0xE00FFFFF
的内存地址范围的代码中,例如NVIC
控制器和SysTick
配置寄存器,我不需要使用__DMB
,因为它实际上是由硬件执行的。
例如,如果我们看__NVIC_EnableIRQ
-
/**
\brief Enable Interrupt
\details Enables 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_EnableIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
}
}
它不包含__DMB()
(也不包含__DSB()
或__ISB()
),因此,如果我启用了中断X,然后启用了中断Y,则操作之间没有障碍-
NVIC_EnableIRQ(X); /* Note: __NVIC_EnableIRQ is defined as NVIC_EnableIRQ */
NVIC_EnableIRQ(Y);
是否已承诺硬件将不会重新排序内存访问,并会在中断Y之前启用中断X(假设编译器确实将函数实现为内联)?
答案 0 :(得分:1)
是否保证硬件将在中断Y之前启用中断X
是的。编译器不得优化写访问或更改顺序-ISER在CMSIS标头中声明为volatile
。
请注意,与更大的组件不同,Cortex-M0 +没有写缓冲区。
答案 1 :(得分:0)
订单得到保证,但除此之外没有其他。想象一下情况:您已经进入了中断处理程序并禁用了中断作为最后一条指令。如果您有等待处理的待处理中断,则无法保证您不会再次进入中断处理程序。为防止这种情况,您需要在离开中断例程之前留出足够的时间,读回所写的值或使用屏障。
使用哪种障碍说明是一个非常有趣的问题。不可能用几个词来回答。
这是涵盖主题的有趣文章的link和有关写缓冲区的一些information