s5pv210 中斷實戰

2021-07-31 22:42:44 字數 2943 閱讀 8092

以下內容源於部落格的學習,以及朱有鵬老師課程的學習,和網路資源的整理。

(1)建立異常向量表;

(2)中斷初始化;

(3)使能(如外部中斷,寫中斷處理函式);

(4)建立中斷號與中斷處理函式的聯絡,使能。

當中斷發生時,中斷處理函式會自動處理中斷;

流程如下圖:

下面按上述步驟編寫**,內容細節見部落格

/*

* s5pv210 裸機

* * 異常向量表初始化

* */

#define vector_table_base 0xd0037400

#define reset_offset 0x0

#define undef_offset 0x4

#define svc_offset 0x8

#define prectch_offset 0xc

#define data_abort_offset 0x10

#define irq_offset 0x18

#define fiq_offset 0x1c

#define _pfunc_reset (*(unsigned int*)(vector_table_base+reset_offset))

#define _pfunc_undef (*(unsigned int*)(vector_table_base+undef_offset))

#define _pfunc_svc (*(unsigned int*)(vector_table_base+svc_offset))

#define _pfunc_prectch (*(unsigned int*)(vector_table_base+prectch_offset))

#define _pfunc_data_abort (*(unsigned int*)(vector_table_base+data_abort_offset))

#define _pfunc_irq (*(unsigned int*)(vector_table_base+irq_offset))

#define _pfunc_fiq (*(unsigned int*)(vector_table_base+fiq_offset))

extern void irq_handle(void);

void reset_handle(void)

void undef_handle(void)

void svc_handle(void)

void prectch_handle(void)

void data_abort_handle(void)

void vector_table_init(void)

其中,irq_handle要寫在彙編irq_handle.s中(因為要設定棧,以及儲存現場 ),如下

#define irq_stack        0xd0037f80 

.global irq_handle

irq_handle:

//設定irq的棧

ldr sp, =irq_stack

//由於**流水線的存在,pc為此時的程式語句+8,儲存的時候要把下一句儲存到lr中

sub lr, lr, #4

//儲存現場

s*** sp!

//跳轉到中斷處理函式

bl isr_handler

//恢復現場

ldmfd sp! ^//這裡為什麼不是恢復r0~r12

arm儲存中斷時為什麼使用 sub lr, lr, #4?

(1)首先要談流水線,在arm執行過程中一般分為取指,解碼,執行階段;

(2)一般pc在發生中斷時lr儲存的是當前的pc值,這裡pc值是多少呢?

//清除4個中斷處理函式

void clean_vicaddress(void)

void interrupt_init(void)

void int_disable(unsigned int num)

#include "interrupt.h"

#include "stdio.h"

extern void led_blink(void);

extern void led1_on(void);

extern void vector_table_init(void);

extern void key_init(void);

extern void uart_init(void);

int main(void)

}

小總結:

一、s5pv210中斷處理的程式設計實踐

2、中斷控制器初始化

3、中斷的使能與禁止

4、繫結自己實現的isr到vicnvectaddr

5、真正的中斷處理程式如何獲取isr

二、整個中斷的流程梳理:

整個中斷的工作分為2部分:

第一部分是我們為中斷響應而做的預備工作:

1. 初始化中斷控制器

2. 繫結寫好的isr到中斷控制器

3. 相應中斷的所有條件使能

第二部分是當硬體產生中斷後如何自動執行isr:

1. 第一步,經過異常向量錶跳轉入irq/fiq的入口

2. 第二步,做中斷現場保護(在start.s中),然後跳入isr_handler

3. 第三步,在isr_handler中先去搞清楚是哪個vic中斷了,然後直接去這個vic的addr暫存器中取isr來執行即可。

4. 第四步,isr執行完,中斷現場恢復,直接返回繼續做常規任務。

S5PV210中斷處理

start 1 設定棧空間 防止之前的uboot 被覆蓋,應為c中需要棧空間 mov r0,0x53 msr cpsr cxsf,r0 b main main函式 1 led燈引腳功能設定 gpj2con 0xf 0 gpj2con 1 0 2 中斷初始化 2 1 註冊中斷函式 功能函式 start...

s5pv210 中斷系統相關介紹

參考資料 1 異常向量表是cpu中某些特定位址的特定定義。當中斷發生的時候,中斷要想辦法通知cpu去處理中斷,怎麼做到?依靠異常向量表。2 在cpu設計時,事先定義了cpu中一些特定位址作為特定異常的入口位址。3 以上講的是cpu硬體設計時對異常向量表的支援,下來就需要軟體支援了。1 對soc來說,...

關於S5PV210中斷的問題

1 異常向量表 1 所有的cpu都有異常向量表,是cpu設計是就設定好的,是硬體範疇。2 包括但不只是中斷。中斷只是其中的一種 isr和fiq 異常機制,還有其他的 資料異常 軟體中斷 未定義指令 重置 3 s5pv210 的異常向量表可以改變 在 cp15 協處理器中 以適應作業系統的需求。但是目...