TQ2440裸机中断(软中断swi)

发布者:skyhcg最新更新时间:2021-10-21 来源: eefocus关键字:TQ2440  裸机中断  软中断swi 手机看文章 扫描二维码
随时随地手机看文章

1. 引出:

一般情况下,比如调用open系统调用,大家会说此时系统陷入了内核态,继而调用内核的sys_open来进行实际的open处理,但是为什么用户态调用了open就会陷入内核态呢?所谓的用户态及内核态究竟是什么呢?


2. S3C2440软中断

ARM9处理器有7种工作模式,软中断,通俗的说就是为了从其他工作模式切换到管理模式(在管理模式,可以使用的资源最多),处理器提供软中断,主要是为了支持操作系统的系统调用功能。


ARM体系  CPU的7种工作模式:

· 用户模式(usr): ARM处理器正常的程序执行状态(对应于LINUX的用户态)

· 快速中断模式(fiq): 用于高速数据传输或通道处理

· 中断模式(irq):用于通用的中断处理

· 管理模式(svc):操作系统使用的保护模式(对应于内核态)

· 数据访问终止模式(abt): 当数据或指令预取时进入该模式,可用于虚拟存储及存储保护

· 系统模式(sys) :运行具有特权操作系统任务

· 未定义指令中止模式(und): 当为定义的指令执行时进入该模式,可用于支持硬件协处理的软件仿真


根据上面列表,可以知道Linux下用户态触发软中断进而进入内核态,对应的ARM工作模式就是从USR模式切换为SVC模式.


Q1.硬件中断和软中断有什么区别?

硬件中断是异步的,由外界触发,无法预知的,而软中断是调用特定函数而触发,是开发人员可以预测的.


回到前面的问题,为何调用open之后,就会陷入内核态,而进入SVC模式呢?其实这就像中断一样,当调用特定的函数之后,就像触发了中断条件,继而转到中断向量表中去执行这个中断,其实软中断大概也就是这样。而ADS中ARM声名一个软中断使用__swi关键字声名.具体看下面代码,和结合Reference[1]应该有个整体的了解.


3. 代码分析

下载地址:


/* forsakening @hdu @2013-6-1儿童节快乐 */

/******************************************************/

/*中断向量表部分*/

/******************************************************/

AREA    Init,CODE,READONLY

ENTRY

ResetEntry

 

b ResetHandler

b HandlerUndef ;handler for Undefined mode

b HandlerSWI ;handler for SWI interrupt /* 当触发软中断时,ARM会自动将PC指向这里 */

b HandlerPabort ;handler for PAbort

b HandlerDabort ;handler for DAbort

b . ;reserved

b HandlerIRQ ;handler for IRQ interrupt

b HandlerFIQ ;handler for FIQ interrupt

 

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

;HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

 

/* 

 * 软中断服务程序:

 *       a)保存中断前的寄存器状态 

 *       b)跳转到C语言处理软中断函数

 */

HandlerSWI

stmfd sp!,{r0-r3,r12,lr}

