| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
ARM中斷系統(tǒng)小結(jié) | 
  
| 作者:erosss 欄目:ARM技術(shù) | 
初看ARM中斷系統(tǒng)覺得有點(diǎn)亂,寫點(diǎn)東西希望對大家有點(diǎn)幫助 中斷詳細(xì)建立過程(1) 首先我們先來看兩個東西. ;/* EXCEPTION HANDLER VECTOR TABLE */ ^ DRAM_BASE HandleReset # 4 HandleUndef # 4 HandleSwi # 4 HandlePrefetch # 4 HandleAbort # 4 HandleReserv # 4 HandleIrq # 4 HandleFiq # 4 小注: 這里的^是MAP,#是FIELD 也就是在DARM的BANK0里面開始的地方定義了一個中斷向量表,用于存放中斷程序的入口地址。 ExceptionHandlerTable DCD UserCodeArea DCD SystemUndefinedHandler DCD SystemSwiHandler DCD SystemPrefetchHandler DCD SystemAbortHandler DCD SystemReserv DCD SystemIrqHandler DCD SystemFiqHandler 這個表中存放的是匯編程序中中斷處理函數(shù)的入口地址,每一項(xiàng)對應(yīng)一個中斷函數(shù)。 下面我們從程序的開始處分析: AREA Init, CODE, READONLY ENTRY B Reset_Handler B Undefined_Handler B SWI_Handler B Prefetch_Handler B Abort_Handler NOP Reserved vector B IRQ_Handler B FIQ_Handler FIQ_Handler SUB sp, sp, #4 STMFD sp!, {r0} FD滿遞減堆棧 執(zhí)行寄存器壓棧操作. LDR r0, =HandleFiq 匯編里的處理函數(shù)地址,然后跳到C中,在DRAM。 LDR r0, [r0] 中斷向量地址給R0. STR r0, [sp, #4] 中斷向量地址給 LDMFD sp!, {r0, pc} 在程序的開始處,首先建立了默認(rèn)的中斷調(diào)用函數(shù).這個過程大家一定非常熟悉, 首先執(zhí)行了壓棧,然后給出了中斷入口地址.這個HandleFiq就是我們前面提到的在DRAM中建立的中斷向量其中一個的地址。 在HandleFiq開始的四個字節(jié)中,放著匯編中斷處理函數(shù)的入口地址。 匯編中斷處理函數(shù)的地址是如何放到DRAM中斷向量表里的呢? 我們上面提到的另一個表就發(fā)揮作用了?聪旅孢@段程序: EXCEPTION_VECTOR_TABLE_SETUP LDR r0, =HandleReset LDR r1, =ExceptionHandlerTable MOV r2, #8 ExceptLoop LDR r3, [r1], #4 STR r3, [r0], #4 SUBS r2, r2, #1 Down Count BNE ExceptLoop ;; 從表里取出來給了HandleReset后面的空間 這一段把ExceptionHandlerTable里的中斷處理函數(shù)的地址拷貝給了DRAM里的中斷向量表。這樣兩者就聯(lián)系起來 在執(zhí)行程序開始的跳轉(zhuǎn)之后就自然跳到了*******Handler.真正的處理函數(shù)之一如下所示: 它實(shí)際上只調(diào)用了C語言的中斷處理函數(shù),其他什么也沒做。 SystemFiqHandler IMPORT ISR_FiqHandler STMFD sp!, {r0-r7, lr} BL ISR_FiqHandler LDMFD sp!, {r0-r7, lr} SUBS pc, lr, #4 它實(shí)際上只調(diào)用了C語言的中斷處理函數(shù),其他什么也沒做。 void ISR_FiqHandler(void) { IntOffSet = (U32)INTOFFSET; (IntOffSet>>2) (*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine }  | 
  
