5937|11

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用U-BOOT,程序在SDRAM中运行为什么不能进入中断 [复制链接]

大侠们好:
我使用的是openjtag光盘里面的U-BOOT,nandflash启动,
板子是革新的板子 开发商提供的ADS编译的程序
直接下载到0X30000000 的位置运行,ROBASE也设置为0X30000000,
程序中没有中断的时候就没有问题
有中断的时候程序就死到那里了
为什么没有中断发生呢???难道是中断向量不同?

问题1:
        我在u-boot下的START.S文件中关于中断部分只看到这些:

.globl _start
_start: b      reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort:  .word data_abort
_not_used:  .word not_used
_irq:  .word irq
_fiq:  .word fiq
这个就是中断向量表吧  但是这些向量的值是多少啊  我在文件中怎么没看到相关的定义或者宏?

问题2:

在SDRAM中运行的时候,当发生中断时,PC指针跳转的位置0地址,这个地址是FLASH的0地址,还是内部ram的0地址,或者是SDRAM的起始地址?

问题3

开发商提供的这些应用程序里面有一个2410init.s的文件  这个文件时用来初始化硬件的,u-boot不是也初始化硬件吗?那这两个是不是重复了啊?
还有就是u-boot和2410init.s文件都有中断向量表,那到底用的是哪一个啊?很迷茫,期待回答





最新回复

我也在调试2410中,不过还没弄uboot。。。 先把顶层混熟了再搞嘛,别急,原理相通的。  详情 回复 发表于 2010-1-29 12:31
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我把2410init.s文件贴出来了,如下:

    GET option.inc
    GET memcfg.inc
    GET 2410addr.inc
