以下內容源於部落格的學習,以及朱有鵬老師課程的學習,和網路資源的整理。
(1)建立異常向量表;
(2)中斷初始化;
(3)使能(如外部中斷,寫中斷處理函式);
(4)建立中斷號與中斷處理函式的聯絡,使能。
當中斷發生時,中斷處理函式會自動處理中斷;
流程如下圖:
下面按上述步驟編寫**,內容細節見部落格
其中,irq_handle要寫在彙編irq_handle.s中(因為要設定棧,以及儲存現場 ),如下/*
* 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)
arm儲存中斷時為什麼使用 sub lr, lr, #4?#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
(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 協處理器中 以適應作業系統的需求。但是目...