| 2樓: | >>參與討論 | 
| 作者: erosss 于 2005/6/17 13:53:00 發(fā)布:
         SAMSUNG S3C2410初始化代 SAMSUNG S3C2410初始化代 注: 1) CPU: SAMSUNG S3C2410x SDRAM: 64MB/Bank6 FLASH: 16MB/NAND or 16MB/Intel Strata NOR(bank0) 2) 寫一個空的C_Entry()函數(shù),然后在ADS1.2中編譯后生成bin文件直接燒入FLASH即可作為一個簡單的初始化代碼,完成S3C2410的初始化,后續(xù)調(diào)試代碼可以直接下載到SDRAM中.(RAM_STARTADDRESS=0x30000000) ;===================================== ; NAME: 2410INIT.S ; ; DESC: S3C2410 EVB Startup Code ; ; AUTH: PALaDiN@nicesun.com ; ; REV: 1.0.1 ; ; DATE: MAY,2003 ; ;===================================== GBLL IDE_TYPE GBLL CPU_CLK_200 IDE_TYPE SETL {TRUE} ;TRUE=ADS1.2 ;FALSE=SDT2.5 [ IDE_TYPE GET option.s GET memcfg.s GET 2410addr.s ;here GET means INCLUDE used in C language | GET option.a GET memcfg.a GET 2410addr.a ] ;Pre-defined constants USERMODE EQU 0x10 FIQMODE EQU 0x11 IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABORTMODE EQU 0x17 UNDEFMODE EQU 0x1b MODEMASK EQU 0x1f ;This means SYSTEM Mode. NOINT EQU 0xc0 ; ;The location of stacks FIQStack EQU _STACK_BASEADDRESS IRQStack EQU FIQStack+0x1000 AbortStack EQU IRQStack+0x1000 UndefStack EQU AbortStack+0x400 SVCStack EQU UndefStack+0x400 UserStack EQU SVCStack+0x1000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MACRO $HandlerLabel HANDLER $HandleLabel ; HANDLER is macroNAME ; $HandlerLabel is special macro NAME ; $HandleLabel is a variable $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address); sp<sp - 4, ARM Stack is Full_Decending stmfd sp!,{r0} ;PUSH the work register to stack(lr does not PUSH because it return to original address) ldr r0,=$HandleLabel ;load the address of HandleXXX to r0 ldr r0,[r0] ;load the contents(service routine start address) of HandleXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) MEND ;=============================================================== IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialise IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialise AREA Init,CODE,READONLY CODE32 ENTRY b ResetHandler ; b HandlerUndef ;handler for Undefined mode 0x4 b HandlerSWI ;handler for SWI interrupt 0x8 b HandlerPabort ;handler for PAbort 0xC b HandlerDabort ;handler for DAbort 0x10 b . ;reserved 0x14 b HandlerIRQ ;handler for IRQ interrupt 0x18 b HandlerFIQ ;handler for FIQ interrupt 0x1C HandlerFIQ HANDLER HandleFIQ HandlerIRQ HANDLER HandleIRQ HandlerUndef HANDLER HandleUndef HandlerSWI HANDLER HandleSWI HandlerDabort HANDLER HandleDabort HandlerPabort HANDLER HandlePabort ;======= ; ENTRY ;======= ResetHandler ;Initialize stacks bl InitStacks ;============================= ; Configure Crucial Peripherals ;============================= ldr r0,=WTCON ;watch dog disable @0x5300_0000 ldr r1,=0x0 ;= means 0x0 is 32bit contant str r1,[r0] ; ldr r0,=INTMSK ; ldr r1,=0xffffffff ;all interrupt disable str r1,[r0] ldr r0,=INTSUBMSK ldr r1,=0x7ff ; str r1,[r0] ;To reduce PLL LOCK time, adjust the LOCKTIME register. ldr r0,=LOCKTIME ldr r1,=0xffffff str r1,[r0] ;Configure MPLL ldr r0,=MPLLCON ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHZ,Fout=100MHZ str r1,[r0] ;============================= ; Configure MEMORY CONTROLLER ;============================= ;Set MEMORY CONTROL registers according to SMRDATA section ldr r0,=SMRDATA ldr r1,=BWSCON ;BWSCON Address add r2, r0, #52 ;End address of SMRDATA 0 ldr r3, [r0], #4 ; load r3 from r0, then r0=r0+4 str r3, [r1], #4 ; store r3 to r1, then r1=r1+4 cmp r2, r0 bne %B0 ;============================= ; Clear SDRAM ;============================= ldr r0,=GPFCON ldr r1,=0x55aa ;GPF[7:4]OUTPUT GPF[3:0]EINT[3:0] str r1,[r0] ldr r0,=GPFUP ldr r1,=0xff ;GPF up-pull resistors are disabled str r1,[r0] ldr r0,=GPFDAT ldr r1,=0x0 str r1,[r0] ; mov r1,#0 mov r2,#0 mov r3,#0 mov r4,#0 mov r5,#0 mov r6,#0 mov r7,#0 mov r8,#0 ldr r9,=0x3ff0000 ;Lower 32MB ldr r0,=0x30010000 ;leave 64KB for code//=0x30000000 LOOP ;SDRAM clear stmia r0!,{r1-r8} ;stack starts from 0x30000000, subs r9,r9,#32 ; bne LOOP ;============================= ; Exception Vector Table Setup ;============================= EXCEPTION_VECTOR_TABLE_SETUP LDR r0, =HandleReset ; Exception Vector Table MEMORY Loc. LDR r1, =ExceptionHandlerTable ; Exception Handler Assign MOV r2, #8 ; NUMBER of Exception is 8 ExceptLoop LDR r3, [r1], #4 STR r3, [r0], #4 SUBS r2, r2, #1 BNE ExceptLoop ;==================================================== ;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| ; Zero init base => top of initialised data cmp r0, r1 ; Check that they are different beq %F2 ; F means forward 1 cmp r1, r3 ; Copy init data ldrcc r2, [r0], #4 ;> LDRCC r2, [r0] + ADD r0, r0, #4 strcc r2, [r1], #4 ;> STRCC r2, [r1] + ADD r1, r1, #4 bcc %B1 ;B means backward 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 ;==================================================== ; Now change to user mode and set up user mode stack. ;==================================================== MRS r0, cpsr BIC r0, r0, #MODEMASK ;MODEMASK=0X1F ORR r0, r0, #USERMODE|NOINT ;R MSR cpsr_cxsf, r0 LDR sp, =UserStack ;==================================================== ;Jump To C Routines ;==================================================== IMPORT C_Entry bl C_Entry ;Don not use main() because ...... ;bl . ;==================================================== ;Initialize Stacks ;==================================================== ;function initializing stacks InitStacks ;Don not use DRAM,such as stmfd,ldmfd...... ;SVCstack is initialized before ;Under toolkit ver 2.5, ´msr cpsr,r1´ can be used instead of ´msr cpsr_cxsf,r1´ mrs r0,cpsr bic r0,r0,#MODEMASK ;MODEMASK=0x1f orr r1,r0,#UNDEFMODE|NOINT ;r1=0xDB 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  | 
  |
