精华内容
下载资源
问答
  • 中断子程序中定义变量,KEIL C51 中也报错,编译通过 /* 名称:定时器控制单只LED 说明:LED在定时器的中断例程控制下不断闪烁。 */ #include<reg51.h> #define uint unsigned int #define uchar ...

    中断子程序中定义变量,KEIL C51 中也不报错,编译能通过

    /*    名称:定时器控制单只LED            
        说明:LED在定时器的中断例程控制下不断闪烁。
    */
    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit LED=P0^0;
    uchar Tcount;

    main()
    {
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
        Tcount=0;
        LED=1;
        
        while(1);


    }
    void LED_Flash() interrupt 1
    {
        uchar kk;
        kk = Tcount;
        Tcount++;
        TH0=0x3c;
        TL0=0xb0;
        TF0=0;
        if(Tcount%20==0)
        {
            LED=~LED;
        }


    }

    STM32实例中 串口中断例程 中断函数中也能定义变量,编译通过不报错

    void USART1_IRQHandler(void)                    //串口1中断服务程序
        {
        u8 Res;
    #ifdef OS_TICKS_PER_SEC         //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntEnter();    
    #endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
            {
            Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
            
            if((USART_RX_STA&0x8000)==0)//接收未完成     
                {
                if(USART_RX_STA&0x4000)//接收到了0x0d
                    {
                    if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                    else USART_RX_STA|=0x8000;    //接收完成了          //bit15,    接收完成标志     自己注
                    }
                else //还没收到0X0D
                    {    
                    if(Res==0x0d)USART_RX_STA|=0x4000;        //bit14,    接收到0x0d     自己注
                    else
                        {
                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                        USART_RX_STA++;
                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      
                        }         
                    }
                }            
         } 
    #ifdef OS_TICKS_PER_SEC         //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntExit();                                               
    #endif

    #endif    

    展开全文
  • C的中断和反码数据存储

    千次阅读 2010-02-09 17:57:00
    标准c支持中断,但是中断函数不能传递参数,不能有返回值,严格意义上讲,中断函数不能被称作函数,因为没有执行绪主动调用它,函数调用路径是一条确定的顺序路径,由于中断处理是被动的,如果它有参数,那么谁传给...

    标准c支持中断,但是中断函数不能传递参数,不能有返回值,严格意义上讲,中断函数不能被称作函数,因为没有执行绪主动调用它,函数调用路径是一条确定的顺序路径,由于中断处理是被动的,如果它有参数,那么谁传给它呢?如果它有返回值,它返回给谁呢?即使这样,中断处理也还是在栈上执行的,这里的栈是借用任意进程上下文的栈的,中断处理之所以在栈上是硬件体系决定的,而不是它非要在栈上不可,它完全可以切到自己的栈上去。

    计算机为何用补码存储数据---以8位数据为例:

    很多资料上解释了计算机使用补码存储数据的理由,比如什么可以将符号位和数据位一起参与运算等等,这些解释实际上仅仅解释了标而没有解释本,那么到底的原因是什么呢?本质的原因是由于计算机中存储数据是一种循环的环形形式而不是线性的形式,也就是说数据位总是可能满载的,比如8位的数据最大是8个1,此8个1加上1之后就会回环到0,也就是说8位的二进制位永远都不会表示大于8个1的数据,回环成了这里的决定性概念,好像时钟那样一圈一圈不停的重复,对于有符号类型,如果我们将数据的容量一分为二,那么我们就可以表示负数,如果将数据容量比作一个环形,那么从零点作为界限,右边表示正数,而左边表示负数,按照0为中点,使用二进制的加减法就可以得知为何负数是正数的二进制补码,这里补码的含义其实就是反码加1,为什么加1,正是由于有一个0在中间,归到哪里都不合适,因此归到负数的加法里面。

    展开全文
  • 中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字... (2)不能向ISR传递参数;  (3) ISR应该尽可能的短小精悍;  (4) printf(char * lpForm

    中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
      中断服务程序需要满足如下要求:
      (1)不能返回值;
      (2)不能向ISR传递参数;
      (3) ISR应该尽可能的短小精悍;
      (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

    参阅网上资料和个人的一些理解

    a.为什么不能有返回值?

    中断服务函数的调用是硬件级别的,当中断产生,pc指针强制跳转到对应的中断服务函数入口,进入中断具有随机性,并不是某段代码对其进行调用,那么如果有返回值它的返回值返回给谁?显然这个返回值毫无意义,如果有返回值,它必定需要进行压栈操作,这样一来何时出栈怎么出栈将变得无法解决。

    b.不能向ISR传递参数?

    同理,也是由于这样会破坏栈的原因,因为函数传递参数必定会要求压栈出栈操作,由于进入中断服务函数的随机行,谁给它传递参数都成问题

    c.ISR应尽可能的短小精悍?

    如果某个中断频繁产生,而它对应的ISR相当的耗时,那么对中断的响应就会无限的延迟,会丢掉很多的中断请求

    d.printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

    这就涉及到一个中断嵌套问题,由于printf之类的glibc函数采用的是缓冲机制,这个缓冲区是共享的,相当于一个全局变量,第一层中断来时,它向缓冲里面写入一些部分内容,恰好这时来了个优先级更高的中断,它同样调用了printf,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。
        
    嵌入式-物联网学习交流&【955648875】在学的进群一起交流,资料自己群文件下载

    相关资料:

    走进ARM-ARM开发环境搭建

    ARM体系架构

    ARM之蜂鸣器播放音乐

    展开全文
  • keil51的中断处理过程

    2019-10-02 01:03:11
    中断函数注意如下:(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void...

    keil51的中断处理过程

    中断函数注意如下:
    (1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
    (2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。
    (3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。
    (4)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。否则会产生不正确的结果。
    (5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
    (6)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。

     

    void IsrTimer0(void) interrupt [n] n为中断号,编译器将n*8+3=中断(入口)向量地址

    也就是说:

    中断号           中断名                   中断向量地址

    0    INT 0(外部中断0)                      0003H

    1    TIMER/COUNTER 0(定时/计数器0)       000BH

    2    INT 1(外部中断1)                      0013H

    3    TIMER/COUNTER 1(定时/计数器1)       001BH

    4    SERIAL PORT(串口中断)               0023H

    5   TIMER/COUNTER 2(定时/计数器2)       002BH

    外注:         上电复位                      0000H


    (7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。

     

    参考资料:

    http://hi.baidu.com/xing_yufei/blog/item/eddc311804e4c3a84bedbce4.html

    转载于:https://www.cnblogs.com/proteus/archive/2011/11/08/2241758.html

    展开全文
  • 嵌入式C语言学习 static 定义静态变量,注意适用范围。...(2)中断函数不能传递参数 (3)中断里面尽量不做浮点运算 5.运算中同时出现有符号变量和无符号变量,运算是自动变为无符号变量运算。 ...
  • 理解中断

    2020-08-10 15:40:13
    答:1、中断服务函数***不能传递参数函数返回值***,因为不知道什么时候产生中断,不知道给谁返回值,中断是随机发生的,不会有value = interrupt_func();当然除了linux软中断,他可以知道调用者是谁。 2、中断的...
  •  当参数表为空时,表示该函数不从调用函数接受数据。  2、数值参数  传值调用:形参只有在函数被调用时,才被分配内存区域,并一直保留到函数返回时被撤销为止。形参和实参只是名字相同,各自占有各自的内存...
  •  当参数表为空时,表示该函数不从调用函数接受数据。  2、数值参数  传值调用:形参只有在函数被调用时,才被分配内存区域,并一直保留到函数返回时被撤销为止。形参和实参只是名字相同,各自占有各自的内存...
  • 嵌入式系统中的中断

    千次阅读 2017-05-14 17:05:18
    中断是嵌入式系统中的重要组成部分,比如单片机这种没有操作系统的:中断是硬件自动调用的,没有程序去传递参数和接收参数,避免中断函数重入 1)、ISR不能有函数返回值 2)、ISR不能有输入参数 3)、ISR应该是短而...
  • 重入函数,又叫再入函数,是一种可以在函数体内不直接或间接调用其自身的一种函 数。 再入函数可被递归调用...1、再入函数不能传递bit类型参数。 2、与PL/M51兼容的函数不能具有reentrant,这样也不能调用再入函数。
  • ISR之不能做什么

    千次阅读 2018-03-10 16:59:20
    2.ISR 不能传递参数。为什么? 裸奔的系统: 硬件中断响应程序的插入时机是随机的,程序中不存在这样的调用语句:“value=interrupter( )”, 返回值也不知返回给谁。 同理,如果中断函数有形参,但因没有调用者...
  • C++基础学习—函数

    2015-05-29 07:45:21
    目的:了解函数比c增加的内容 1 函数参数引用 优点:避免内存拷贝造成的性能开销。...《1 缺省值从右边开始往左定义,中间不能中断。 《2 一般在声明时写好默认参数,定义时不写。 《3 在使用时,可以填部
  • 中断服务程序ISR

    2014-09-05 14:17:24
    中断服务程序ISR  2013-09-25 15:52:58| 分类: C/C++编程|...(2) 不能向ISR传递参数 (3) ISR应该尽可能的短小精悍 (4) printf(char* lpFormatString,...)函数会带来重入和性能问题,不能在ISR中采用。
  • 编写8051单片机中断函数时应遵循以下规则 1中断函数不能进行参数传递如果中断函数中包含任何参数声明都将导致编译出错 2中断函数没有返回值如果企图定义一个返回值将得到不正确的结果 3在任何情况下都不能直接调用...
  • ARM软中断

    2011-07-10 15:40:06
    要知道的几点:1、在汇编里,如果SWI调用时处于管理模式,将会冲掉LR。所以,要加入栈保护。如果是C语言的话,编译器已经完成,...参数最多允许4个,用R0-R3来传递,因为发生软中断会进入管理模式, 不能用别人的堆
  • 中断服务程序的要求

    2013-04-16 21:37:26
    1.不能返回值; 2.不能向ISR 传递参数; 3.ISR 应该尽可能的短小精悍函数 4.不能带来重入和性能问题
  • 用带参数宏代替函数可以在中断中可以节省更多的运行时间,至于中断时间过长造成其他的处理程序无法正常运行。宏展开占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。 ...
  • 2、ISR不能传递参数; 3、ISR应该是短而高效的,在ISR中做浮点运算是不明智的; 4、ISR中不应该有重入和性能上的问题,因此不应该使用pintf()函数。     转自CSDN   1.ISR 不能有返回值。为什么?
  • ①tasklet是基于软中断实现的,其优先级高于进程而低于硬件中断,同样不能做休眠操作。 ②内核描述tasklet的数据结构 目前主要关注两个成员:func和data func:指向的函数即为延后处理函数,形参unsigned long...
  • 2、ISR不能传递参数; 3、ISR应该是短而高效的,在ISR中做浮点运算是不明智的; 4、ISR中不应该有重入和性能上的问题,因此不应该使用pintf()函数。 裸奔的系统:硬件中断响应程序的运行插...
  • ISR 中断服务子程序的几个特点

    千次阅读 2014-02-14 12:53:12
    ISR不能传递参数;ISR应该是短而高效的,在ISR中做浮点运算是不明智的;ISR中不应该有重入和性能上的问题,因此不应该使用pintf()函数。 但是从网上大家的讨论看,有的时候ISR并不见得满足以上4个条件,比如有网友...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

中断函数不能传递参数