搜索
bottom↓
回复: 1

ARM11裸奔,软中断问题

[复制链接]

出0入0汤圆

发表于 2013-7-3 17:18:40 | 显示全部楼层 |阅读模式
求大神指点,这个问题都困扰了将近一个月了
想裸奔,对系统感兴趣,打算研究一下swi,可是S3C6410调试看到,每次执行swi指令之后就会进入数据访问终止异常中,很是郁闷,简单三个文件,start.s,main.c,求大神指点个人实在没办法了

start.s

Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F

UND_Stack_Size  EQU     0x00000400
SVC_Stack_Size  EQU     0x00001000
ABT_Stack_Size  EQU     0x00000400
FIQ_Stack_Size  EQU     0x00000400
IRQ_Stack_Size  EQU     0x00001000
USR_Stack_Size  EQU     0x00001000
Heap_Size       EQU     0x00010000

I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled

Stack_Top       EQU     0x52000000       
       
       
        IMPORT Main
;        IMPORT swi_service_func
;        IMPORT __use_no_semihosting_swi
        EXPORT SWI_Handler     
        IMPORT C_SWI_Handler
        PRESERVE8
        AREA |startup|,CODE,READONLY
        ENTRY
       
Vector_Table

    LDR     PC, Reset_Addr         
    LDR     PC, Undefined_Addr
    LDR     PC, SWI_Addr
    LDR     PC, Prefetch_Addr
    LDR     PC, Abort_Addr
    NOP                             ; Reserved vector must be remained
    LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

Vector_Addr_Table

Reset_Addr      DCD     Reset_Handler      
Undefined_Addr  DCD     Undefined_Handler
SWI_Addr        DCD     SWI_Handler
Prefetch_Addr   DCD     Prefetch_Handler
Abort_Addr      DCD     Abort_Handler
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

FUN_SWI         DCD     C_SWI_Handler


; 复位地址入口
Reset_Handler
;        mrc        p15,0,r0,c1,c0,0                ;使能VIC PORT功能
;    orr r0,r0,#(1<<24)
;    mcr p15,0,r0,c1,c0,0
   
    LDR     R0, =Stack_Top

    MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
    MOV     SP, R0
    SUB     R0, R0, #UND_Stack_Size

    MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
    MOV     SP, R0
    SUB     R0, R0, #ABT_Stack_Size


    MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
    MOV     SP, R0
    SUB     R0, R0, #FIQ_Stack_Size


    MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
    MOV     SP, R0
    SUB     R0, R0, #IRQ_Stack_Size


    MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
    MOV     SP, R0
        SUB     SL, SP, #SVC_Stack_Size


    MSR     CPSR_c, #Mode_USR
    MOV     SP, R0
    SUB     SL, SP, #USR_Stack_Size

    ;使能IQR中断            
    ;MRS        R0,CPSR
  ;        BIC        R0,R0,#0x80
    ;MSR        CPSR_c,R0
   
    MSR     CPSR_c, #Mode_USR   ;intel user mode
        
        STMFD  sp!,{r0-r3, r12, lr} ;      
        bl       Main                    ;uboot将CPU控制权交给main
        LDMFD  sp!,{r0-r3, r12, pc}^                    ;main退出后,uboot重新获取CPU控制权
   
Undefined_Handler
        B Undefined_Handler
       
T_bit EQU 0x20  

