ARM Cortex-M内存访问

时间:2018-07-08 08:43:27

标签: c memory arm interrupt cortex-m

来自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(假设编译器确实将函数实现为内联)?

2 个答案:

答案 0 :(得分:1)

  

是否保证硬件将在中断Y之前启用中断X

是的。编译器不得优化写访问或更改顺序-ISER在CMSIS标头中声明为volatile

请注意,与更大的组件不同,Cortex-M0 +没有写缓冲区。

答案 1 :(得分:0)

订单得到保证,但除此之外没有其他。想象一下情况:您已经进入了中断处理程序并禁用了中断作为最后一条指令。如果您有等待处理的待处理中断,则无法保证您不会再次进入中断处理程序。为防止这种情况,您需要在离开中断例程之前留出足够的时间,读回所写的值或使用屏障。

使用哪种障碍说明是一个非常有趣的问题。不可能用几个词来回答。

这是涵盖主题的有趣文章的link和有关写缓冲区的一些information