__DSB()和__ISB() 学习笔记

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();在休眠唤醒之后,在恢复中断后,先后调用执行,确保处理器的状态是预期的,避免潜在的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值