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