SWI_Handler         
        STMFD  sp!,{r0-r3, r12, lr} ; Store registers     
        MOV    r1, sp                ; Set pointer to parameters     
        MRS    r0, spsr              ; Get spsr         
        STMFD  sp!,{r0}              ; Store spsr onto stack     
        TST    r0, #T_bit            ; Occurred in Thumb state?     
        LDRNEH r0, [lr,#-2]          ; Yes: Load halfword and...     
        BICNE  r0, r0, #0xFF00        ; ...extract comment field     
        LDREQ  r0, [lr,#-4]          ; No: Load word and...     
        BICEQ  r0, r0, #0xFF000000    ; ...extract comment field          ; r0 now contains SWI number         ; r1 now contains pointer to stacked registers      

        LDR    PC, FUN_SWI          ; Call main part of handler         

        LDMFD  sp!,{r0}              ; Get spsr from stack        
        MSR    spsr_cf, r0            ; Restore spsr         
        LDMFD  sp!,{r0-r3, r12, pc}^ ; Restore registers and return

Prefetch_Handler
        B Prefetch_Handler

Abort_Handler
        B Abort_Handler

IRQ_Handler
        B IRQ_Handler
       
FIQ_Handler
        B FIQ_Handler   
   
    END       
   
main.c

//#include <uboot.h>
#include <printf.h>

#define rGPMCON (*(volatile unsigned *)(0x7F008820))
#define rGPMDAT (*(volatile unsigned *)(0x7F008824))
#define rGPMPUD (*(volatile unsigned *)(0x7F008828))


struct four_results
{     
        int a;     
        int b;     
        int c;     
        int d;
};

__swi(0) int multiply_two(int, int);
__swi(1) int add_two(int, int);
__swi(2) int add_multiply_two(int, int, int, int);
__swi(3) __value_in_regs struct four_results     many_operations(int, int, int, int);
   

void msDelay(int time)
{
        volatile unsigned int i,j;
        for(i = 0; i < 200000; i++)
                for(j=0; j<time; j++);
}
void GPIO_Init(void)
{
        rGPMCON = 0x11111;
        rGPMPUD = 0x00;
        rGPMDAT = 0X1F;
}
void LedTest(void)
{
        volatile unsigned int i;
        unsigned char count=0;
        while (1)
        {
                for(i=0; i<4; i++)
                {
                        rGPMDAT = ~(1<<i);
                        msDelay(10);
                }
                count++;
                if(count>3)
                return;
        }
}
unsigned Install_Handler( unsigned routine, unsigned *vector )
{     
        unsigned vec, old_vec;      
        vec = (routine - (unsigned)vector - 8) >> 2;     
        if (vec & 0xff000000)
        {         
                printf("Handler greater than 32MBytes from vector");
        }     
        vec = 0xea000000 | vec;    /**//* OR in 'branch always' code */      
        old_vec = *vector;     
        *vector = vec;     
        return (old_vec);
}


/***********************/
unsigned *swi_vec = (unsigned *)0x08;
extern void SWI_Handler(void);  

void C_SWI_Handler( int swi_num, int *regs )
{     
        switch( swi_num )     
        {     
                case    0:         
                regs[0] = regs[0] * regs[1];       break;     
                case    1:         
                regs[0] = regs[0] + regs[1];       break;     
                case    2:         
                regs[0] = (regs[0] * regs[1]) + (regs[2] * regs[3]);       break;     
                case    3:     
                {         
                        int w, x, y, z;  
                        w = regs[0];         
                        x = regs[1];         
                        y = regs[2];         
                        z = regs[3];         
                        regs[0] = w + x + y + z;         
                        regs[1] = w - x - y - z;         
                        regs[2] = w * x * y * z;         
                        regs[3] =(w + x) * (y - z);     
                }     
                break;      
        }
}
void Main(void)
{
/*        int result1, result2;     
        struct four_results res_3;
          
        Install_Handler( (unsigned) SWI_Handler, swi_vec );      
        printf("result1 = multiply_two( 2, 4 ) = %d ", result1 = multiply_two( 2, 4 ));     
        printf("result2 = multiply_two( 3, 6 ) = %d ", result2 = multiply_two( 3, 6 ));     
        printf("add_two( result1, result2 ) = %d ", add_two( result1, result2 ));     
        printf("add_multiply_two( 2, 4, 3, 6 ) = %d ", add_multiply_two( 2, 4, 3, 6 ));     
        res_3 = many_operations( 12, 4, 3, 1 );      
        printf("res_3.a = %d ", res_3.a );     
        printf("res_3.b = %d ", res_3.b );     
        printf("res_3.c = %d ", res_3.c );     
        printf("res_3.d = %d ", res_3.d );
        GPIO_Init();
        printf("hello world\n");
        LedTest();*/
        __asm("swi 0");       
}

就是这几行代码,快郁闷死了

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-7-3 17:19:31 | 显示全部楼层
一执行swi指令就会进入 Abort_Handler这个异常中
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表