以下裸機程式基於gt2440,編譯器為arm-linux-gcc-4.4.3。
程式布局:源**由interrupt.s和led.c兩個檔案組成,interrupt負責初始化工作,led.c裡定義了中斷處理程式。
程式流程:首先安裝異常向量表,在復位異常裡關閉看門狗,然後進入普通中斷模式,設定普通中斷的棧指標(為c語言寫的中斷處理程式做準備),接著設為特權模式,初始化中斷(設定io管腳,開啟中斷),最後cpu一直死迴圈等待外部中斷觸發。當外部中斷到來時,先保護現場,跳到led.c裡的handle_irp()函式,在該函式裡將四個led點亮,接著返回,最後恢復現場,返回到死迴圈。
interrupt.s:
1//暫存器實體地址巨集定義
2#define wtcon 0x5300000034
#define gpfcon 0x56000050
5 #define ngpf_int2 (0x02<<4
)6 #define ngpf_int0 (0x02<<0)7
#define exint0 0x56000088 89
#define srcpnd 0x4a000000
10#define intmod 0x4a000004
11#define intmsk 0x4a000008
12#define priority 0x4a00000c
13#define intpnd 0x4a000010
14#defind intoffset 0x4a000014
1516
17.section .text
18.global _start
19_start:
20@異常向量表
21b reset
22b underfinded_instruction
23b soft_interrupt
24b abort_prefetch
25b abort_data
26b reserved
27b irq
28b fiq
2930
31@復位異常
32reset:
33bl disable_watchdog @跳到關閉看門狗程式
34msr cpsr_c,#0xd2 @進入普通中斷模式
35 ldr sp,=3072
@設定棧指標
36msr cpsr_c,#0xdf @設為特權模式
3738
bl init_int @跳到中斷初始化程式
39loop:
40b loop @死迴圈
4142
43@關閉看門狗
44disable_watchdog:
45ldr r0,=wtcon
46bic r1,r0,#0x20
47str
r1,[r0]
4849
movpc,lr
5051
52@中斷初始化
53init_int:
54@開啟exint2
55ldr r0,=intmsk
56ldr r1,[r0]
57bic r1,r1,#0x04
58str
r1,[r0]
59@gpf2設為外部中斷功能
60ldr r0,=gpfcon
61ldr r1,=ngpf_int2
62str
r1,[r0]
63@exint2下降沿觸發中斷
64ldr r0,=exint0
65mov
r1,#0x0200
66str
r1,[r0]
67msr cpsr_c,#0x5f @開啟cpu中斷
6869
movpc,lr
7071
72@普通中斷異常入口
73irq:
74sub lr,lr,#4
@修正返回位址
75s***b sp!, @暫存器入棧
76ldr lr,=int_return @設定中斷處理程式返回位址
77ldr pc,=handle_irq @跳到中斷處理程式(led.c裡)
78int_return:
79ldmia sp!,^ @中斷異常返回,暫存器出棧和恢復cpsr暫存器
8081
8283
underfinded_instruction:
84b underfinded_instruction
85soft_interrupt:
86b soft_interrupt
87abort_prefetch:
88b abort_prefetch
89abort_data:
90b abort_data
91reserved:
92b reserved
93fiq:
94 b fiq
led.c:
1#define gpbcon (*(volatile unsigned long *)0x56000010)
2#define gpbdat (*(volatile unsigned long *)0x56000014)
3#define gpbup (*(volatile unsigned long *)0x56000018)45
#define ngpb_output ((1<<10)|(1<<12)|(1<<14)|(1<<16))67
#define srcpnd (*(volatile unsigned long *)0x4a000000)
8#define intpnd (*(volatile unsigned long *)0x4a000010)910
void
handle_irq()
11
makefile:
1 interrupt.bin:2arm-linux-gcc -c -o interrupt.o interrupt.s
3arm-linux-gcc -c -o led.o led.c
4arm-linux-ld -ttext 0x00000000 interrupt.o led.o -o interrupt_elf
5arm-linux-objcopy -o binary -s interrupt_elf interrupt.bin
6rm -f interrupt_elf interrupt.o led.o78
clean:
9 rm -f interrupt.bin
面試題之二 中斷服務函式
中斷問題也是面試嵌入式崗位時,面試官比較喜歡拷問的問題之一,作為乙個嵌入式開發人員,自然少不了與中斷打交道,裸機程式中作為前台服務程式,發揮著重要的作用。中斷服務函式應該注意的四大點 1.中斷服務函式不能傳入引數 2.中斷服務函式不能有返回值 3.中斷服務函式應做到短小精悍 4.不要在中斷函式中使用...
微控制器學習筆記(二) 中斷系統
cpu正在處理某件事情時,微控制器的內部或外部發生的某一事件請求cpu迅速去處理,於是cpu暫時中止當前的工作去處理所發生的事件。處理的過程是由中斷服務處理程式來負責的,它處理完後又回到原來被中止的地方,繼續原來的工作,這就是中斷。一 中斷請求 51 mcs 51系統簡稱,以下均使用51 中斷系統有...
ARM裸機開發(三)SDRAM程式設計
以下裸機程式基於gt2440,編譯器為arm linux gcc 4.4.3。程式結構 程式由sdram.s和main.c兩個檔案組成,sdram.s檔案完成一些初始化工作,如時鐘初始化,記憶體控制器初始化,拷貝第二階段 到sdram等 main.c負責迴圈點亮 熄滅四個led。程式流程 上電時,c...