ldr r0,[lr,#-4]

bic r0,r0,#0xff000000

bl C_Swi_Handler

ldmfd sp!,{r0-r3,r12,pc}^

/******************************************************/

/* C语言部分 */

/******************************************************/

#include "2440addr.h"

#include "def.h"

 

#define Led1_On()      {rGPBDAT &= (~(1 << 5));} 

#define Led1_Off()     {rGPBDAT |= (1 << 5);} 

#define Led2_On()      {rGPBDAT &= (~(1 << 6));} 

#define Led2_Off()     {rGPBDAT |= (1 << 6);} 

#define Led3_On()      {rGPBDAT &= (~(1 << 7));} 

#define Led3_Off()     {rGPBDAT |= (1 << 7);} 

#define Led4_On()      {rGPBDAT &= (~(1 << 8));} 

#define Led4_Off()     {rGPBDAT |= (1 << 8);} 

 

extern void C_Swi_Handler(unsigned num) ;

 

/*

 * __swi关键字声明了软中断,当调用led1()这个函数时候,即会触发软中断

 * __swi(0x01)括号中的数字表明了该函数对应的软中断号

 */

__swi(0x01) void led1(void);

__swi(0x02) void led2(void);

__swi(0x03) void led3(void);

__swi(0x04) void led4(void);

 

void Led_Init(void)

{

rGPBCON &= ~((3 << 10) | (3 << 12) | (3 << 14) |(3 << 16));

rGPBCON |= ((1<<10) | (1<<12) | (1<<14) | (1<<16)) ;

rGPBUP  &=  ~((1 << 5) | (1 << 6) | (1 << 7) || (1 << 8) ) ;

rGPBDAT |= (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) ;

}

 

void Delay_1(void)

{

int i;

for (i = 0; i < 100000; i++);

}

 

int Main()

{

Led_Init() ;

while(1)

{

led1() ;

Delay_1();

Led1_Off();

led2() ;

Delay_1();

Led2_Off();

led3() ;

Delay_1();

Led3_Off();

led4() ;

Delay_1();

Led4_Off();

return 0;

}

 

/*

 * 中断向量表中,软中断所跳转的服务函数,num代表了中断号

 */

void C_Swi_Handler(unsigned num)

{

switch(num)

{

case  0x01:

Led1_On() ;  break ;

case  0x02:

Led2_On() ;  break ;

case  0x03:

Led3_On() ;  break ;

case  0x04:

Led4_On() ;  break ;

default

break ;

}

}

 

/******************************************************/

/* Main的反汇编 */

/******************************************************/

Main

        0x00000050:    e92d4010    .@-.    STMFD    r13!,{r4,r14}

        0x00000054:    ebfffffe    ....    BL       Led_Init  ; 0x0

        0x00000058:    e3a04456    VD..    MOV      r4,#0x56000000

        0x0000005c:    ef000001    ....    SWI      0x1              /* 产生软中断,中断号1 */

        0x00000060:    ebfffffe    ....    BL       Delay_1  ; 0x38

        0x00000064:    e5940014    ....    LDR      r0,[r4,#0x14]

        0x00000068:    e3800020     ...    ORR      r0,r0,#0x20

        0x0000006c:    e5840014    ....    STR      r0,[r4,#0x14]

        0x00000070:    ef000002    ....    SWI      0x2              /* 产生软中断,中断号2 */

        0x00000074:    ebfffffe    ....    BL       Delay_1  ; 0x38

        0x00000078:    e5940014    ....    LDR      r0,[r4,#0x14]

        0x0000007c:    e3800040    @...    ORR      r0,r0,#0x40

        0x00000080:    e5840014    ....    STR      r0,[r4,#0x14]

        0x00000084:    ef000003    ....    SWI      0x3              /* 产生软中断,中断号3 */

        0x00000088:    ebfffffe    ....    BL       Delay_1  ; 0x38

        0x0000008c:    e5940014    ....    LDR      r0,[r4,#0x14]

        0x00000090:    e3800080    ....    ORR      r0,r0,#0x80

        0x00000094:    e5840014    ....    STR      r0,[r4,#0x14]

        0x00000098:    ef000004    ....    SWI      0x4              /* 产生软中断,中断号4 */

        0x0000009c:    ebfffffe    ....    BL       Delay_1  ; 0x38

        0x000000a0:    e5940014    ....    LDR      r0,[r4,#0x14]

        0x000000a4:    e3800f40    @...    ORR      r0,r0,#0x100

        0x000000a8:    e5840014    ....    STR      r0,[r4,#0x14]

        0x000000ac:    eaffffea    ....    B        {pc} - 0x50  ; 0x5c

4. Reference

[1]http://blog.csdn.net/forsakening/article/details/8940787 ARM Linux下系统调用

关键字:TQ2440  裸机中断  软中断swi 引用地址:TQ2440裸机中断(软中断swi)

上一篇:s3c2440——swi异常
下一篇:S3C2440裸机------触摸屏_校准与画线编程

推荐阅读最新更新时间:2024-11-11 12:39

AVR单片机入门+使用keil-MDK裸奔TQ2440
两三个月没更新博客了,近两个月在学习AVR单片机,芯片的复杂度提高了不少,光300页的数据手册就看了三遍才有个大概的认识。接下来要做实验来熟悉各个模块啊,就找到了马潮老师的《单片机C语言程序设计实训--基于AVR PROTEUS仿真》这本极好的入门书籍,到现在基础练习就差一个上位机和下位机通信和看门狗实验没有做了,遗憾的是这本书布置的“作业”整体难度不高,有些作业一眼就能想出解决方案的就没有做,我认为还不清楚该怎么做的就一个也不放过。 每次开始学习新类型单片机的时候,都需要做的事是: 1)选择合适的单片机芯片 2)选择合适的开发环境 3)选择合适的烧写工具 4)学写裸奔程序以此熟悉单片机片上的资源 这样才能开始应用级的开发。我
[单片机]
AVR单片机入门+使用keil-MDK裸奔<font color='red'>TQ2440</font>
TQ2440 学习笔记—— 15、基础知识小结【汇编、vi】
一、用到的 ARM 汇编指令 1、跳转指令: B :跳转指令; BL: 带返回的跳转指令; 2、数据处理指令 MOV: 数据传送指令; 格式: MOV{条件}{S} 目的寄存器,源操作数 MOV 指令可以完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S 选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR 中条件标志位的值。 示例: MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序的返回 MOV R1,R0,LSL#3 ;将寄存器R0 的值左移三位后传送到R1
[单片机]
<font color='red'>TQ2440</font> 学习笔记—— 15、基础知识小结【汇编、vi】
arm9(TQ2440)移植小结----移植准备
这里主要是准备一些必备的软件。windows下的有两个:dnw和SecureCRT(超级终端也可以),首先是测试SecureCRT,这个软件是用作串口控制台。设置很简单,按照串口的设置(protocol:serial;波特率:115200,端口根据实际选择;8位数据;1位停止位;无奇偶校验;无硬件流控制)。dnw设置一下波特率(115200)和下载地址(0x30000000)。 将程序烧入开发板有多种方式:jtag,usb和网络。关于少些开发板使用手册有详细说明。 这里说明一下在烧录uboot的时候遇到的问题。uboot作为启动程序烧写有特殊的地方。TQ2440有nand flash和nor flash两块f
[单片机]
TQ2440 学习笔记—— 16、volatile关键字
大多数计算机拥有一系列寄存器,其存取速度比计算机主存更快。好的编译程序能进行一种被称为“冗余装入和存储的删去” (redundant load and store removal)的优化,即编译程序会在程序中寻找并删去这样两类代码:一类是可以删去的从内存装入数据的指令,因为相应的数据已经被存放在寄存器中;另 一种是可以删去的将数据存入内存的指令,因为相应的数据在再次被改变之前可以一直保留在寄存器中。 volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如: static int i=0; int main(void) { ... while (1) {
[单片机]
u-boot-1.1.6移植到TQ2440笔记——准备工作(1)
声明:tq 2440m没有官方的移植文档,本人在网上查看了很多资料都都也很乱,整理较好的是“唐智浩 2009.12”和“By dyf 2010- 9- 5”的《移植u-boot-1.1.6到tq2440》,但是他们的也有些与我的板子不相符的地方,通过参考他们的文档和网上资料,经过两天的努力终于弄好了,以下是本人的笔记。 一、移植说明 1、移植相关源代码:u - boot- 1.1.6.tar.bz2 2、移植开发板tq2440: CUP:S3C2440 SDRAM: NOR FLASH: NAND FLASH: 网卡: 3、文件裁剪: 删除board/下除smdk2410 以外的所
[单片机]
S3C2440裸机------异常与中断__Thumb指令集程序示例
我们以之前的代码重定位程序为例简单看一下thumb指令集。 1.C代码修改为Thumb指令集格式 对于C程序,如果我们想把他们编译成Thumb指令集的话,只需要修改makefile,加上-mthumb选项即可,先看一下之前的makefile。 all: arm-linux-gcc -c -o led.o led.c arm-linux-gcc -c -o uart.o uart.c arm-linux-gcc -c -o init.o init.c arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -o start.o start.S
[单片机]
TQ2440 学习笔记—— 20、NAND Flash 控制器
一、NAND Flash控制器 1、地址空间 SRAM,DM9000 的地址总线接到了S3C2440的地址总线上;而NAND Flash 没有地址总线,与前者相比它的寻址方式是不同的。 故必须分清楚地址。 2、NAND 的编址 3、NAND 的命令 4、使用S3C2440 的NAND Flash 控制器 访问NAND Flash 从硬件上: 1、发出命令 CLE DATA BUS 2、Addr ALE DATA BUS 3、传输数据 S3C2440: 1、命令寄存器 NFCMMD 2、地址寄存器 NFADDR 3、数据寄存器 NFDATA 4、状态寄存器 NFSTAT 二
[单片机]
基于ARM9的媒体播放器设计
1 引言 计算机多媒体技术和网络技术飞速发展使得基于流媒体的多媒体应用也被运用在多种领域,特别是网络可视电话、远程监控、视频点播领域。伴随着计算机多媒体压缩技术的成熟和网络传输技术的发展,开发实时可靠、多功能、数字化、操作简单的基于计算机网络通讯技术和多媒体应用的网络化流媒体播放器已成为计算机、通信、消费电子产品领域(3C 产业-Computer、Communication、Consumer Electronics)技术发展的主要方向之一。 2 系统硬件设计 本文使用TQ2440 开发板作为硬件平台。 S3C2440AL 是控制核心,负责控制所有辅助设备。存储器采用SDRAM 和Flash 两种类型,能满足系统运行和调试的
[单片机]
基于ARM9的媒体播放器设计

推荐帖子

操作系统热启动的问题
本人用的是PPC440的CPU,操作系统起来后,其余的好像都正常,网络,串口都能正常工作,可是热启动(ctrl+x)后,操作系统就死了,这时候没有一点反应,不知道是什么原因,其中romInit.s中一部分内容如下:FUNC_LABEL(_romInitWarm)FUNC_LABEL(romInitWarm)blwarm/*copyrightnoticeappearsatbeginningofROM(inTEXTsegment)*/
lzg2002nian 嵌入式系统
SD卡拔出的消息没有及时收到,等了三四秒?
请教高手,在我的WINCE程序里,SD卡插入时程序可以马上捕获到消息,但是,拔出SD卡时,消息却要三四秒中后程序才能捕获,有哪位高手知道如何缩短消息捕获时间的,指点一下小弟!!SD卡拔出的消息没有及时收到,等了三四秒?不了,帮顶去问写驱动的人
ljh1024 嵌入式系统
图腾柱输出和互补推挽输出异同点
图腾柱输出和互补推挽输出异同点1.图腾柱输出-----Q2和D2的作用?2.图腾柱是NPN+NPN结构,互补推挽是NPN+PNP结构;图腾柱有非线性特征,只能用于PWM输出,而互补推挽有线性特征,除了用于PWM输出外,还可用于模拟信号输出-----为什么会有这种差异3.PWM控制时,图腾柱输入电压可小于驱动电压,而互补推挽必须是输入电压与驱动电压相等-----可以理解成图
QWE4562009 分立器件
MV-700工业高清图象采集卡
MV-700工业高清图象采集卡【特点简介】MV-700是一款高品质图象采集卡。支持两路复合视频输入和一路S-Video输入,其最高分辨率可达到768*576。MV-700采集9bit的高画质高清晰图象、图像采集的实时性能更强;采样频率更高;能直接采集奇偶场复合或的图像,运动图像采集效果好,图像质量得到最大增强;性能更为稳定,它的性能价格比高、兼容性好,是道桥收费、工业检测、生物医学、智能交通、军事公安等各领域中监测及图像处理系统
Microvision 嵌入式系统
急!!VS2005 开发WINCE 5.0程序PictureBox加载图片时异常
如题:我用VS2005开发wince5.0下的应用程序,在程序窗口上加了一个PictureBox控件,通过pictureBox的Image属性选择了一张图片,图片可以显示,但在与设备连接进行调试时在执行到图片加载时就发生异常,///summary///设计器支持所需的方法-不要///使用代码编辑器修改此方法的内容。////summaryprivatevoidInitializeComponent(){
liso WindowsCE
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved