|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
告別在21ic只問(wèn)問(wèn)題的日子,原創(chuàng)swi軟件中斷理解分析 |
| 作者:paulsimons 欄目:ARM技術(shù) |
Swi軟件中斷理解 什么是軟件中斷不說(shuō)了,自己看書去,直接切入主題 以sh.c中的G_action()為例 其調(diào)用swi_run(0x200,address),通過(guò)platform.h中的 __swi(SemiSWI) void swi_run(int op, int addr)調(diào)用,傳遞的參數(shù)0x200和address在軟件中斷服務(wù)程序中會(huì)使用,R0會(huì)被傳入0x200,R1傳入address,SemiSWI為軟件中斷號(hào). 在PC得到swi的信號(hào)的時(shí)候,pc立即跳轉(zhuǎn)到0x08地址,通常這個(gè)地址范圍在cpu啟動(dòng)的時(shí)候會(huì)擺放異常中斷處理程序,對(duì)應(yīng)軟件中斷應(yīng)該是一條跳轉(zhuǎn)指令, Vectors.s文件 …… LDR PC,Swi_Addr …… Swi_Addr DCD TrapSwi ;在Swi_Addr中擺放了TrapSwi的地址 TrapSwi是Switrap.s文件中的一個(gè)段,用來(lái)解析不同的軟件中斷 INCLUDE except_h.s EXPORT TrapSWI IMPORT uputchar IMPORT print_sys_buf IMPORT fil_sys_buf IMPORT clock, WEAK IMPORT FileCount IMPORT heap_info IMPORT semi_stack IMPORT command_buffer THUMB_AWARE EQU 1 AIC_IMR EQU 0xFFF82114 AIC_MECR EQU 0xFFF82120 AIC_MDCR EQU 0xFFF82124 AREA Traps, CODE, READONLY ; SWI handler TrapSWI STMFD sp!, {r0-r1} ;保護(hù)寄存器R0,R1防止被修改 LDR r0, [lr, #-4] ;得到swi指令的數(shù)據(jù) BIC r0, r0, #0xff000000 ;取出低24位 LDR r1, =SWI_Angel CMP r0, r1 比較軟件中斷號(hào) LDMFD sp!, {r0-r1} ;彈出R0,R1 BNE ExitSWI ;如果不是正確的軟件中斷號(hào)則跳入SWI結(jié)束程序 ;根據(jù)R0也就是swi_run的第一個(gè)參數(shù)判斷是哪種中斷程序 CMP r0, #angel_SWIreason_EnterSVC BEQ SWIEnterOS CMP r0, #SYS_FILE_OPEN BEQ Sys_FileOpenSWI CMP r0, #SYS_READ_SWI BEQ Sys_ReadSWI CMP r0, #SYS_WRITE_SWI BEQ Sys_WriteSWI CMP r0, #angel_SWI_SYS_WRITEC BEQ ttywrch_SWI CMP r0, #SYS_CLOCK BEQ readtime_SWI CMP r0, #0x200 BEQ sh_run_SWI CMP r0, #0x18 BEQ sh_return_SWI CMP r0, #0x15 BEQ sh_get_command_SWI CMP r0, #angel_SWI_SYS_HEAPINFO BNE ExitSWI STMFD sp!, {r0-r4} LDR r0, [r1] LDR r4, =heap_info LDR r3, [r4], #4 ; heap_base LDR r2, [r4], #4 ; heap_limit STR r3, [r0], #4 ; heap_limit STR r2, [r0], #4 ; heap_base LDR r2, [r4], #4 ; stack_base LDR r3, [r4], #4 ; stack_limit STR r2, [r0], #4 ; stack_base STR r3, [r0] LDMFD sp!, {r0-r4} ExitSWI MOV r0, #0 MOVS pc, lr SWIEnterOS STMFD sp!, {r0} MRS r0, SPSR TST r0, #PSR_T_bit ORRNE r0, r0, #0x13 MSRNE SPSR_cxsf, r0 LDMFD sp!, {r0} MOVNES pc, lr MOV pc, lr Sys_FileOpenSWI STMFD sp!, {r4, lr} LDR r0, =FileCount LDR r4, [r0] STR r4, [r0] CMP r4, #0x03 MOVGT r0, #0xffffffff MOVLT r0, #0x00000000 LDMFD sp!, {r4, lr} MOVS pc, lr ttywrch_SWI STMFD sp!, {r0, lr} LDR r0, [r1] BL uputchar LDMFD sp!, {r0, lr} MOVS pc, lr Sys_WriteSWI STMFD sp!, {r1-r3, lr} ;MOV r0, r2 LDR   |
| 2樓: | >>參與討論 |
| 作者: hotpower 于 2006/9/29 23:32:00 發(fā)布:
好~~~ |
|
| 3樓: | >>參與討論 |
| 作者: paulsimons 于 2006/10/18 10:54:00 發(fā)布:
自己支持一下 自己支持一下 |
|
| 4樓: | >>參與討論 |
| 作者: weixiao11 于 2006/10/18 14:13:00 發(fā)布:
只對(duì)概念知道皮毛,但是還要頂 支持有共享精神的網(wǎng)友 |
|
| 5樓: | >>參與討論 |
| 作者: BlankHeart 于 2006/10/18 15:24:00 發(fā)布:
我一直只知道是軟件中斷,也沒(méi)有去搞清楚是什么樣. 只是套著用,也好好的.嘿嘿. 現(xiàn)在還是不明白. |
|
| 6樓: | >>參與討論 |
| 作者: twentyone 于 2006/10/18 16:12:00 發(fā)布:
re THX A LOT |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |