精华内容
下载资源
问答
  • PAGE / NUMPAGES 单片机_C语言函数_中断函数中断服务程序 ? 在开始写中断函数之前我们来一起回顾一下单片机的中断系统 ? 中断的意思学习过微机原理与接口技术的同学没学过单片机也应该知道我们在这里就不讲了首先来...
  • 第一步、使用stm32cubeMX创建工程,选择相应的芯片,配置RCC、SYS、引脚和时钟如下图所示: 注意,由于按键上有上拉电阻,这里选择中断模式的时候,我们选择下降沿触发中断。 第二步,配置输出Keil工程
  • 串口中断服务函数

    千次阅读 2020-03-02 16:55:17
    串口中断服务函数详解 void USART1_IRQHandle(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_Receive...

    串口中断服务函数详解
    void USART1_IRQHandle(void) //串口1中断服务程序
    {
    u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
    Res =USART_ReceiveData(USART1); //读取接收到的数据

    	if((USART_RX_STA&0x8000)==0)//接收未完成(判断USART_RX_STA的第15位是否为0,不为0时说明Res!=oxoa即接受没完成)
    		{
    		if(USART_RX_STA&0x4000)//接收到了0x0d,当if(Res==0x0d)USART_RX_STA|=0x4000;才执行该语句,“此次”的执行中断服务函数Res接受最后一个字符,正常情况下Res=oxoa)
    			{
    			if(Res!=0x0a)USART_RX_STA=0;//(如果Res!=0x0a)接收错误,重新开始
    			else USART_RX_STA|=0x8000;	//(Res=0x0a接收完成了,USART_RX_STA的第15位为1)
    			}
    			
    		else //还没收到倒数第二个字节0X0d
    			{	
    			if(Res==0x0d)USART_RX_STA|=0x4000;//如果接收到了倒数第二个字节0X0d,令USART_RX_STA的第14位为1,
    			else
    				{
    				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//接收数据字节,数组从0到199
    				USART_RX_STA++;//每接收一次加1
    				if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
    				}		 
    			}
    		}   		 
     } 
    

    }
    提示:0x0d和0x0a在ASCII码表里面表示\r和\n,分别表示回车和换行。如果串口接收方收到这两个字符,就会结束当前行的显示,开始从下一行的左端开始显示。

    展开全文
  • STM32CUBE配置GPIO中断,以及中断回调函数编写 .
  • 中断作用

    万次阅读 2018-05-15 10:31:36
    所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务...

    所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务都作过了(但不一定都做完毕),再接着做第一个没有做完的任务,就这样走而复始循环工作。完成所谓的“多任务”。

    要不然,一个cpu,如果即能一边打字,一边看到屏幕呢?这就是一个cpu核心,不断地一会检测键盘,一会检测屏幕……
    还有就是软中断,具体详细的细节,可以参考微机原理。

    中断系统

    中断装置和中断处理程序统称为中断系统

    中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。

    不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。中断是CPU对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点成为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分成为软件处理程序。

    中断系统的功能

    1)实现中断响应和中断返回

    当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。

    2)实现优先权排队
    通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。

    3)实现中断嵌套
    当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。

     

    中断、异常和系统调用

    所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。

    中断可分为三类,第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。第二类是来自CPU的内部事件或程序执行中的事件引起的过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。

    第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、被动的,而陷入是有意和主动的。

    1.中断处理

    中断处理一般分为中断响应和中断处理两个步骤。中断响应由硬件实施,中断处理主要由软件实施。

    (1)中断响应

    对中断请求的整个处理过程是由硬件和软件结合起来而形成的一套中断机构实施的。发生中断时,CPU暂停执行当前的程序,而转去处理中断。这个由硬件对中断请求作出反应的过程,称为中断响应。一般说来,中断响应顺序执行下述三步动作:

    ◆中止当前程序的执行;

    ◆保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);

    ◆从中断控制器取出中断向量,转到相应的处理程序。

    通常CPU在执行完一条指令后,立即检查有无中断请求,如果有,则立即做出响应。

    当发生中断时,系统作出响应,不管它们是来自硬件(如来自时钟或者外部设备)、程序性中断(执行指令导致“软件中断”—SoftwareInterrupts),或者来自意外事件(如访问页面不在内存)。

    如果当前CPU的执行优先级低于中断的优先级,那么它就中止对当前程序下条指令的执行,接受该中断,并提升处理机的执行级别(一般与中断优先级相同),以便在CPU处理当前中断时,能屏蔽其它同级的或低级的中断,然后保存断点现场信息,通过取得的中断向量转到相应的中断处理程序的入口。

    (2)中断处理

    CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到相应的表项,该表项应是一个中断门。于是,CPU就根据中断门的设置而到达了该通道的总服务程序的入口。

    核心对中断处理的顺序主要由以下动作完成:

    ◆保存正在运行进程的各寄存器的内容,把它们放入核心栈的新帧面中。

    ◆确定“中断源”或核查中断发生,识别中断的类型(如时钟中断或盘中断)和中断的设备号(如哪个磁盘引起的中断)。系统接到中断后,就从机器那里得到一个中断号,它是检索中断向量表的位移。中断向量因机器而异,但通常都包括相应中断处理程序入口地址和中断处理时处理机的状态字。

    ◆核心调用中断处理程序,对中断进行处理。

    ◆中断处理完成并返回。中断处理程序执行完以后,核心便执行与机器相关的特定指令序列,恢复中断时寄存器内容和执行核心栈退栈,进程回到用户态。如果设置了重调度标志,则在本进程返回到用户态时做进程调度。

    2.系统调用

    在Unix/Linux系统中,系统调用像普通C函数调用那样出现在C程序中。但是一般的函数调用序列并不能把进程的状态从用户态变为核心态,而系统调用却可以做到。

    C语言编译程序利用一个预先确定的函数库(一般称为C库),其中有各系统调用的名字。C库中的函数都专门使用一条指令,把进程的运行状态改为核心态。Linux的系统调用是通过中断指令“INT0x80”实现的。

    每个系统调用都有惟一的号码,称作系统调用号。所有的系统调用都集中在系统调用入口表中统一管理。

    系统调用入口表是一个函数指针数组,以系统调用号为下标在该数组中找到相应的函数指针,进而就能确定用户使用的是哪一个系统调用。不同系统中系统调用的个数是不同的,目前Linux系统中共定义了221个系统调用。

    另外,系统调用表中还留有一些余项,可供用户自行添加。

    当CPU执行到中断指令“INT0x80”时,硬件就做出一系列响应,其动作与上述的中断响应相同。CPU穿过陷阱门,从用户空间进入系统空间。相应地,进程的上下文从用户堆栈切换到系统堆栈。

    接着运行内核函数system_call()。首先,进一步保存各寄存器的内容;接着调用syscall_trace(),以系统调用号为下标检索系统调用入口表sys_call_table,从中找到相应的函数;然后转去执行该函数,完成具体的服务。

    执行完服务程序,核心检查是否发生错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到用户空间。

    上面两讲简要介绍了Linux内核的主要数据结构和相应的算法。Linux内核包含了丰富的内容,这里仅是其中的一点点,以求起到“抛砖引玉”的作用。





    信号的中断与系统调用的重起



    #include <signal.h>int sigaction(ints signo, const structsigaction *act, struct sigaction *oact) ;struct sigaction { void(*sa_handler)(); /* addr of signal handler, or SIG_IGN, or SIG_DFL*/ sigset_t sa_mask; /* additional signals to block */ intsa_flags; /* signal options*/} ; 当更改信号动作时,如果sa_handler指向一个信号捕捉函数(不是常数SIG_IGN或SIG_DFL),则sa_mask字段说明了一个信号集,在调用信号捕捉函数之前,该信号集要加到进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复为原先值。这样,在调用信号处理程序时就能阻塞某些信号。在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止。A.可自动重起的signal()的实现:#include <signal.h>#typpdef voidSigfunc(int signo); Sigfunc *signal(int signo, Sigfunc *func){struct sigaction act, oact; act.sa_handler = func;sigemptyset(act.sa_mask); act.sa_flags = 0; if (signo == SIGALRM){#ifdef SA_INTTERRUPT //SUNOS act.flags |= SA_INTTERRUPT;#endif }else // for other signal {#ifdef SA_RESTART //SVR, 4.3+BSD act.flag|= SA_RESTART; #endif } if (sigaction(signo, &act, &oac)< 0) return (SIG_ERR); return (oact.sa_handler);}注:在if语句中,我们检查是否为SIGALRM信号,如果是,且系统定义了SA_INTERRUPT(SUNOS),即为SUNOS,该系统默认的系统调用是自动重起的,我们阻止该信号中断的系统调用重起,因为我们要用该信号中断I/O操作,实现定时的功能.接着的else语句中的信号为SIGALRM之外的其他信号,且系统定义了SA_RESTART,即为SVR4或4.3+BSD类系统,该类系统中默认的系统调用是不可重起的,所以应该加上SA_RESTART标志,使由这些信号中断的系统调用自动重起.B.不可重起的signal_intr()实现: Sigfunc *signal_intr(int signo,Sigfunc *func)
    {
    struct sigaction act, oact;

    act.sa_handler = func;
    sigemptyset(act.sa_mask);
    act.sa_flags = 0;

    #ifdef SA_INTTERRUPT //SUNOS
    act.flags |= SA_INTTERRUPT;
    #endif
    if (sigaction(signo, &act, &oac) < 0)
    return (SIG_ERR);

    return (oact.sa_handler);
    }
    注:只有SUNOS为自动重起的,其他为不自动重起的,所以只要将SUNOS标志为非自动重起即可.如上.

    展开全文
  • 51在上电后,PSW的RS两个位默认为0,也即51默认使用工作寄存器组BANK 0,在默认状态下,对于普通的C语言函数,其传参、申请局部变量、导出函数的返回值等功能...对于51的中断服务函数,它没有形参,也不用返回值,...

    注:本文参考自https://blog.csdn.net/q2631837575/article/details/78776567

    51在上电后,PSW的RS两个位默认为0,也即51默认使用工作寄存器组BANK 0,在默认状态下,对于普通的C语言函数,其传参、申请局部变量、导出函数的返回值等功能,keil将其翻译成汇编以后,肯定要使用R0~R7;对于51的中断服务函数,它没有形参,也不用返回值,但是一般肯定有局部变量,这时就需要用到R0~R7了;试想,在执行普通函数时,R0~R7已经被使用了,在执行普通函数时,一旦发生中断,而中断函数也需要使用R0~R7,那怎么办?我们最先想到的是,在执行中断服务函数前先把R0~R7入栈(像累加器A、状态PSW等也要入栈这个不用说大家也知道),在中断服务完成后把R0~R7出栈,然后就能恢复现场,回到普通函数中去了,但是这8个Rn不能直接入栈,PUSH R0这样的语句是不允许的,要想R0入栈只能用两句:MOV A R0; PUSH A;这样的后果是,每次工作寄存器入栈都需要2*8=16条汇编语句才能完成,再加上A、B、PSW等寄存器入栈等,相当于每次中断都要消耗大量的时间来出栈入栈,影响程序速度。如何解决这一问题呢?51提供了这样一种机制,切换工作寄存器组,过程如下:

        普通函数的执行过程中正在使用BANK0的R0~R7,执行过程中突然发生了中断,而中断函数也想使用R0~R7,在执行中断服务函数前,我们切换工作寄存器组,切换的具体方法就是直接修改PSW的RS两个比特位,而不必把BANK 0入栈,本文开头的例子中using 2,就是说,在进入外部中断0的服务函数前,先入栈CPU寄存器,再把工作寄存器组由0切换成2,在退出中断服务后,先由BANK2切换回BANK0,并弹出CPU寄存器,由于BANK0和BANK2处在不同的RAM空间,互相不干扰,切换回BANK0之后就把那个普通函数的现场给恢复了。


    补图(过程图)

    展开全文
  • Arduino常用函数总汇——中断函数

    千次阅读 2018-11-06 22:33:07
    3、attachInterrupt(interruptnum,function,mode):用于设置外部中断函数  interruptnum:中断源(0或1)  function:中断处理函数的名字  mode:中断触发模式(LOW:低电平触发;CHANGE:...

    1、Interrupt():打开总中断

    2、noInterrupts():关闭总中断

    3、attachInterrupt(interruptnum,function,mode):用于设置外部中断函数

            interruptnum:中断源(0或1)

            function:中断处理函数的名字

             mode:中断触发模式(LOW:低电平触发;CHANGE:变化时触发:RISING;低电平变为高电平时触发;FALLING:高电平变低电平时触发)

    4、void detachInterrupt(interruptnum):取消中断源为interruptnum的中断

     

     

    展开全文
  • 中断服务函数

    千次阅读 2020-01-17 14:44:45
    中断问题也是面试嵌入式岗位时,面试官比较喜欢拷问的问题之一,作为一个嵌入式开发人员,自然少不了与中断打交道,裸机程序中...4.不要在中断函数中使用printf函数,会带来重入和性能问题 中断并不是程序一开始...
  •   通过生活中一个简单的例子来说明中断。当你正在家中看书时,突然电话铃响了,你停止看书,去接电话,和来电话的人进行交谈,通话结束后回来继续从刚才停止的位置看你的书。这就是生活中的“中断”的现象,就是...
  • 中断函数

    千次阅读 2014-10-22 12:44:15
    C51的中断函数的格式为:void FuncIr(void) interrupt x [using y] 以下是梦游的一些分析:  一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用...
  • 嵌入式里的中断解读以及中断服务函数

    千次阅读 多人点赞 2018-11-26 15:27:16
    从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)...
  • 中断服务函数函数调用的区别

    千次阅读 2019-12-23 17:02:06
    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...
  • stm32端口、中断初始化及中断函数

    千次阅读 2019-07-24 19:38:39
    对于stm32端口、中断初始化及中断函数的调用 端口初始化 首先来看下官方提供的端口初始化库函数(以stm32f4xx为例) ps:很多时候看官方提供的函数比较困难,所以结合例子进行分析,部分官方代码未能展示,可在keil...
  • 中断函数和中断处理函数

    万次阅读 2014-10-22 13:52:37
    (1)当你在做一个计算机(嵌入式)系统时,在为系统做初始化时往往会有设置中断向量的操作。 当你设置好某个特定的外部事件(比如定时器超时)的中断向量后,当你允许(使能)了该设备(定时器),那么等到特定...
  • 中断处理函数注意事项

    千次阅读 2020-05-09 11:49:24
    中断服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在中断服务函数中使用不可重入的函数,往往会导致问题。
  • 中断函数的写法

    万次阅读 2016-08-16 19:48:41
    1.定时/计数器 初始化程序应完成如下工作... 中断方式时,则对IE赋值,开放中断。   使TR0或TR1置位,启动定时/计数器定时或计数。 TMOD=0x01;   \\设定工作方式为16位定时器  TH0=(65536-50000)/2
  • C51中断函数格式

    千次阅读 2017-07-14 23:24:30
    C51 Keil 编译器中断函数语法定义:void 函数名() interrupt n using m C51编译器允许0~31个中断,C51控制器所提供的中断及中断地址如下: 中断号 中断源 中断地址 0 EXTERNAL 0 0003H 1 TIMER/COUNTER 0 ...
  • CC2530中断初始化和中断函数

    千次阅读 2020-07-21 20:37:06
    中断初始化 其实中断的初始化可以参照引脚的初始化,即4个寄存器(PxSEL,PxDIR,PxINP,P2INP)。中断同样也要初始化 1)初始化输入信号寄存器(PICTL) 设置中断的触发(开始)条件 例如:PICTL |= 0x01 设置端口P0_7...
  • 有谁知道能够完好的在matlab function模块中嵌入下面的函数吗? ![图片说明](https://img-ask.csdn.net/upload/201806/02/1527937699_491662.png其中,输入u通过 fwrite(s,u)输出(不知道这么写对不对);而输出y=...
  • 单片机中断函数中的全局变量问题

    千次阅读 2019-06-26 15:42:55
    然后呢,我不想在中断函数里写太多代码,便只在中断函数里放了一个全局变量,按下按钮进入中断时改变该变量的值,然后在主程序中判断该值,来执行接下来的程序,部分程序代码如下: void main...
  • 初学Arduino——中断函数attachInterrupt

    万次阅读 2019-01-14 21:25:20
    比较上次写的判断语句,这次我们使用中断函数(attachInterrupt),使代码更简洁易懂。 中断函数(attachInterrupt):attachInterrupt(interrupt,function,mode) interrupt:中断源(在Arduino中,中断源可选...
  • IAR环境编写STM8中断处理函数的技巧

    千次阅读 2020-05-24 21:31:28
    IAR环境下编写STM8的中断函数,对于中断向量的概念、以及编程处理方法不太好理解,这篇文章总结了几个关键的中断编程技巧,知此文可以不用看搜索其他相关文章了。 1. STM8 中断向量表 首先清楚stm8的中断向量表,下...
  • 1、中断号定义 在stm32f10x.h中定义枚举类型IRQn中,定义了各个中断中断号。 2、中断向量表 嵌套向量中断控制器(Nested Vectored Interrupt Controller)。CM3的中有一个强大而方便的NVIC,它是属于Cortex...
  • STM32是如何进入中断函数

    万次阅读 多人点赞 2018-07-19 15:49:02
    一开始接触到的一般都是软中断,软中断就是中断程序包含在主程序里面,当中断条件满足时,直接跳转到中断函数执行,然后再返回。就相当于判断语句。   刚开始接触STM32的小伙伴可能会发现main...
  • delay函数是arduino内的自带的最常用的延时函数,但是它调用avr的timer0,和中断函数冲突,也是无法起作用的。 正解 delayMicroseconds函数 for(int i=0;i;i++) delayMicroseconds(10000);  可以使用...
  • 51单片机中关于中断函数interrupt的使用

    万次阅读 多人点赞 2019-05-28 16:57:11
    #include<reg52.h> void main() { P1 = 0x0f;...//INT1中断允许 EA = 1;//全局中断打开 IT1 = 1;//触发方式为下降沿触发 while(1); } void jump_low() interrupt 2 { P1 = ~P1; //位反转 ...
  • STM32输入捕获中断函数逻辑理解

    千次阅读 2020-09-10 17:47:05
    STM32输入捕获中断函数逻辑理解 写在前面: 本人最近在初学stm32定时器的应用之输入捕获的时候,发现其中断函数处理上升沿和下降沿的逻辑比较难理解,于是花了一些时间写下理解的过程。若有不正确之处,望请指正!!...
  • STM32中断函数

    千次阅读 2017-01-04 12:47:22
    STM32中断函数名和普通的ARm裸板开发不同。使用stm32库函数编程时,中断函数名是固定死的。 具体函数名可以在启动文件startup_stm32fxxx_xd.s的Vector Table Mapped(中断函数向量表)中查看。 启动文件 startup_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 410,243
精华内容 164,097
关键字:

中断函数作用