精华内容
下载资源
问答
  • 本韩淑伟PIC单片机中断处理函数,高级终端地址为0x08H
  • 中断系统的运行必须与子程序配合才能正确使用。... (4)编写中断服务子程序处理中断请求。 前3条一般放在主程序的初始化程序段中。 举例如下:例1、假设允许外部中断0中断,并设定它为高优先级中断,其他中断源为
  • 中断处理程序

    2018-11-12 15:21:00
    中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤: 1)保存用到的寄存器 2)处理中断 3)恢复用到的寄存器 4)用iret指令返回。 编程处理0号中断(除法错误) 1)编写可以显示"overflow!"的中断处理...

    中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤:

    1)保存用到的寄存器

    2)处理中断

    3)恢复用到的寄存器

    4)用iret指令返回。

     

    编程处理0号中断(除法错误)

    1)编写可以显示"overflow!"的中断处理程序: do0;

    2)将do0送入内存0000:2000处;

    3)将do0的入口地址0000:0200存储在中断向量表0号表项中。

     

    assume cs:code
    
    code segment
    
    start:
                      mov ax, cs
                      mov ds, ax
                      mov si, offset do0
                      mov ax, 0
                      mov es, ax
                      mov di,200h
                      mov cx, offset do0end-offset do0
                      cld
                      rep  movsb
    
                      mov ax, 0                                 ;设置中断向量表
                      mov es, ax
                      mov word ptr es:[0*4], 200h
                      mov word ptr es:[0*4+2],0
    
                      mov ax,4c00h
                      int 21h
    
    do0:
                       jmp short do0start
                       db  "overflow!"
    
    do0start:
                       mov ax, cs
                       mov ds, ax
                       mov si, 202h
           
                       mov ax, 0b800h
                       mov es, ax
                       mov di, 12*160+36*2       ;设置es:di指向显存空间的中间位置
    
                       mov cx, 9
    
    
    s:
                        mov al, [si]
                        mov es:[di], al
                        inc si
                        add di, 2
                        loop s
    
                        mov ax, 4c00h
                        int 21h
    
    do0end:
                         nop
    
    code ends
    end start   

     

    转载于:https://www.cnblogs.com/gkp307/p/9946672.html

    展开全文
  • 中断服务子程序

    千次阅读 2014-10-14 11:41:48
    中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。 当中央处理器正在处理内部数据时,外界发生了紧急情况,...

    中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。

    具代表事实是,产生了一个新的关键字 __interrupt。

    下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。


    __interrupt double compute_area (double radius) 
    {
        double area = PI * radius * radius;
        printf("\nArea = %f", area);
        return area;
    }


    这个函数有太多的错误了,以至让人不知从何说起了:

    1)  ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。

    2)  ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。

    3)  在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

    此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

    4) 与第三点一脉相承,printf经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

     

    不能在中断服务程序中执行类似操作的原因是运算时间太长,不能在中段中作复杂的工作,你可以在中断服务程序中置一个标志位.然后在主程序中查询此位,判断是否执行计算子程序.当然这样做会在中断产生与实际的中断响应之间产生一定的延迟,如果你的系统对时间不太敏感还好,如果非常敏感可以考虑采用rtos。否则。。。多加几句对中断标志位的判断语句。。。。

    在主程序中监测是否被置位来决定子程序是否执行.可能存在以下问题,就是,中断返回后要执行几个耗时比较长的子程序才能执行判断标志位的语句,这样,可能会有太长的时间间隔.如果你在几个耗时比较长的子程序之间加上一句判断语句,就会减小中断产生与中断响应之间的时间延迟.

     中断活动的全过程大致为:

    1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务

    2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);

    3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序

    4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;

    5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;

    6、中断处理:开始对查明的中断源进行有针对性的中断服务;

    7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;

    8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;

    9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作


    展开全文
  • 文章目录实验11 编写子程序实验12 编写0号中断处理程序 实验11 编写子程序 编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。 名称:letterc 功能:将以0结尾的字符串中...

    实验11 编写子程序

    编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。

    名称:letterc
    功能:将以0结尾的字符串中的小写字母转变成大写字母
    参数:ds:si指向字符串首地址
    
    应用举例:
      assume cs:codesg
      datasg segment
          db "Beginner's All-purpose Symbolic Instruction Code.",0
      datasg ends
      codesg segment
       begin: mov ax,datasg
              mov ds,ax
              mov si,0
              call letterc
              mov ax,4c00h
              int 21h
      letterc:    :
                  :
      codesg ends
      end begin
      注意需要进行转化的是字符串中的小写字母a~z,而不是其他字符。
    
    

    代码如下:

    assume cs:code
    data segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
    data ends
    
    code segment
    
    begin:
        mov ax,data
        mov ds,ax
        mov si,0
        call letterc
    
        mov ax,4c00h
        int 21h
    
    ;名称:letterc
    ;功能:将以0结尾的字符串中的小写字母转变为大写字母
    ;参数:ds:si指向字符串首地址
    letterc:
        push cx
        pushf
        mov cx,0
    s1:
        mov cl,ds:[si]		;判断是否为0
        jcxz ok
        cmp cl,61h		;不在a-z范围内则跳转
        jb nextgo
        cmp cl,7ah
        ja nextgo
        and cl,0dfh		;小写字母转大写
        mov ds:[si],cl
    nextgo:
        inc si
        jmp short s1
    ok:
        popf
        pop cx
        ret
    code ends
    end begin
    

    运行结果:
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述


    实验12 编写0号中断的处理程序

    编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error”,然后返回到DOS。

    编写0号中断处理程序如下:

    assume cs:code
    
    	
    	code segment
    		start: mov ax,cs
    			   mov ds,ax
    			   mov si,offset do0	;设置ds:si指向源地址
    			   mov ax,0
    			   mov es,ax
    			   mov di,200h		;设置es:di指向目的地址
    			   
    			   mov cx,offset do0end-offset do0	;设置cx为传输长度
    			   cld	;传输方向设置为正
    			   rep movsb
    			   
    			   mov ax,0;设置中断向量表
    			   mov es,ax
    			   mov word ptr es:[0*4],200h
    			   mov word ptr es:[0*4+2],0
    			   
    			   mov ax,4c00h
    			   int 21h
    		
    		do0:jmp short do0start
    			db "divide error"
    			   
    			do0start:   
    			   mov ax,cs
    			   mov ds,ax
    			   mov si,202h		;设置ds:si指向字符串
    			   
    			   mov ax,0b800h
    			   mov es,ax
    			   mov di,12*160+36*2		;设置es:di指向显存空间的中间位置
    			   
    			   mov cx,12		;设置cx为字符串长度
    			s:		
    			   mov al,[si]
    			   mov es:[di],al
    			   inc si
    			   add di,1
    			   mov al,02h	;设置颜色
    			   mov es:[di],al
    			   add di,1
    			   loop s
    			   
    			   mov ax,4c00h
    			   int 21h
    			   
    		do0end:nop
    	code ends
    end start   
    

    编写除法溢出程序如下

    assume cs:code
    	code segment
    	start:
    		mov ax,1000h
    		mov bh,1
    		div bh
    	code ends
    end start
    

    运行结果
    在这里插入图片描述

    展开全文
  • 疑问: 1.设备,中断线,中断处理程序联系 2.中断上下文与进程上下文 3.中断系统 总结

    疑问:

    1.设备,中断线,中断处理程序联系,异常与中断的区别
    2.中断上下文与进程上下文
    3.嵌套中断
    4.共享中断处理程序的编写
    5.基于内核2.6.3分析中断处理机制的实现概述
    6.中断子系统框架概述 (待续)
    7.中断控制(内核版本2.6)(待续)

    结语:

    异常:处理器产生的同步中断(在处理器处理失误代码造成执行错误指令的时候(分母为0),或者在执行期间出现特殊情况(缺页),必须由内核处理,处理器产生一个异常)
    中断:由硬件产生的异步中断

    中断线 对应同一个中断处理程序或多个(中断线共享),并非与设备一一对应,一个设备可以产生多个中断,又想中断处理程序运行快,工作量又大,这个矛盾体得去权衡,基于此提出了上部分(TH)和下部分(BH)中断处理程序属于上部分,中断产生立即执行,它一般负责对接收的中断进行应答和复位硬件。能够被允许稍后完成的工作会推迟到下部分去执行,linux提供针对下部分的各种机制(下回分解)

    注意
    进程上下文均可睡眠,中断不可以睡眠;
    原因:进程存在current宏与其关联(current宏,是一个全局指针,指向当前进程的struct task_struct结构体,即表示当前进程),此外因为进程是以进程上下文的连接进内核中的,因此进程上下文可以睡眠的,也可以调用调度程序。而中断无后备进程,也就无法对其重新调度,自然也就不可以睡眠,详细理解参考中断上下文与进程上下文

    注意
    针对request_irq 可能睡眠,因此不可以在中断上下文或者不允许阻塞的进程对其进行调用,常见错误:在睡眠不安全的的上下文中调用request_irq 函数
    解析源码原因如下:
    request_irq 在注册的过程会在/proc/irq 创建一个与中断对应的项,函数proc_create 就是用来创建这个procfs项的,而proc_create对新的procfs项进行配置,proc_create 会调用 kmalloc 来请求分配内存,而kmalloc是可以睡眠的。

    分支之中断子系统概述

    HW层面逻辑架构
    中断子系统SW软件逻辑架构
    内核中断子系统大致可以分为四层,深入了解请参考中断子系统
    1.硬件无关的代码,我们称之Linux kernel通用中断处理模块。无论是哪种CPU,哪种controller,其中断处理的过程都有一些相同的内容,这些相同的内容被抽象出来,和HW无关。此外,各个外设的驱动代码中,也希望能用一个统一的接口实现irq相关的管理(不和具体的中断硬件系统以及CPU体系结构相关)这些“通用”的代码组成了linux kernel interrupt subsystem的核心部分,对应目录/kernel/kernel/irq。
    2.CPU architecture相关的中断处理。 和系统使用的具体的CPU architecture相关,对应目录下的kernel/arch/arm/kernel。
    3.Interrupt controller驱动代码 。和系统使用的Interrupt controller相关,对应目录kernel/drivers/irqchip/。
    4.普通外设的驱动。这些驱动将使用Linux kernel通用中断处理模块的API来实现自己的驱动逻辑。

    分析之中断处理机制的实现概述

    基于上文中硬件层面的逻辑图,想必大家也是知道中断子系统依赖于cpu架构,所使用中断控制器requestline在激动的情况下,中断控制器就会把找中断电信号发往处理器,处理接收,停止正在做的事,然后跳转到内存预定义的位子上去执行,这个预定义的位置由内核设置,是中断处理程序的入口,这类似于系统调用通过预定义的异常句柄进入内核,每一条request line处理器会调到指定的位置,这样内核就知道接收的irq号了。

    嵌套中断

    针对中断嵌套:
    当一个中断处理程序执行时,相应的中断线在所有的处理器上都会被屏蔽,为防止系统在同一处理上接收一个新的中断,通常其它的中断线是打开的,所有不同中断线上的中断可以被处理,但当前中断线是被禁止的,由上可得,同一中断处理程序绝对不会被同时调用以处理嵌套的中断

    共享中断处理程序的编写

    按照如下三点要求编写

    1.request_irq 的参数flags必须设置为IRQF_SHARED
    2.每个注册的中断处理程序中的dev参数必须唯一,常用唯一的设备指针,不可给共享的中断处理程序传NULL,不同于非共享中断的处理程序的编写
    3.中断处理程序能够区分确实是它对应的设备产生了中断,即需要硬件支持也需要,也要中断处理程序有相关的处理逻辑。
    指定IRQF_SHARED标志以调用request_irq 时 只有在以下两种情况下可以成功
    (1)当前中断线未注册
    (2)中断线已注册中断程序都指定了IRQF_SHARED

    展开全文
  • 还请各位朋友能够给我指出来,我将不胜感激,谢谢~前言笔者在《程序是如何在 CPU 中运行的(二)》中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?...
  • 中断服务子程序是如何被执行的 ?

    千次阅读 2020-05-25 00:07:18
    笔者在 《程序是如何在 CPU 中运行的(二)》中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?两者的相同点和不同点是什么呢?该篇文章笔者将详细地阐述...
  • 还请各位朋友能够给我指出来,我将不胜感激,谢谢~前言笔者在《程序是如何在 CPU 中运行的(二)》中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?...
  • 子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序子程序在功能上具有相对的独立性, 在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,...
  • 通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。 所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理...
  • 从功能上看,其位于网络设备驱动程序和网络层协议实现模块之间,作为二者之间的数据包传输通道,一种接口模块而存在——对驱动层的接口函数netif_rx, 以及对网络层的接口函数net_bh。前者提供给驱动模块的中断例程...
  • Linux中断系统-中断处理

    千次阅读 2013-12-24 13:42:00
    中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断程序。...
  • 中断处理程序入口程序CS:IP 中断号*4 例:int 21h 21h*4=84h (低字存放IP,高字存放CS) 则中断指令的入口地址 IP存放0084h,0085h 入口地址CS存放0086H 0087H 中断调用 INT 21H DOS中断调用步骤 第一步:置...
  • plc这样理解中断功能,在理解中断时,你首先要清楚plc的运算周期或者说是扫描周期,我们有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握,分为三部分,输入处理程序处理、输出处理、1、输入处理...
  • 关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。 已有 2430 次阅读2016-7-20 10:28 |个人分类:STM8S /*-------------------------------------- (C) COPYRIGHT 北 ----------------...
  • plc这样理解中断功能,在理解中断时,首先要清楚plc的运算周期或者说是扫描周期,有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握,分为三部分,输入处理程序处理、输出处理、 1、输入处理,可...
  • plc这样理解中断功能,在理解中断时,首先要清楚plc的运算周期或者说是扫描周期,有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握,分为三部分,输入处理程序处理、输出处理、打开UC浏览器 查看...
  • 汇编之控制转移指令之子程序、中断指令和系统功能调用前言子程序CALL调用指令RET返回指令中断指令和系统功能调用中断与中断源中断种类中断向量软中断指令中断响应过程中断嵌套中断处理程序设计设置中断向量DOS系统...
  • 选择==除GDT的所有基地址. 而GDT的基址是由程序一开始就设定好的. 通过lgdt来把GDT表放到程序设定好的位置.
  • 当某个中断处理处理时间较长时,很有可能就会造成其他中断丢失而无法响应,影响系统性能。 中断分成上下半部处理可以提高中断的响应能力,在上半部处理完成后便将中断打开,这样就可以响应其他中断了,等到中断退出...
  • 单片机中的中断系统对电子工程师来说是解决突发事件和多任务实时处理的方法,熟练掌握中断技术的应用是一个合格电子工程师必备的能力。  PIC与51系列单片机一个显著的区别就是:PIC只有一个中断入口地址(为04H)...
  • 1、输入处理:可编程控制器在执行程序前,将可编程控制器的所有输入端子的ON/OFF状态读入输入映像区,程序执行过程中即使输入发生变化,输入映像区的内容也不会变化,在执行下一个循环的输入处理时读取该...
  • 中断

    2020-08-04 21:40:17
    中断:通过硬件来改变CPU运行方向的一种技术。 程序在执行过程中由于外界的原因而被中间...中断服务程序或中断处理子程序:中断之后所执行的处理程序。 主程序:原来运行的程序。 断点:主程序被断开的位置。 ...
  • 首先我们从ARM处理器和GIC的视角来介绍中断处理的过程。一、ARM Linux内核中断处理的基本流程:硬件的视角ARM处理器通常用中断(Interrupt)来指代中断信号,对ARM-A系列的处理器来说,它就是外设发送的FIQ或IRQ信号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,162
精华内容 464
关键字:

中断处理子程序