<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > GNU ARM匯編--(四)中斷匯編之非嵌套中斷處理

GNU ARM匯編--(四)中斷匯編之非嵌套中斷處理

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏
  • ldrr2,=GPBDAT
  • ldrr1,=0x0e0
  • strr1,[r2]
  • ldrr0,=EINTPEND
  • ldrr1,=0xf0
  • strr1,[r0]
  • ldrr0,=SRCPND
  • ldrr1,=0x3f@0b11111
  • strr1,[r0]
  • ldrr0,=INTPND
  • ldrr1,=0x3f@0b11111
  • strr1,[r0]
  • movpc,lr
  • delay:
  • ldrr3,=0xffff
  • delay1:
  • subr3,r3,#1
  • cmpr3,#0x0
  • bnedelay1
  • movpc,lr
  • main:
  • ledloop:
  • ldrr1,=0x1c0
  • strr1,[r2]
  • bldelay
  • ldrr1,=0x1a0
  • strr1,[r2]
  • bldelay
  • ldrr1,=0x160
  • strr1,[r2]
  • bldelay
  • ldrr1,=0x0e0
  • strr1,[r2]
  • bldelay
  • bledloop
  • undefined_instruction:
  • nop
  • software_interrupt:
  • nop
  • prefetch_abort:
  • nop
  • data_abort:
  • nop
  • not_used:
  • nop
  • fiq:
  • nop

  • lds文件:

    本文引用地址:http://dyxdggzs.com/article/201611/321727.htm

    [cpp]view plaincopy
    1. OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
    2. OUTPUT_ARCH(arm)
    3. ENTRY(_start)
    4. SECTIONS{
    5. .=0x00000000;
    6. .text:{
    7. *(.text)
    8. *(.rodata)
    9. }
    10. .dataALIGN(4):{
    11. *(.data)
    12. }
    13. .bssALIGN(4):{
    14. *(.bss)
    15. }
    16. }

    makefile:

    [cpp]view plaincopy
    1. CROSS=arm-linux-
    2. CFLAGS=-nostdlib
    3. int.bin:start.S
    4. ${CROSS}gcc$(CFLAGS)-c-ostart.ostart.S
    5. ${CROSS}ld-Tint.ldsstart.o-oint.elf
    6. #${CROSS}ld-Ttext-segment0x30000000start.o-oint.elf
    7. ${CROSS}objcopy-Obinary-Sint.elfint.bin
    8. #rm-f*.o
    9. clean:
    10. rm-f*.elf*.o
    11. rm-fint.bin

    該程序實(shí)現的流水燈,然后四個(gè)按鍵可以實(shí)現外部中斷.

    代碼中值得注意的地方有幾點(diǎn):

    1、lds文件中的地址配為0x00000000,因為程序是download到nandflash中運行的.最開(kāi)始這里寫(xiě)的是0x30000000,那在異常向量表中:

    @b irq
    ldr pc, _irq

    就出現了一個(gè)問(wèn)題:只能用b irq跳轉,無(wú)法用ldr pc, _irq跳轉.當時(shí)就覺(jué)得奇怪,找了半天原因.后來(lái)才知道b跳轉和用ldr偽指令只有區別的:

    b是位置無(wú)關(guān)的,ldr不是位置無(wú)關(guān)的

    b的范圍只能是前后16M,總共32M,而ldr是4G

    ldr的跳轉是根據_irq: .word irq的值,這個(gè)值是鏈接的時(shí)候確定的,也就是與鏈接地址相關(guān).

    所以在lds中鏈接地址改為0x00000000后,b和ldr都是正確的.

    具體可以用dump看一下實(shí)際效果:

    當lds中是0x30000000時(shí),arm-linux-objdump -d int.elf結果如下:

    30000000 <_start>:
    30000000: ea00000e b 30000040
    30000004: e59ff014 ldr pc, [pc, #20] ; 30000020 <_undefined_instruction>
    30000008: e59ff014 ldr pc, [pc, #20] ; 30000024 <_software_interrupt>
    3000000c: e59ff014 ldr pc, [pc, #20] ; 30000028 <_prefetch_abort>
    30000010: e59ff014 ldr pc, [pc, #20] ; 3000002c <_data_abort>
    30000014: e59ff014 ldr pc, [pc, #20] ; 30000030 <_not_used>
    30000018: e59ff014 ldr pc, [pc, #20] ; 30000034 <_irq>
    3000001c: e59ff014 ldr pc, [pc, #20] ; 30000038 <_fiq>

    而lds中是0x00000000時(shí),dump的結果如下:

    00000000 <_start>:
    0: ea00000e b 40
    4: e59ff014 ldr pc, [pc, #20] ; 20 <_undefined_instruction>
    8: e59ff014 ldr pc, [pc, #20] ; 24 <_software_interrupt>
    c: e59ff014 ldr pc, [pc, #20] ; 28 <_prefetch_abort>
    10: e59ff014 ldr pc, [pc, #20] ; 2c <_data_abort>
    14: e59ff014 ldr pc, [pc, #20] ; 30 <_not_used>
    18: e59ff014 ldr pc, [pc, #20] ; 34 <_irq>
    1c: e59ff014 ldr pc, [pc, #20] ; 38 <_fiq>

    解決了這第一個(gè)問(wèn)題,總算可以用ldr跳入中斷向量了.

    2、中斷處理程序的寫(xiě)法:

    [cpp]view plaincopy
    1. irq:
    2. sublr,lr,#4
    3. stmfdsp!,{r0-r12,lr}
    4. blirq_isr
    5. ldmfdsp!,{r0-r12,pc}^
    值得注意的是ldmfd sp!,{r0-r12,pc}^ 會(huì )自動(dòng)的從spsr_irq中恢復到cpsr中.

    stmfd等價(jià)于stmdb,ldmfd等價(jià)于ldmia.因為arm使用FD(向低地址整長(cháng)的滿(mǎn)棧),所以堆棧處理都用fd的后綴即可.

    3、記得在中斷處理程序中清除中斷,不然的話(huà)會(huì )一直響應那個(gè)中斷.


    上一頁(yè) 1 2 下一頁(yè)

    關(guān)鍵詞: ARM匯編中斷匯編中斷處

    評論


    相關(guān)推薦

    技術(shù)專(zhuān)區

    關(guān)閉
    国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
    <dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>