2017-05-09 49 views
1

'使用故障異常'我參加了FreeRtos和Cortex M的講座,其中講師建議如果不從ISR使用ISR安全版API,則可能導致Cortex M處理器中的使用故障異常 。這可能會發生,因爲這可能涉及從中斷上下文(中斷處理程序)到任務上下文(線程處理程序) 我的問題是爲什麼這個任務切換將被視爲非法,並且這種切換的影響是什麼?ARM Cortex M

+0

聽起來軟件特定並且與它所在的cpu無關。 –

回答

1

在Cortex-M(某些)當前上下文將被存儲在中斷之前使用的堆棧中(在中斷入口之前),所以如果你在一個任務中並且它被中斷,那麼當前上下文的一些將是存儲在任務堆棧上(通過PSP)。中斷本身總是在MSP上運行。如果中斷沒有返回到它中斷的任務,那麼被中斷的任務將會出現亂七八糟的堆棧(因爲它會在退出時恢復存儲的上下文)以及嘗試爲已切換到的任務恢復不正確的上下文。

在上下文切換(發生在中斷中)時,上下文的某些內容會自動存儲在任務堆棧中,但操作系統也會將任務上下文的其餘部分存儲在任務堆棧中。當它執行切換並退出中斷時,操作系統恢復其存儲的任務的上下文,然後通過退出中斷自動恢復上下文的其餘部分。這可以確保堆棧保持正確的格式。查看Cortex-M4通用用戶指南中的中斷入口/出口。

並非所有的處理器都是這樣工作的。

0

這個答案是通用的,FreeRTOS的也不Cortex-M的特殊 - 它適用於任何平臺上的任何典型的RTOS:導致調度運行不能從中斷服務例程中調用

RTOS API調用。例如,如果給出一個信號量,通常調度程序會運行以切換到該信號量上正在等待的任何任務;這在ISR中是不合適的,當中斷環境退出時,調度程序必須運行一次;顯然你不想在之前執行上下文切換中斷已經完成,並且可能會有其他API調用或者被更高優先級的中斷搶佔,導致不同的任務變爲可運行;在發生上下文切換時僅進行一次評估可保持確定性行爲。

函數的ISR特定版本不會立即調用調度程序;相反,他們設置了一個標誌來指示調度程序必須在從中斷上下文退出時運行。

通常情況下,使RTOS API調用的ISR必須具有序言結語;特定進入/退出中斷調用或宏。這個序言增加了一個在結語中遞減的計數器;如果計數器爲零並且設置了調度標誌,則調度程序將運行。該計數器用於防止調度程序在嵌套中斷退出時運行。這可以確保調度程序只在退出時運行一次,形成最低優先級待處理中斷。

無論是或爲什麼會發生「UASGE故障」都是FreeRTOS特定的實施細節,並且在很大程度上是學術性的。RTOS同樣可以在ISR中使用非ISR安全調用,並運行更具體的錯誤處理程序(如果不這樣做),則最終的行爲可能會觸發使用錯誤;似乎依賴於一種有點粗暴的機制; 使用故障是一個非常廣泛的陷阱,可能發生對許多原因:

使用故障:檢測的未定義指令的執行,對加載/存儲多個未對齊 存儲器訪問。啓用時,除零 和其他未對齊的內存訪問也會被檢測到。

有些RTOS不具備ISR特定的功能,而不是API調用的原因調度檢測內部的ISR背景和不同的表現在這方面 - 這是對程序員更簡單,更安全,但帶有一個小的開銷,以測試每個這樣的呼叫的背景。在內部處理ISR安全的API也意味着調用本身可以進行OS API調用的函數更簡單,因爲這些函數本身不需要特定於ISR。