簡體   English   中英

如果在復位處理程序中調用了 main 函數,那么其他中斷是如何處理的?

[英]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 */
    // [...]

從描述中我們可以注意到:

  1. 如果系統正在運行並且發出了重置,則處理器將始終“放棄當前執行”。 因此,如果MCU正在運行,則可能發生“最高優先級”的事情。
  2. 但是,在MCU重新啟動並且“ TakeReset”邏輯開始運行之后,處理器進入的“ CurrentMode”實際上是線程模式 ARMv7-M具有兩種操作模式,稱為線程模式處理程序模式 所有中斷/異常都在處理程序模式下運行,普通代碼在線程模式下運行。 這告訴我們復位路徑沒有真正開始像一個中斷/異常會。 它就像普通代碼一樣運行。

重置為“特殊”。 通過處理器重置調用重置處理程序時,指令以線程模式執行。 有必要這樣,因為復位向量是在上電復位(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM