__DSB() __ISB()命令
__DSB() __ISB()命令
等待指令和資料同步,例如*ocramAddr = 0xCCU;執行完成後,實際微控制器可能還未完成執行,使用__DSB() __ISB()命令可以確保該行程式碼執行完成
static void OCRAM_Access(void)
{
uint32_t *ocramAddr = (uint32_t *)APP_FLEXRAM_OCRAM_START_ADDR;
/* enable FLEXRAM OCRAM access error interrupt*/
FLEXRAM_EnableInterruptSignal(APP_FLEXRAM, kFLEXRAM_OCRAMAccessError);
for (;;)
{
*ocramAddr = 0xCCU;
/* Synchronizes the execution stream with memory accesses */
APP_DSB();
APP_ISB();
/* check ocram access error event */
if (s_flexram_ocram_access_error_match)
{
s_flexram_ocram_access_error_match = false;
PRINTF("\r\nOCRAM access to 0x%x boundary.\r\n", ocramAddr);
break;
}
ocramAddr++;
}
}
程式通過中斷訊號進入中斷處理函式時,首先應當清除相應的中斷標誌位,但有些CPU的時鐘太快,快於中斷使用的時鐘,就會出現清除中斷標誌的動作還未完成,CPU就又一次重新進入同一個中斷處理函式,導致死迴圈,__DSB() 指令的作用就是避免上述情況的發生。以下程式碼是NXP RT1021 微控制器解決上述問題的程式碼:
/*! @name ISR exit barrier
* @{
*
* ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
* exception return operation might vector to incorrect interrupt.
* For Cortex-M7, if core speed much faster than peripheral register write speed,
* the peripheral interrupt flags may be still set after exiting ISR, this results to
* the same error similar with errata 83869.
*/
#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U))
#define SDK_ISR_EXIT_BARRIER __DSB()
#else
#define SDK_ISR_EXIT_BARRIER
#endif
相關連結
https://blog.csdn.net/missiler/article/details/107796862
https://blog.csdn.net/weixin_34384915/article/details/91637912
相關文章
- DSB的數字正交解調
- Linux命令之rz命令與sz命令Linux
- 【Linux命令】grep命令Linux
- Linux命令—–CP命令Linux
- windows命令列命令Windows命令列
- cmd 命令列 命令命令列
- git命令列命令Git命令列
- Linux系統中的管道命令、grep命令、sed命令和awk命令Linux
- Linux命令(1)——xargs命令Linux
- Linux命令之lldptool命令Linux
- java命令--jmap命令使用Java
- Linux命令篇 - sed 命令Linux
- Linux命令篇 - grep 命令Linux
- Linux命令篇 - tar 命令Linux
- linux每日命令(5):mkdir命令Linux
- linux-mysql命令,tomcat命令LinuxMySqlTomcat
- linux每日命令(2):cd命令Linux
- linux每日命令(18):whereis命令Linux
- linux每日命令(12):nl命令Linux
- linux每日命令(10):touch命令Linux
- linux每日命令(11):cat命令Linux
- linux每日命令(38):iostat命令LinuxiOS
- linux每日命令(39):lsof命令Linux
- linux每日命令(32):gzip命令Linux
- linux每日命令(35):grep命令Linux
- linux每日命令(36):wc命令Linux
- linux每日命令(37):top命令Linux
- linux每日命令(29):chown命令Linux
- Linux命令總結--mkdir命令Linux
- Linux命令:grep命令AND、OR、NOT例項Linux
- Linux命令篇 - nc(ncat) 命令Linux
- 命令
- Linux系統命令之systemctl命令。Linux
- nginx啟動命令和停止命令。Nginx
- Linux命令之rpm安裝命令Linux
- 批處理命令之tree命令
- Linux常用命令:效能命令Linux
- Linux 命令 ls命令系列(精華)Linux