| 3樓: | >>參與討論 | 
| 作者: msliang18 于 2005/6/18 22:06:00 發(fā)布:
         贊一下 贊一下  | 
  |
| 4樓: | >>參與討論 | 
| 作者: erosss 于 2005/6/19 8:34:00 發(fā)布:
         提供雙支持大型操作系統(tǒng)的雙FLASH 2410開發(fā)板 一、核心板: CPU: SAMSUNG S3c2410x (ARM920T CORE,203MHz) FLASH ROM: 512Mbit NAND FLASH (SAMSUNG K9F1208) 2M NOR FLASH HY29LV160TT SDRAM : 64Mbyte HY57V561620BT-H RTC 實(shí)時(shí)時(shí)鐘 NAND FLASH --NOR FLASH 啟動選擇開關(guān) 兩個I/O 口連接兩個LED,方便用戶調(diào)試自己的程序 二、底板: LCD 接口,支持各種TFT LCD 觸摸屏接口:可接四線電阻式觸摸屏 USB HOST USB DEVICE SD/MMC 接口 3個UART 提供標(biāo)準(zhǔn)的232電平 標(biāo)準(zhǔn)ARM 20芯 JTAG接口 ADC 模數(shù)轉(zhuǎn)換接口 SPI接口 IIS :采用UDA1341TS IIS接口(立體聲輸出,MIC輸入) 外部中斷接口(方便用戶二次開發(fā)) 100M 網(wǎng)卡 外部總線接口,3片74LVTH162245緩沖,1片CPLD EMP7032AE IDE/ATA硬盤接口 以上很多接口都可以復(fù)用為通用I/O,方便用戶外接自己的設(shè)備。 三、軟件操作系統(tǒng)介紹: ● 嵌入式Linux 操作系統(tǒng) 內(nèi)核:MIZI Linux 2.6; 文件系統(tǒng): CRAMFS和專門為NAND FLASH 定制的YAFFS文件系統(tǒng); GUI: 為用戶定制QT/Embedded圖形庫,預(yù)裝PDA應(yīng)用系統(tǒng)。 ● WinCE 操作系統(tǒng) WinCe.NET 4.2 版本以及開發(fā)環(huán)境。熟悉Windows開發(fā)的程序員可以快速的進(jìn)行嵌入式系統(tǒng)應(yīng)用開發(fā)。 ● Vxworks 實(shí)時(shí)操作系統(tǒng) ● Nucleus 實(shí)時(shí)操作系統(tǒng) ● uC/OS-II實(shí)時(shí)操作系統(tǒng) ● ecos實(shí)時(shí)操作系統(tǒng)。 完全開源的一種操作系統(tǒng),實(shí)際應(yīng)用穩(wěn)定、可*。 用戶根據(jù)項(xiàng)目的需求,可以方便的對硬件、軟件系統(tǒng)進(jìn)行定制或二次開發(fā),這樣就大大縮短了開發(fā)時(shí)間、加速開發(fā)進(jìn)程。  | 
  |
| 5樓: | >>參與討論 | 
| 作者: wishhealth 于 2005/6/19 11:16:00 發(fā)布:
         你好,可以請教一個中斷的問題嗎? VICVectAddr0 = (int)IRQ_Eint0; // 設(shè)置EINT0向量地址 VICVectAddr1 = (int)IRQ_Eint1; 請教,IRQ_Eint0是在哪個文件里定義的? 謝謝!  | 
  |
| 6樓: | >>參與討論 | 
| 作者: mcuatmel 于 2005/6/19 12:23:00 發(fā)布:
         頂一下!  | 
  |
| 7樓: | >>參與討論 | 
| 作者: zhx1997 于 2005/7/5 9:57:00 發(fā)布:
         請教一個問題 文章寫得很有幫助,我在看s3c440b的初始化代碼,好像和這個不太一樣,沒有 exceptionhandlertable這一塊我不懂,請指教  | 
  |
| 8樓: | >>參與討論 | 
| 作者: willyar_cn 于 2005/7/5 18:37:00 發(fā)布:
         支持啊 文章寫得不錯,至少對我很有幫助,在此謝謝啦!  | 
  |
| 9樓: | >>參與討論 | 
| 作者: erosss 于 2005/8/11 12:57:00 發(fā)布:
         ding ding 頂頂  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |