0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

ARM9中斷中(C語言)如何實現(xiàn)復位功能,而不是返回中斷前的狀態(tài)?

工程師鄧生 ? 來源:未知 ? 作者:劉芹 ? 2023-10-19 16:42 ? 次閱讀

ARM9中斷中(C語言)如何實現(xiàn)復位功能,而不是返回中斷前的狀態(tài)?

在ARM9處理器的中斷中,當系統(tǒng)發(fā)生異常時,處理器會暫停正在執(zhí)行的指令并處理中斷請求。處理中斷的方式有兩種,一種是通過向處理器發(fā)送中斷請求信號,觸發(fā)處理器中斷程序的執(zhí)行;另一種是通過異常處理器,由處理器檢測異常事件并自動觸發(fā)中斷程序的執(zhí)行。

CPU進入中斷程序時,它會先保存當前現(xiàn)場的寄存器狀態(tài),并將中斷的處理程序指針指向中斷程序的入口地址。在中斷程序的執(zhí)行過程中,通常會完成一系列的操作,如訪問狀態(tài)寄存器、中斷觸發(fā)寄存器、中斷向量表等。而針對本文討論的問題,我們需要實現(xiàn)復位功能,即當CPU進入中斷程序后,不再返回到中斷前的狀態(tài),而是徹底地進行復位操作。

實現(xiàn)復位功能需要我們進行如下的步驟:

1. 設置復位向量

在ARM9中,復位向量被定義為地址為0x0000 0000的位置。在處理器執(zhí)行復位操作時,會跳轉至該地址,執(zhí)行復位向量指針所指向的程序代碼。在安裝復位函數(shù)之前,需要先確保復位向量指針正確地指向我們的復位程序。

2. 編寫復位函數(shù)

復位函數(shù)是我們實現(xiàn)徹底復位操作的代碼。在該函數(shù)中,我們需要清除系統(tǒng)的所有狀態(tài)和寄存器信息,使其恢復至初始狀態(tài)。具體而言,我們需要執(zhí)行如下操作:

- 清除所有CPU寄存器
- 復位所有系統(tǒng)寄存器和狀態(tài)寄存器
- 清除所有外設寄存器
- 復位系統(tǒng)時鐘
- 清除所有中斷向量和中斷狀態(tài)寄存器

在完成上述所有操作后,我們需要修改復位向量指針,使其指向我們需要執(zhí)行的下一條指令地址。通常情況下,這個地址應該是程序的入口地址,以啟動系統(tǒng)的正常工作狀態(tài)。

3. 在中斷程序中調(diào)用復位函數(shù)

在中斷處理程序中,我們需要手動調(diào)用復位函數(shù),并防止系統(tǒng)返回中斷前的狀態(tài)。具體而言,我們可以在復位函數(shù)中修改系統(tǒng)狀態(tài)寄存器,以防止中斷返回執(zhí)行。例如,對于ARM9,可以使用以下代碼:

```
void reset(void) __attribute__((naked));
void reset(void) {
__asm__("cpsid i"); // 禁止中斷
__asm__("ldr r0, =0x00000000"); // 設置復位向量指針
__asm__("ldr r1, [r0]"); // 讀取復位向量指針
__asm__("mov sp, r1"); // 更新棧指針
__asm__("ldr r0, =SystemInit"); // 加載復位函數(shù)
__asm__("bx r0"); // 跳轉至復位函數(shù)
}
```

在上述函數(shù)中,我們首先禁止了中斷服務。然后,我們設置了復位向量指針,并用該指針更新了棧指針。接著,我們加載復位函數(shù)并跳轉至其執(zhí)行。在函數(shù)執(zhí)行完畢后,我們可以根據(jù)需要選擇是否啟用中斷服務。

總之,實現(xiàn)ARM9中斷的徹底復位操作需要我們進行復位向量的設置、編寫復位函數(shù),并在中斷程序中調(diào)用該函數(shù)并防止中斷返回執(zhí)行。這樣可以保證系統(tǒng)處于一個完全初始化和安全的狀態(tài),使其能夠愉快地進行下一輪的工作!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9097

    瀏覽量

    367581
  • 寄存器
    +關注

    關注

    31

    文章

    5343

    瀏覽量

    120373
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136839
  • 系統(tǒng)時鐘

    關注

    1

    文章

    30

    瀏覽量

    9312
收藏 人收藏

    評論

    相關推薦

    c51單片機中斷

    定義、運算、函數(shù)調(diào)用等基本的編程語句。 功能實現(xiàn) :都用于實現(xiàn)特定的功能。普通函數(shù)可以實現(xiàn)各種數(shù)據(jù)處理、算法等
    發(fā)表于 11-25 21:43

    stm32怎樣觸發(fā)軟件中斷

    其中實現(xiàn)所需的功能。 觸發(fā)軟件中斷 在STM32,您可以使用NVIC_SetPendingIRQ()函數(shù)來觸發(fā)軟件
    的頭像 發(fā)表于 09-02 09:32 ?882次閱讀

    PLC中斷功能的作用及使用方法

    在工業(yè)自動化控制系統(tǒng),PLC(Programmable Logic Controller,可編程邏輯控制器)作為核心的控制單元,承擔著處理各種控制邏輯、實現(xiàn)自動化操作的重要任務。中斷
    的頭像 發(fā)表于 06-15 17:54 ?2049次閱讀

    請問tim2中斷函數(shù)里怎么觸發(fā)tim1的中斷?

    tim2中斷函數(shù)里怎么觸發(fā)tim1的中斷
    發(fā)表于 04-10 06:37

    STM32中斷分組及外部中斷的配置過程分享

    STM32中斷分組   STM32 的每一個GPIO都能配置成一個外部中斷觸發(fā)源,這點也是 STM32 的強大之處。STM32 通過根據(jù)引腳的序號不同將眾多中斷觸發(fā)源分成不同的組,比如:PA0
    發(fā)表于 04-08 08:05

    如何實現(xiàn)SysTick中斷的嵌套自身?

    中斷直接退出到我想要執(zhí)行的調(diào)度函數(shù)RTTaskSchedule ,執(zhí)行完調(diào)度函數(shù)RTTaskSchedule 后再執(zhí)行函數(shù)IrqReturn返回到main。但是這段代碼并不能實現(xiàn)我想
    發(fā)表于 03-25 06:20

    STM32F103RCT6 uart1中斷方式接收后不返回主程序了,但新的中斷還能進來是怎么回事?

    uart1中斷方式接收后不返回主程序了,但新的中斷還能進來,芯片型號STM32F103RCT6 void HAL_UART_RxCpltCallback(UART_HandleTypeDef
    發(fā)表于 03-22 07:01

    單片機中斷功能及其應用

    單片機中斷功能及其應用? 單片機中斷是指在程序執(zhí)行過程,根據(jù)特定的條件或事件自動暫時中斷當前程序的執(zhí)行,轉而執(zhí)行特定的
    的頭像 發(fā)表于 01-30 14:45 ?5395次閱讀

    TOM0 channel5中斷異常的原因?

    正常情況下ADC中斷和TOM0 channel5中斷都是正常的,當出現(xiàn)異常時,ADC中斷正常,TOM0 channel5中斷中斷請求,但是
    發(fā)表于 01-25 06:33

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發(fā)送數(shù)據(jù)無法進入中斷的原因?

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發(fā)送數(shù)據(jù)無法進入中斷,單獨使用沒有什么問題,還望各位指教
    發(fā)表于 01-17 06:44

    M0516中斷優(yōu)先級怎么設置?

    新唐M0516中斷優(yōu)先級的設置,有沒有示例,沒找到相關接口,謝謝!
    發(fā)表于 01-16 07:25

    s3c2410中斷控制模塊的中斷狀態(tài)寄存器是?

    事件的寄存器。 中斷是計算機系統(tǒng)中一種重要的機制,它可以中斷當前的程序執(zhí)行,轉而執(zhí)行一個與當前事件相關的特定程序,然后再返回原來的程序繼續(xù)執(zhí)行。S3C2410
    的頭像 發(fā)表于 01-05 17:28 ?739次閱讀

    arm中斷是怎么實現(xiàn)

    ARM中斷實現(xiàn)是通過中斷控制器和異常模式實現(xiàn)的。ARM處理器通過
    的頭像 發(fā)表于 01-05 15:18 ?914次閱讀

    stm32中斷怎么處理的

    STM32是一款非常強大的微控制器系列,具有豐富的外設和功能。中斷是STM32非常重要的部分,能夠幫助我們提高系統(tǒng)的響應速度和效率。本文將詳細介紹STM32中斷的處理方法。 一、
    的頭像 發(fā)表于 01-02 17:35 ?2591次閱讀

    ADXL345中斷清除不穩(wěn)定怎么處理?

    = adxl345_read_reg(0x30); //讀ADXL345中斷源寄存器,清中斷標志位 但在測試的過程,INT2的引腳電平有時不能被拉低,通過mcu的調(diào)試工具查看,此種異常
    發(fā)表于 01-01 06:41