1、概述:

__DSB()和__ISB()是ARM架构中的内存屏障指令,用于控制指令和数据的执行顺序。

DSB,全称:Data Synchronization Barrier,数据同步屏障;

ISB,全称:Instruction Synchronization Barrier,指令同步屏障;

__DSB()功能:确保在__DSB()之前的所有内存访问指令(如:加载和存储)都完成后,才执行之后的指令;

__DSB()用途:用于需要确保内存操作完成后再进行后续操作的场景,如配置硬件寄存器后等待其生效;

__ISB()功能:刷新处理器流水线,确保在__ISB()之前的所有指令都执行完毕,之后的指令从内存重新读取;

__DSB()用途:用于修改代码后确保新指令被正确执行。

一般__DSB()和__ISB()是联合使用。

2、示例:

下面是这段代码的主要功能是让处理器进入低功耗模式(WAIT 或 STOP 模式),并在唤醒后恢复中断状态。

void LPM_EnterSleepMode(clock_mode_t mode)
{
    assert(mode != kCLOCK_ModeRun);

    g_savedPrimask = DisableGlobalIRQ();
    __DSB();
    __ISB();

    if (mode == kCLOCK_ModeWait)
    {
        /* Clear the SLEEPDEEP bit to go into sleep mode (WAIT) */
        SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
    }
    else
    {
        /* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    }
    /* WFI instruction will start entry into WAIT/STOP mode */
    __WFI();

    EnableGlobalIRQ(g_savedPrimask);
    __DSB();
    __ISB();
}

第一段__DSB();__ISB();先后调用执行,目的是在进入低功耗模式前,确保所有操作完成,避免未完成的内存访问或指令执行导致问题。

第二段__DSB();__ISB();在休眠唤醒之后,在恢复中断后,先后调用执行,确保处理器的状态是预期的,避免潜在的问题。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