ARM裸機開發(二)中斷程式設計

2021-09-06 05:53:23 字數 3367 閱讀 8911

以下裸機程式基於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...