原文在CU,挪过来了。

1. 目标

本文单纯验证swi指令相关功能

2. 环境

vmware + redhat 9 + arm-elf-gcc 2.95 + skyeye-1.2.6_rc1(模拟s3c44b0x)

3. 功能详述

1). 调用swi前,关IRQ,FIQ,INTMSK,改变CPU模式为用户模式0x10000

2). 指令的功能号由swi指令码的低24位传输,通过
           ldr r4,[lr,#-4]
           bic r4,r4,#0xff000000
          得到它的功能号,这样就可以根据功能号来进行相关功能的调用,
          本例只使用了两个功能号:

swi #1   1 表示两个数的加法
           swi #2   2 表示两个数的减法
           加法和减法的函数在.c文件中定义

3). 在swi的处理程序中,对于c函数int add(int a,int b)的参数传递是通过
           r0,r1进行的, add(),sub()的结果通过r0返回给swi的处理程序
                           
    
4)
. swi的处理流程:  swi #x --> 0x00000008 --> HandlerSWI --> C函数, 仅此而已

4. 运行:

#  skyeye 
    调试

# skyeye -d

不用再加文件名,文件写在skyeye.conf里了, 当然还得用arm-elf-gdb.

5. 文件清单(5个文件)

swi.s

  1. .equ INTCON, 0x01e00000
  2. .equ INTMSK, 0x01e0000c
  3. .equ LOCKTIME, 0x01d8000c
  4. .equ PLLCON, 0x01d80000
  5. .equ CLKCON, 0x01d80004
  6. .equ WTCON, 0x01d30000
  7. .equ I_ISPR, 0x01e00020
  8. .equ I_ISPC, 0x01e00024
  9. .equ TCFG0, 0x01d50000
  10. .equ TCFG1, 0x01d50004
  11. .equ TCON, 0x01d50008
  12. .equ TCNTB5, 0X01d50048
  13. .equ UTXH0, 0x01d00020
  14. .equ UFCON0, 0x01d00008
  15. .equ ULCON0, 0x01d00000
  16. .equ UCON0, 0x01d00004
  17. .equ UBRDIV0, 0x01d00028
  18.  
  19. .globl _start
  20. _start:
  21. b reset
  22. b .
  23. b HandlerSWI
  24. b .
  25. b .
  26. b .
  27. b .
  28. b .
  29.  
  30. reset:
  31. mov r0,#0x80 | 0x40 | 0x13 @ svc, disable irq,fiq
  32. msr cpsr_c,r0
  33.  
  34. ldr sp, =0x0c700000
  35.  
  36. ldr r0,=WTCON @ disable watch dog
  37. ldr r1, =0x0
  38. str r1, [r0]
  39.  
  40. ldr r0, =INTCON @ non-vector mode, disable irq, disable fiq
  41. ldr r1, =0x7
  42. str r1, [r0]
  43.  
  44. ldr r0, =LOCKTIME
  45. ldrb r1, =
  46. strb r1, [r0]
  47.  
  48. ldr r0, =PLLCON
  49. ldr r1, =0x34031
  50. str r1,[r0]
  51.  
  52. ldr r0, =CLKCON
  53. ldr r1, =0x7ff8
  54. str r1, [r0]
  55.  
  56. @ UART
  57. ldr r0,=UFCON0
  58. mov r1,#0x0
  59. str r1,[r0]
  60.  
  61. ldr r0,=ULCON0
  62. mov r1,#0x03
  63. str r1,[r0]
  64.  
  65. ldr r0,=UCON0
  66. mov r1,#0x05
  67. str r1,[r0]
  68.  
  69. ldr r0,=UBRDIV0
  70. mov r1,#
  71. str r1,[r0]
  72.  
  73. ldr r0,=UTXH0 @ print 'C'
  74. mov r1,#'C'
  75. str r1,[r0]
  76.  
  77. @ sp_svc
  78. ldr sp,=0x0c700000
  79.  
  80. ldr r0, =INTMSK
  81. ldr r1, =0x03ffffff @ disable all irq.
  82. str r1, [r0]
  83.  
  84. @ move to user mode
  85.  
  86. mov r0, #0x80 | 0x40 | 0x10 @ svc, disable irq,fiq
  87. msr cpsr_c,r0
  88.  
  89. mov r0, #'A'
  90. mov r1, #0x1
  91. swi # @ add('A',), print 'B'
  92.  
  93. ldr r1,=UTXH0 @ print 'A'
  94. str r0,[r1]
  95.  
  96. mov r0, #'H' @ subtract
  97. mov r1, #0x1 @
  98. swi # @ sub('H',), print 'G'
  99.  
  100. ldr r1,=UTXH0 @ print 'H'
  101. str r0,[r1]
  102.  
  103. ldr r1,=UTXH0 @ print 'S' -- STOP
  104. mov r0,#'S'
  105. str r0,[r1]
  106.  
  107. stop: b stop @ while();
  108.  
  109. HandlerSWI:
  110. stmfd sp!,{r0-r12,lr}
  111.  
  112. ldr r4,[lr,#-] @ lr is "swi #x" address, get swi instruction code
  113. bic r4,r4,#0xff000000 @ get #x
  114.  
  115. cmp r4,# @ -- add(a,b)
  116. bne next
  117.  
  118. bl add @ c function use r0,r1 as parameter, and return result with r0
  119. ldr r1,=UTXH0 @ print 'B'
  120. str r0,[r1]
  121.  
  122. next:
  123. cmp r4,# @ -- sub(a,b)
  124. bne swi_return
  125.  
  126. bl sub
  127. ldr r1,=UTXH0 @ print 'G'
  128. str r0,[r1]
  129.  
  130. swi_return:
  131. ldmfd sp!, {r0-r12,pc}^

c_fun.c

  1. int add(int a,int b){
  2. return a + b;
  3. }
  4.  
  5. int sub(int a,int b){
  6. return a - b;
  7. }

swi.lds

  1. OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
  2. OUTPUT_ARCH(arm)
  3. ENTRY(_start)
  4. SECTIONS
  5. {
  6. . = 0x00000000;
  7.  
  8. .text :
  9. {
  10. swi.o (.text)
  11. }
  12.  
  13. . = ALIGN();
  14. .data :
  15. {
  16. *(.data)
  17. }
  18.  
  19. }

Makefile

  1. all: swi
  2.  
  3. swi: swi.o c_fun.o
  4. arm-elf-ld -T swi.lds -o swi swi.o c_fun.o
  5. arm-elf-objcopy -O binary -S swi swi.bin
  6.  
  7. swi.o: swi.s
  8. arm-elf-as --gstabs -o swi.o swi.s
  9.  
  10. c_fun.o: c_fun.c
  11. arm-elf-gcc -gstabs -c c_fun.c
  12.  
  13. .PHONY: clean
  14. clean:
  15. rm -f swi.o c_fun.o swi swi.bin

skyeye.conf

  1. #skyeye config file for S3C44B0X
  2. cpu: arm7tdmi
  3. mach: s3c44b0x
  4.  
  5. # physical memory
  6. mem_bank: map=M, type=RW, addr=0x00000000, size=0x00200000, file=swi.bin
  7. mem_bank: map=M, type=RW, addr=0x0c000000, size=0x00800000
  8.  
  9. # peripherals I/O mapping area
  10. mem_bank: map=I, type=RW, addr=0x01c00000, size=0x00400000
  11.  
  12. # uart
  13. uart: mod=stdio

arm swi 软中断 一例的更多相关文章

  1. ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK

    最近写一个程序,需要在用户模式下关中断,但ARM 7的体系结构决定了中断必须在特权模式下才可以更改,所以想到使用ARM的软中断来实现关中断和开中断. 使用软中断,首先要有硬件指令的支持.ARM有条指令 ...

  2. ARM 异常处理过程,指令[ swi ]

    1.  发生异常: 程序正常执行,突然被一个不正常的事件打断正在执行的程序,执行相应的异常事件对应的程序 2.  5 种异常模式对应着 7 种异常源:   异常工作模式      异常源 FIR   ...

  3. Arm Linux系统调用流程详细解析

    Linux系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口. 系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的 ...

  4. ARM Linux系统调用的原理

    转载自:http://blog.csdn.net/hongjiujing/article/details/6831192 ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交 ...

  5. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  6. ARM指令集详解--汇编

    1.       汇编 1.1.    通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...

  7. ARM体系结构

    工作模式_ufisaus USR(User) :正常程序的执行状态 FIQ(Fast interrupt) :用于高速数据传输和通道处理 IRQ(Interrupt) :通常的中断处理 SVC(Sup ...

  8. ARM指令集(下)

    A.2.5   ARM 协处理器指令         ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现.表A-7给出全部的ARM协处理器指令. 表A-7  ARM 协处理器指令 CDP ...

  9. arm Linux 系统调用过程

    系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作.用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等.但是因为用户程序运行在用户空间 ...

随机推荐

  1. JNI参考的资料

    1.Android JNI和NDK学习(09)--JNI实例二 传递类对象 http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593 ...

  2. uva 1378 - A Funny Stone Game(组合游戏)

    题目链接:uva 1378 - A Funny Stone Game 题目大意:两个人玩游戏,对于一个序列,轮流操作.每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,对应 ...

  3. Selenium_WebDriver登录模拟鼠标移动切换窗体等操作练习(cssSelector初练手)_Java

    cssSelector 据说cssSelector比xpath快. 所以,有固定ID属性的页面元素用By.id或者By.cssSelector("#id属性值")来找,有class ...

  4. 11g使用非duplicate方式创建物理standby要注意的问题总结

    在上篇博文中,使用了duplicate方式来创建物理standby http://blog.csdn.net/aaron8219/article/details/38434579 今天来说说在11g中 ...

  5. Proactor 学习1

    Proactor    An Object Behavioral Pattern for Demultiplexingand Dispatching Handlers for Asynchronous ...

  6. Oracle ROWID具体解释

    1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包括下面信息: 对象的数据对象编号 该行所在的数据文件里的数据块 该行中数据块 ...

  7. SDL2源码分析2:窗体(SDL_Window)

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  8. Spring基础知识之依赖注入

    Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(templat ...

  9. 二、spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍

    包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc ...

  10. 最受Java开发者青睐的Java应用服务器 —— Tomcat

    Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.今天,就一起来了解下 Tomcat. Java 应用服务器 Tomc ...