代码之家  ›  专栏  ›  技术社区  ›  izac89

ARM Cortex-M内存访问

  •  -3
  • izac89  · 技术社区  · 6 年前

    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(假设编译器确实以内联方式实现函数)?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Turbo J    6 年前

    volatile

        2
  •  0
  •   too honest for this site    6 年前