[英]If the main function is called inside the reset handler, how other interrupts are handled?
這是來自 Tiva C 啟動代碼的示例代碼,您可以看到在重置處理程序中調用了 main 函數,據我了解它是最高優先級,所以我的問題是如何處理任何其他中斷,如果我們還在重置處理程序中嗎?
```
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
```
我發現ARM體系結構參考手冊中的偽代碼對於回答此類問題非常有幫助。 通過“ tiva c”,我假設您正在談論的是基於Cortex-M4的MCU的TM4C系列微控制器。 這意味着我們將要查看ARMv7-M體系結構參考手冊 。
“ B1.5.5重置行為”部分具有我們感興趣的偽代碼。這是一個代碼段(部分與問題無關的部分被忽略了):
Asserting reset causes the processor to abandon the current execution
state without saving it. On the deassertion of reset, all registers
that have a defined reset value contain that value, and the processor
performs the actions described by the TakeReset() pseudocode.
// TakeReset()
// ============
TakeReset()
CurrentMode = Mode_Thread;
PRIMASK<0> = '0'; /* priority mask cleared at reset */
FAULTMASK<0> = '0'; /* fault mask cleared at reset */
BASEPRI<7:0> = Zeros(8); /* base priority disabled at reset */
// [...]
從描述中我們可以注意到:
重置為“特殊”。 通過處理器重置調用重置處理程序時,指令以線程模式執行。 有必要這樣,因為復位向量是在上電復位(POR)上調用的-如果處理程序必須“返回”,它將返回到哪里?
同樣在任何情況下復位時,寄存器都將復位到其定義的復位狀態,並且堆棧指針設置為表開始處的地址(至少在使用ARM Cortex-M的情況下),因此不會有任何地方來獲取返回地址-實際上,復位信號在任何情況下都不會導致返回地址堆積。 復位的全部目的是在已知狀態下重啟處理器。 返回到發生復位的意義不大,並且考慮到處理器的復位狀態不太可能是適合“中斷”代碼的運行狀態,因此不可能工作。
從《 ARM Cortex-M3用戶指南》 (我着重於其他觀點)中,其他ARM體系結構的細節可能有所不同,但要點沒有什么不同。
2.3.2。 異常類型異常類型為:
重啟
復位是在加電或熱復位時調用的。 異常模型將重置視為異常的一種特殊形式。 聲明復位后,處理器的操作可能會停止在指令的任何一點。 取消復位后,將從向量表中的復位條目提供的地址重新開始執行。 在線程模式下,執行作為特權執行重新啟動。 [...]
為了使它盡可能簡單,我將this的名稱更改為-ProgramStart。
處理器必須從一點開始執行程序。 Cortex Core只是獲取向量表第二個條目的地址,然后跳轉到那里。 沒有寄存器堆疊,什么也沒有-只是跳轉到該地址(在設置堆疊之前,應將其設置在實際內存中)
所以我的問題是,如果我們仍然在重置處理程序中,那么如何處理其他中斷?
我們只是運行我們的程序。 我們不處理任何例外情況。
; ProgramStart
ProgramStart PROC
EXPORT ProgramStart [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
/ *以及向量表)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.