BIT_SELFREFRESH EQU (1<<22)
;Pre-defined constants
USERMODE    EQU    0x10
FIQMODE    EQU    0x11
IRQMODE    EQU    0x12
SVCMODE    EQU    0x13
ABORTMODE  EQU    0x17
UNDEFMODE  EQU    0x1b
MODEMASK    EQU    0x1f
NOINT      EQU    0xc0
;The location of stacks
UserStack  EQU (_STACK_BASEADDRESS-0x3800)    ;0x33ff4800 ~
SVCStack    EQU (_STACK_BASEADDRESS-0x2800)    ;0x33ff5800 ~
UndefStack  EQU (_STACK_BASEADDRESS-0x2400)    ;0x33ff5c00 ~
AbortStack  EQU (_STACK_BASEADDRESS-0x2000)    ;0x33ff6000 ~
IRQStack    EQU (_STACK_BASEADDRESS-0x1000)    ;0x33ff7000 ~
FIQStack    EQU (_STACK_BASEADDRESS-0x0)        ;0x33ff8000 ~
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
    sub    sp,sp,#4        
    stmfd  sp!,{r0}      
    ldr    r0,=$HandleLabel
    ldr    r0,[r0]        
    str    r0,[sp,#4]      
    ldmfd  sp!,{r0,pc}   
    MEND
   
    IMPORT  |Image$$RO$$Limit|  
    IMPORT  |Image$$RW$$Base|  
    IMPORT  |Image$$ZI$$Base|  
    IMPORT  |Image$$ZI$$Limit|  
   
    IMPORT  Main        
    AREA    Init,CODE,READONLY
    ENTRY
        ASSERT  EF:ENDIAN_CHANGE
    [ ENDIAN_CHANGE
        ASSERT  EF:ENTRY_BUS_WIDTH
        [ ENTRY_BUS_WIDTH=32
        b  ChangeBigEndian    ;DCD 0xea000007
        ]
        
        [ ENTRY_BUS_WIDTH=16
        andeq  r14,r7,r0,lsl #20  ;DCD 0x0007ea00
        ]
        
        [ ENTRY_BUS_WIDTH=8
        streq  r0,[r0,-r10,ror #1] ;DCD 0x070000ea
            ]
    |
        b  ResetHandler  
        ]
    b  HandlerUndef   
    b  HandlerSWI      
    b  HandlerPabort  
    b  HandlerDabort  
    b  .              
    b  HandlerIRQ      
    b  HandlerFIQ      
;@0x20
    b  EnterPWDN
ChangeBigEndian
;@0x24
    [ ENTRY_BUS_WIDTH=32
        DCD 0xee110f10  ;0xee110f10 => mrc p15,0,r0,c1,c0,0
        DCD 0xe3800080  ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian
        DCD 0xee010f10  ;0xee010f10 => mcr p15,0,r0,c1,c0,0
    ]
    [ ENTRY_BUS_WIDTH=16
        DCD 0x0f10ee11
        DCD 0x0080e380  
        DCD 0x0f10ee01  
    ]
    [ ENTRY_BUS_WIDTH=8
        DCD 0x100f11ee  
        DCD 0x800080e3  
        DCD 0x100f01ee  
        ]
    DCD 0xffffffff  
    DCD 0xffffffff
    DCD 0xffffffff
    DCD 0xffffffff
    DCD 0xffffffff
    b ResetHandler
   

EnterPWDN         
    mov r2,r0              ;r2=rCLKCON
    tst r0,#0x8            ;POWER_OFF mode?
    bne ENTER_POWER_OFF
ENTER_STOP  
    ldr r0,=REFRESH   
    ldr r3,[r0]                    ;r3=rREFRESH   
    mov r1, r3
    orr r1, r1, #BIT_SELFREFRESH
    str r1, [r0]                  
    mov r1,#16         
0  subs r1,r1,#1
    bne %B0
    ldr r0,=CLKCON      ;enter STOP mode.
    str r2,[r0]   
    mov r1,#32
0  subs r1,r1,#1  
    bne %B0        
    ldr r0,=REFRESH   
    str r3,[r0]
   
    MOV_PC_LR
ENTER_POWER_OFF
   
    ldr r0,=REFRESH   
    ldr r1,[r0]                    ;r1=rREFRESH   
    orr r1, r1, #BIT_SELFREFRESH
    str r1, [r0]                    ;Enable SDRAM self-refresh
    mov r1,#16         
0  subs r1,r1,#1
    bne %B0
    ldr    r1,=MISCCR
    ldr r0,[r1]
    orr r0,r0,#(7<<17)  
    str r0,[r1]
    ldr r0,=CLKCON
    str r2,[r0]   
    b .                ;CPU will die here.
   
WAKEUP_POWER_OFF
        ldr r1,=MISCCR
    ldr r0,[r1]
    bic r0,r0,#(7<<17)      
    str r0,[r1]
   
       ldr r0,=SMRDATA
    ldr r1,=BWSCON      
    add r2, r0, #52      
0
    ldr r3, [r0], #4   
    str r3, [r1], #4   
    cmp r2, r0      
    bne %B0
    mov r1,#256
0  subs r1,r1,#1      
    bne %B0
    ldr r1,=GSTATUS3   
    ldr r0,[r1]
    mov pc,r0
    LTORG  
HandlerFIQ      HANDLER HandleFIQ
HandlerIRQ      HANDLER HandleIRQ
HandlerUndef    HANDLER HandleUndef
HandlerSWI      HANDLER HandleSWI
HandlerDabort  HANDLER HandleDabort
HandlerPabort  HANDLER HandlePabort
IsrIRQ  
    sub    sp,sp,#4      ;reserved for PC
    stmfd  sp!,{r8-r9}  
   
    ldr    r9,=INTOFFSET
    ldr    r9,[r9]
    ldr    r8,=HandleEINT0
    add    r8,r8,r9,lsl #2
    ldr    r8,[r8]
    str    r8,[sp,#8]
    ldmfd  sp!,{r8-r9,pc}
;=======
; ENTRY  
;=======
ResetHandler
    ldr r0,=WTCON          ;watch dog disable
    ldr r1,=0x0        
    str r1,[r0]
    ldr r0,=INTMSK
    ldr r1,=0xffffffff      ;all interrupt disable
    str r1,[r0]
    ldr r0,=INTSUBMSK
    ldr r1,=0x7ff          ;all sub interrupt disable, 2002/04/10
    str r1,[r0]
    [ {FALSE}
        ; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);   
        ; Led_Display
    ldr r0,=GPFCON
    ldr r1,=0x5500      
    str r1,[r0]
    ldr r0,=GPFDAT
    ldr r1,=0x10
    str r1,[r0]
    ]
    ;To reduce PLL lock time, adjust the LOCKTIME register.
    ldr r0,=LOCKTIME
    ldr r1,=0xffffff
    str r1,[r0]
        
        [ PLL_ON_START
    ;Configure MPLL
    ldr r0,=MPLLCON         
    ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=12MHz,Fout=50MHz
    str r1,[r0]
    ]
   
    ldr r1,=GSTATUS2
    ldr r0,[r1]
    tst r0,#0x2
         
    bne WAKEUP_POWER_OFF
    EXPORT StartPointAfterPowerOffWakeUp
StartPointAfterPowerOffWakeUp
    ;Set memory control registers
    ldr r0,=SMRDATA
    ldr r1,=BWSCON      ;BWSCON Address
    add r2, r0, #52    ;End address of SMRDATA
0      
    ldr r3, [r0], #4   
    str r3, [r1], #4   
    cmp r2, r0      
    bne %B0
   
        ;Initialize stacks
    bl  InitStacks
   
    ; Setup IRQ handler
    ldr r0,=HandleIRQ      
    ldr r1,=IsrIRQ          ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
    str r1,[r0]
    ;Copy and paste RW data/zero initialized data
    ldr r0, =|Image$$RO$$Limit|    ; Get pointer to ROM data
    ldr r1, =|Image$$RW$$Base|      ; and RAM copy
    ldr r3, =|Image$$ZI$$Base|  
   
   
    cmp r0, r1      ; Check that they are different
    beq %F2
1      
    cmp r1, r3      ; Copy init data
    ldrcc  r2, [r0], #4            
    strcc  r2, [r1], #4   
    bcc %B1
2      
    ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment
    mov r2, #0
3      
    cmp    r3, r1      ; Zero init
    strcc  r2, [r3], #4
    bcc    %B3

    [ NOTHUMBCODE
        bl  Main        
        b  .                     
    ]
    InitStacks
   
    mrs r0,cpsr
    bic r0,r0,#MODEMASK
    orr r1,r0,#UNDEFMODE|NOINT
    msr cpsr_cxsf,r1                ;UndefMode
    ldr sp,=UndefStack
   
    orr r1,r0,#ABORTMODE|NOINT
    msr cpsr_cxsf,r1                ;AbortMode
    ldr sp,=AbortStack
    orr r1,r0,#IRQMODE|NOINT
    msr cpsr_cxsf,r1                ;IRQMode
    ldr sp,=IRQStack
   
    orr r1,r0,#FIQMODE|NOINT
    msr cpsr_cxsf,r1                ;FIQMode
    ldr sp,=FIQStack
    bic r0,r0,#MODEMASK|NOINT
    orr r1,r0,#SVCMODE
    msr cpsr_cxsf,r1                ;SVCMode
    ldr sp,=SVCStack
   
    ;USER mode has not be initialized.
   
    mov pc,lr
    ;The LR register won't be valid if the current mode is not SVC mode.
   
    LTORG
SMRDATA DATA

    DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))  ;GCS0
    DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))  ;GCS1
    DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))  ;GCS2
    DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))  ;GCS3
    DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))  ;GCS4
    DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))  ;GCS5
    DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
    DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
