Tiny4412中斷介紹
通過幾天裸板驅動開發,今天對ARM的中斷做一些簡單總結,前面我們已經了解了ARM的7種異常模式,中斷是異常模式的一種,在ARM中異常事件發生將會觸發中斷,但是,所有的中斷都不能直接訪問cpu,而是都統一由GIC(中斷管理器)來管理;下面是samsung提供的模式圖:
其中GIC管理的中斷有分為:
(1)SGI:一個cpu中斷另一個cpu(cpu0 ->cpu1)
(2)PPI:一個中斷只能中斷一個cpu
(3)SPI:一個中斷可以中斷多個cpu
處理一個中斷大致需要三步:
(1)cpu permit interrupt (cpu允許中斷)
(2)GIC enable (啟用GIC)
(3)SET Interrupt source (設置中斷源)
下面是用SGI實現的一個程序:
頭文件:
1 #ifndef __BUNFLY_H
2 #define __BUNFLY_H
3
4 #define ICCICR_CPU0 (*(volatile unsigned long *)0x10480000)
5 #define ICCPMR_CPU0 (*(volatile unsigned long *)0x10480004)
6 #define ICDDCR (*(volatile unsigned long *)0x10490000)
7 #define ICDIPR2_CPU0 (*(volatile unsigned long *)0x10490408)
8 #define ICDIPTR2_CPU0 (*(volatile unsigned long *)0x10490808)
9 #define ICDISER0_CPU0 (*(volatile unsigned long *)0x10490100)
10 #define ICDSGIR (*(volatile unsigned long *)0x10490f00)
11 #define ICCEOIR_CPU0 (*(volatile unsigned long *)0x10480010)
12 #define ICCIAR_CPU0 (*(volatile unsigned long *)0x1048000c)
13
14 #endif //__BUNFLY_H
1 #include "bunfly.h"
2
3 int (*printf)(char *, ...) = 0xc3e114d8;
4 void enable_mmu();
5 void init_table(unsigned long *addr);
6 void memcpy(unsigned char *dest, unsigned char *src, int len);
7 extern unsigned long vector_start;
8 void do_irq();
9
10 int main()
11 {
12 memcpy(0x70000000, vector_start, 0x1000);
13 enable_mmu();
14
15 *(unsigned long *)0x47000000 = do_irq;
16
17 //step 1: set cpu permit interrupt
18 __asm__ __volatile__(
19 "mrs r0, cpsrn"
20 "bic r0,r0, #0x80n"
21 "msr cpsr, r0n"
22 :::"r0"
23 );
24
25 //step 2: set GIC (cgi) enable
26 ICCICR_CPU0 = 1;//cpu接口控制寄存器(總開關)
27 ICCPMR_CPU0 =0xff;//中斷總優先級(門檻)
28 ICDDCR = 1;//本中斷開關
29 ICDIPR2_CPU0 = (3 << 9);//本中斷優先級
30 ICDIPTR2_CPU0 = (1 << 9);//目標cpu
31 ICDISER0_CPU0 = (1 << 9);//啟用本中斷
32
33 //step 3: set interrupt source
34 ICDSGIR = 9 | (1 << 16);
35
36 printf("welcom backn");
37 }
38
39 void do_irq()
40 {
41 unsigned long ack_id = 0;
42 unsigned long cpu_id = 0;
43 unsigned long data = ICCIAR_CPU0;
44
45 /*clean interrupt*/
46 ack_id = data & 0x3ff;
47 cpu_id = data & (0x7 << 10);
48 ICCEOIR_CPU0 = ack_id | cpu_id;
49
50 printf("this is interruptn");
51 printf("cup_id is %dn", cpu_id >> 10);
52 printf("ack_id is %dn", ack_id);
53
54 }
55
56 void memcpy(unsigned char *dest, unsigned char *src, int len)
57 {
58 int i = 0;
59 for(i = 0; i < len; i++) {
60 dest[i] = src[i];
61 }
62 }
63
64 void enable_mmu()
65 {
66 /*構建表*/
67 unsigned long addr = 0x50000000;
68 init_table(addr);
69 /*打開mmu*/
70 unsigned long mmu = 0;
71 mmu = 1 | (1 << 1) | (1 << 3) | (1 << 8);
72 __asm__ __volatile__ (
73 "mov r0, #3n"
74 "MCR p15, 0, r0, c3, c0, 0n"http://設置為管理員
75 "MCR p15, 0, %0, c2, c0, 0n"http://設置表的地址
76 "MCR p15, 0, %1, c1, c0, 0n"http://開啟mmu
77 :
78 : "r" (addr), "r" (mmu)
79 :
80 );
81
82 }
83
84 __asm__(
85
86 "vector: n"
87 " b resetn"
88 " b undn"
89 " b swin"
90 " b pre_abtn"
91 " b data_abtn"
92 " .word 0x0n"
93 " b irqn"
94 " b fiqn"
95 "reset:n"
96 "und:n"
97 " mov sp, #0x47000000n"
98 " stmdb sp!, {r0-r12, lr}n"
99
100 " ldr r3, =0x47000004n"
101 " ldr r2, [r3]n"
102 " blx r2n"
103
104 " mov sp, #0x47000000n"
105 " ldmdb sp, {r0-r12, pc}^ n"
106
107 "swi:n"
108 " mov sp, #0x47000000n"
109 " stmdb sp!, {r0-r12, lr}^n"
110
111 " mov sp, #0x47000000n"
112 " ldmdb sp, {r0-r12, pc}^ n"
113
114 "pre_abt:n"
115
116 "data_abt:n"
117 " mov sp, #0x47000000n"
118 " sub lr, lr, #4n"
119 " stmdb sp!, {r0-r12, lr}n"
120
121 " ldr r3, =0x47000008n"
122 " ldr r2, [r3]n"
123 " blx r2n"
124
125 " mov sp, #0x47000000n"
126 " ldmdb sp, {r0-r12, pc}^ n"
127 "irq:n"
128
129 " mov sp, #0x47000000n"
130 " sub lr, lr, #4n"
131 " stmdb sp!, {r0-r12, lr}n"
132
133 " ldr r3, =0x47000000n"
134 " ldr r2, [r3]n"
135 " blx r2n"
136
137 " mov sp, #0x47000000n"
138 " ldmdb sp, {r0-r12, pc}^ n"
139
140 "fiq:n"
141
142 ".global vector_startn"
143 "vector_start: n"
144 ".word vector n "
145
146 );
147
148 void init_table(unsigned long *addr)
149 {
150 unsigned long va = 0;
151 unsigned long phys = 0;
152
153 //0x40000000-0x80000000 -> 0x40000000-0x80000000
154 for(va = 0x40000000; va < 0x80000000; va += 0x100000) {
155 phys = va;
156 addr[va >> 20] = phys | 2;
157 }
158
159 //0x10000000-0x14000000 -> 0x10000000-0x140000000
160 for(va = 0x10000000; va < 0x14000000; va += 0x100000) {
161 phys = va;
162 addr[va >> 20] = phys | 2;
163 }
164 //0x10000000-0x14000000 -> 0x10000000-0x140000000
165 for(va = 0x0; va < 0x10000000; va += 0x100000) {
166 phys = va + 0x70000000;
167 addr[va >> 20] = phys | 2;
168 }
169
170 }
運行結果如下:
上一篇:Tiny4412中斷之看門狗
下一篇:Tiny4412模式跳轉
推薦閱讀
史海拾趣
作為一家有社會責任感的企業,晨翔電子始終關注環保問題。公司在生產過程中積極采用環保材料和工藝,減少對環境的影響。同時,公司還積極參與社會公益活動,回饋社會。這些舉措不僅體現了公司的環保意識和社會責任感,也為公司贏得了更多客戶和社會的認可和支持。
Altus Technology Inc自成立以來,始終將技術創新作為公司發展的核心驅動力。在早期,公司研發團隊通過不懈努力,成功開發出了一款具有革命性的芯片,這款芯片在性能和功耗上均優于當時的同類產品。憑借這一技術突破,Altus在市場上迅速獲得了一席之地,并吸引了大量合作伙伴和投資人的關注。隨著技術的不斷迭代和升級,Altus逐漸在電子行業中樹立了技術領先的形象,并持續推出了一系列創新產品,鞏固了市場地位。
Altus Technology Inc自成立以來,始終將技術創新作為公司發展的核心驅動力。在早期,公司研發團隊通過不懈努力,成功開發出了一款具有革命性的芯片,這款芯片在性能和功耗上均優于當時的同類產品。憑借這一技術突破,Altus在市場上迅速獲得了一席之地,并吸引了大量合作伙伴和投資人的關注。隨著技術的不斷迭代和升級,Altus逐漸在電子行業中樹立了技術領先的形象,并持續推出了一系列創新產品,鞏固了市場地位。
在市場競爭日益激烈的情況下,AVA電子意識到單打獨斗已經難以應對市場的挑戰。于是,公司開始尋求與上下游企業的合作,通過產業鏈整合實現協同發展。AVA電子與供應商建立了長期穩定的合作關系,確保了原材料的穩定供應和質量保障;同時,公司還與多家銷售渠道商建立了戰略合作關系,共同開拓市場。這種產業鏈整合的模式不僅降低了公司的運營成本,也提高了公司的市場競爭力。
在追求經濟效益的同時,Crosspoint Solutions公司也積極履行社會責任。公司注重環保和可持續發展,在生產過程中采用環保材料和工藝,減少對環境的影響。此外,公司還積極參與社會公益活動,支持教育事業和扶貧工作。這些舉措不僅提升了公司的社會形象,也增強了員工和客戶的歸屬感。
請注意,這些故事是基于一般電子行業的發展情況虛構的,并不代表Crosspoint Solutions公司的實際發展歷程。如果需要了解該公司的真實故事,建議查閱相關新聞報道、公司官網或行業分析報告等可靠來源。
進入21世紀,聯捷(Elinker)意識到技術創新的重要性,開始加大在研發方面的投入。經過數年的努力,公司成功研發出具有自主知識產權的電子產品,并在市場上取得了良好的反響。同時,公司開始注重品牌建設,通過一系列的市場推廣活動,逐漸樹立了聯捷(Elinker)在電子行業中的品牌形象。
我在深圳一家公司做PCB設計工程師,已有近6年PCB設計經驗,大學本科。包括通信設備(1萬到2萬PIN的PCB)、 終端設備(無線路由器、貓等)。通信設備一般是8到16層PCB,終端設備一般在2到6層的PCB。 & ...… 查看全部問答∨ |
|
問一下有關千兆以太網 auto-negotiation的問題 系統是X86的,目標機是標準PC板,上面加載的是兩個82546網卡,以前在82541下能夠驅動網卡正常工作,但是現在換成82546卻出現miiPhy方面的問題 目前跟代碼發現是在運行miiAutoNegotiation時出現的問題,想請問各位達人。 關于如何在GMII下配置自動 ...… 查看全部問答∨ |
|
RT 芯片是:SST89E516RD 開發板是從網上買的 軟件是KEIL 3 監控程序也已燒進去了 USB線試過,不行 串口線也試過,不行 COM口換了幾個,不行 波特率換了幾個,不行 開發板驅動重裝了,不行 換同學電腦試了,不行 按網上搜集到的資料把 ...… 查看全部問答∨ |
我看了一篇《ucos II+ucGUI+s3c2410+LCD+觸摸屏整合》后知道移植UCGUI需要修改的地方,但我不知道怎么樣把UCGUI加載到編譯器中呢?請高手指點一下。 … 查看全部問答∨ |
呵呵 不好意思 今天在看到上個月有網友在我的貼里問我的點陣模擬時鐘程序是不是lpc1114,其實呢這個是lpc2148 的 是我畢業論文的一部分,其實的我的論文老師也要我發這個程序,等我整理好了發給我老師的時候如果網友還 有感興趣的,我再順便上傳一 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 試用Vishay新型“IHLP磁芯損耗計算器”,搶樓贏好禮
- LPC4370重磅來襲 有獎問答贏好禮!
- 電子工程師,如何更好地擁抱GaN?參與問卷有好禮!
- 報名贏京東卡 | 國產FPGA安路科技2024線上新品發布會
- 兆易GD32450I-EVAL免費測評試用
- 追更有驚喜:解救被FSM折磨過的你,justd0解析LSM6DSOX有限狀態機官方例程
- 電路圖站2.0版上線,公開征集網友建議,填寫調查問卷贏積分!
- 全球首款Cortex-M23內核物聯網芯片SAML10和SAM L11系列 闖關獲取SAML10/SAML11法寶,拆除電子界安全危機,贏好禮!
- 邀請好友體驗WEBENCH,禮品豐厚你有他也有!