从
Cortex-M0+ Devices Generic User Guide
关于内存区域-
2.2.1.内存区域、类型和属性
强有序
以下内容:
处理器保留与所有其他事务相关的事务顺序。
和-
地址范围:
0xe000000-0xe00fffff
存储区域:专用外围总线
内存类型:
强顺序
描述:此区域包括NVIC、系统计时器和系统控制
阻止。此区域只能使用Word访问。
现在,从
CMSIS documentation
-
#定义uuu 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(假设编译器确实以内联方式实现函数)?