;  DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)    ;Tchr not used bit
    DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+REFCNT)      

;  DCD 0x32            ;SCLK power saving mode, ARM core burst disable, BANKSIZE 128M/128M
    DCD 0xb2            ;SCLK power saving mode, ARM core burst enable , BANKSIZE 128M/128M - 11/29/2002
    DCD 0x30            ;MRSR6 CL=3clk
    DCD 0x30            ;MRSR7
;  DCD 0x20            ;MRSR6 CL=2clk
;  DCD 0x20            ;MRSR7
    ALIGN

    AREA RamData, DATA, READWRITE
    ^  _ISR_STARTADDRESS
HandleReset    #  4
HandleUndef    #  4
HandleSWI      #  4
HandlePabort    #  4
HandleDabort    #  4
HandleReserved  #  4
HandleIRQ      #  4
HandleFIQ      #  4
;Don't use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
HandleEINT0    #  4
HandleEINT1    #  4
HandleEINT2    #  4
HandleEINT3    #  4
HandleEINT4_7  #  4
HandleEINT8_23  #  4
HandleRSV6      #  4
HandleBATFLT    #  4
HandleTICK      #  4
HandleWDT      #  4
HandleTIMER0    #  4
HandleTIMER1    #  4
HandleTIMER2    #  4
HandleTIMER3    #  4
HandleTIMER4    #  4
HandleUART2    #  4
HandleLCD      #  4
HandleDMA0      #  4
HandleDMA1      #  4
HandleDMA2      #  4
HandleDMA3      #  4
HandleMMC      #  4
HandleSPI0      #  4
HandleUART1    #  4
HandleRSV24    #  4
HandleUSBD      #  4
HandleUSBH      #  4
HandleIIC      #  4
HandleUART0    #  4
HandleSPI1      #  4
HandleRTC      #  4
HandleADC      #  4
end
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
问题2.中断向量表的地址肯定是0地址,可以通过remap来实现不是指向flashrom还是sdram。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个0地址到底是什么要看你的芯片设置了,查一下DATASHEET。
另外通过AXD等调试工具看一下你目前的0地址处有没有中断的处理代码,估计是还没有。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
我用的是S3C2410的板子哈  我网上查的说 这个不可以remap  而44B0的remap例子倒很多啊
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
谁知道啊  帮帮忙哈
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个remap是什么概念?
你可以自己修改一下0地址的代码
参考一下这个:
http://blog.eeworld.net/Veabol/archive/2009/12/18/5029524.aspx
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
非常感谢veablo 我再试试看哈
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
帮顶下!!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题3: 你是不是通过ADS下的程序,把U-BOOT下载到内存执行,如果是这样个话,U-BOOT执行时相当把CPU重新初始化一次,中断向量表是U-boot的了,而ADS下的现在一定不存在。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
Q1:
中断向量表里面的值 就是中断处理程序的函数入口地址,在你那上面就是undefined_instruction。。。的值

Q2:
在SDRAM中运行的时候,当发生中断时,PC指针跳转的位置0地址,这个地址是FLASH的0地址,还是内部ram的0地址,或者是SDRAM的起始地址?
如果你没有开启MMU映射的话,发生中断了,PC会指向0、4、8、c等这几个地址。
2410的话,因为它片内含4KB SRAM(从0开始)那么中断后,PC依然会跳转到这边来。程序的运行都是在RAM中进行的,这时候不关nand的事情

Q3:
uboot还没有研究过,嘿嘿.vivi看过一点

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
我也在调试2410中,不过还没弄uboot。。。
先把顶层混熟了再搞嘛,别急,原理相通的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表