arm swi 软中断 一例
原文在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
- .equ INTCON, 0x01e00000
- .equ INTMSK, 0x01e0000c
- .equ LOCKTIME, 0x01d8000c
- .equ PLLCON, 0x01d80000
- .equ CLKCON, 0x01d80004
- .equ WTCON, 0x01d30000
- .equ I_ISPR, 0x01e00020
- .equ I_ISPC, 0x01e00024
- .equ TCFG0, 0x01d50000
- .equ TCFG1, 0x01d50004
- .equ TCON, 0x01d50008
- .equ TCNTB5, 0X01d50048
- .equ UTXH0, 0x01d00020
- .equ UFCON0, 0x01d00008
- .equ ULCON0, 0x01d00000
- .equ UCON0, 0x01d00004
- .equ UBRDIV0, 0x01d00028
- .globl _start
- _start:
- b reset
- b .
- b HandlerSWI
- b .
- b .
- b .
- b .
- b .
- reset:
- mov r0,#0x80 | 0x40 | 0x13 @ svc, disable irq,fiq
- msr cpsr_c,r0
- ldr sp, =0x0c700000
- ldr r0,=WTCON @ disable watch dog
- ldr r1, =0x0
- str r1, [r0]
- ldr r0, =INTCON @ non-vector mode, disable irq, disable fiq
- ldr r1, =0x7
- str r1, [r0]
- ldr r0, =LOCKTIME
- ldrb r1, =
- strb r1, [r0]
- ldr r0, =PLLCON
- ldr r1, =0x34031
- str r1,[r0]
- ldr r0, =CLKCON
- ldr r1, =0x7ff8
- str r1, [r0]
- @ UART
- ldr r0,=UFCON0
- mov r1,#0x0
- str r1,[r0]
- ldr r0,=ULCON0
- mov r1,#0x03
- str r1,[r0]
- ldr r0,=UCON0
- mov r1,#0x05
- str r1,[r0]
- ldr r0,=UBRDIV0
- mov r1,#
- str r1,[r0]
- ldr r0,=UTXH0 @ print 'C'
- mov r1,#'C'
- str r1,[r0]
- @ sp_svc
- ldr sp,=0x0c700000
- ldr r0, =INTMSK
- ldr r1, =0x03ffffff @ disable all irq.
- str r1, [r0]
- @ move to user mode
- mov r0, #0x80 | 0x40 | 0x10 @ svc, disable irq,fiq
- msr cpsr_c,r0
- mov r0, #'A'
- mov r1, #0x1
- swi # @ add('A',), print 'B'
- ldr r1,=UTXH0 @ print 'A'
- str r0,[r1]
- mov r0, #'H' @ subtract
- mov r1, #0x1 @
- swi # @ sub('H',), print 'G'
- ldr r1,=UTXH0 @ print 'H'
- str r0,[r1]
- ldr r1,=UTXH0 @ print 'S' -- STOP
- mov r0,#'S'
- str r0,[r1]
- stop: b stop @ while();
- HandlerSWI:
- stmfd sp!,{r0-r12,lr}
- ldr r4,[lr,#-] @ lr is "swi #x" address, get swi instruction code
- bic r4,r4,#0xff000000 @ get #x
- cmp r4,# @ -- add(a,b)
- bne next
- bl add @ c function use r0,r1 as parameter, and return result with r0
- ldr r1,=UTXH0 @ print 'B'
- str r0,[r1]
- next:
- cmp r4,# @ -- sub(a,b)
- bne swi_return
- bl sub
- ldr r1,=UTXH0 @ print 'G'
- str r0,[r1]
- swi_return:
- ldmfd sp!, {r0-r12,pc}^
c_fun.c
- int add(int a,int b){
- return a + b;
- }
- int sub(int a,int b){
- return a - b;
- }
swi.lds
- OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
- OUTPUT_ARCH(arm)
- ENTRY(_start)
- SECTIONS
- {
- . = 0x00000000;
- .text :
- {
- swi.o (.text)
- }
- . = ALIGN();
- .data :
- {
- *(.data)
- }
- }
Makefile
- all: swi
- swi: swi.o c_fun.o
- arm-elf-ld -T swi.lds -o swi swi.o c_fun.o
- arm-elf-objcopy -O binary -S swi swi.bin
- swi.o: swi.s
- arm-elf-as --gstabs -o swi.o swi.s
- c_fun.o: c_fun.c
- arm-elf-gcc -gstabs -c c_fun.c
- .PHONY: clean
- clean:
- rm -f swi.o c_fun.o swi swi.bin
skyeye.conf
- #skyeye config file for S3C44B0X
- cpu: arm7tdmi
- mach: s3c44b0x
- # physical memory
- mem_bank: map=M, type=RW, addr=0x00000000, size=0x00200000, file=swi.bin
- mem_bank: map=M, type=RW, addr=0x0c000000, size=0x00800000
- # peripherals I/O mapping area
- mem_bank: map=I, type=RW, addr=0x01c00000, size=0x00400000
- # uart
- uart: mod=stdio
arm swi 软中断 一例的更多相关文章
- ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK
最近写一个程序,需要在用户模式下关中断,但ARM 7的体系结构决定了中断必须在特权模式下才可以更改,所以想到使用ARM的软中断来实现关中断和开中断. 使用软中断,首先要有硬件指令的支持.ARM有条指令 ...
- ARM 异常处理过程,指令[ swi ]
1. 发生异常: 程序正常执行,突然被一个不正常的事件打断正在执行的程序,执行相应的异常事件对应的程序 2. 5 种异常模式对应着 7 种异常源: 异常工作模式 异常源 FIR ...
- Arm Linux系统调用流程详细解析
Linux系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口. 系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的 ...
- ARM Linux系统调用的原理
转载自:http://blog.csdn.net/hongjiujing/article/details/6831192 ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交 ...
- 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- ARM指令集详解--汇编
1. 汇编 1.1. 通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...
- ARM体系结构
工作模式_ufisaus USR(User) :正常程序的执行状态 FIQ(Fast interrupt) :用于高速数据传输和通道处理 IRQ(Interrupt) :通常的中断处理 SVC(Sup ...
- ARM指令集(下)
A.2.5 ARM 协处理器指令 ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现.表A-7给出全部的ARM协处理器指令. 表A-7 ARM 协处理器指令 CDP ...
- arm Linux 系统调用过程
系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作.用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等.但是因为用户程序运行在用户空间 ...
随机推荐
- JNI参考的资料
1.Android JNI和NDK学习(09)--JNI实例二 传递类对象 http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593 ...
- uva 1378 - A Funny Stone Game(组合游戏)
题目链接:uva 1378 - A Funny Stone Game 题目大意:两个人玩游戏,对于一个序列,轮流操作.每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,对应 ...
- Selenium_WebDriver登录模拟鼠标移动切换窗体等操作练习(cssSelector初练手)_Java
cssSelector 据说cssSelector比xpath快. 所以,有固定ID属性的页面元素用By.id或者By.cssSelector("#id属性值")来找,有class ...
- 11g使用非duplicate方式创建物理standby要注意的问题总结
在上篇博文中,使用了duplicate方式来创建物理standby http://blog.csdn.net/aaron8219/article/details/38434579 今天来说说在11g中 ...
- Proactor 学习1
Proactor An Object Behavioral Pattern for Demultiplexingand Dispatching Handlers for Asynchronous ...
- Oracle ROWID具体解释
1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包括下面信息: 对象的数据对象编号 该行所在的数据文件里的数据块 该行中数据块 ...
- SDL2源码分析2:窗体(SDL_Window)
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- Spring基础知识之依赖注入
Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(templat ...
- 二、spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍
包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc ...
- 最受Java开发者青睐的Java应用服务器 —— Tomcat
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.今天,就一起来了解下 Tomcat. Java 应用服务器 Tomc ...