最近用keil调试STM32时,在代码中遇到了一些汇编指令,如DMB、DSB、ISB、SEV,现总结如下:
DMB、DSB、ISB、SEV等指令都属于RAM汇编指令,在《ARM Cortex-M0权威指南》和《ARM Cortex-M3权威指南》中,都有这些指令。读者可以参考这两本书的附录部分。其他RAM系列的权威指南应该也有这些指令,我这里只有这两本权威指南,用到其他系列时,读者可自行查证。
以《ARM Cortex-M0权威指南》为例,我在这里列举一些我用到的汇编指令及其用法,更多汇编指令请参考权威指南。(这些汇编指令都是不带参数的,以下指令只适用于使用Cortex-M0作为内核的芯片,使用其他架构的芯片不一定适用,需要查询其参考手册确定)
CPSIE I
清除PRIMASK(使能中断);在符合CMSIS的设备驱动库中,可以使用“__enable_irq()”实现该操作
CPSID I
设置PRIMASK(禁止中断);在符合CMSIS的设备驱动库中,可以使用“__disable_irq()”实现该操作
DMB
数据存储器屏障,确保在新的存储器访问开始之前,所有的存储器访问已经完成。在符合CMSIS的设备驱动库中,可以使用“__DMB”函数实现该操作
DSB
数据同步屏障,确保在下一条指令开始执行前,所有的存储器访问已经完成。在符合CMSIS的设备驱动库中,可以使用“__DSB”函数实现该操作
ISB
指令同步屏障,清除流水线并且确保在新指令执行时,之前的指令都已经执行完毕。在符合CMSIS的设备驱动库中,可以使