精华内容
下载资源
问答
  • 汇编语言里设置软中断,来调用c语言函数。实现系统调用的模拟。
  • C51中断函数

    2020-08-03 19:25:58
    C51的中断函数的格式为:void FuncIr(void) interrupt x [using y],本文主要对C51的中断函数进行了分析
  • 本文介绍了单片机中常见的中断函数调用子函数和主函数调用子函数的情况,如果同时调用会出现的问题一节解决方法。
  • 关于中断函数

    2014-05-20 19:43:56
    1.中断函数里面不允许休眠,例如调用sleep函数

    1.中断函数里面不允许休眠,例如调用sleep函数,或者用内核定时器启动一个定时函数,但是定时函数里面有休眠的函数(如sleep);

      因为中断休眠之后,就没有办法激活系统了。



    展开全文
  • 关于C51的中断函数要注意的几个问题(高手绕行)  最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖子,希望对小虾米有所帮助,如 有错误之处,还请指正,就当抛砖引玉吧! ...

    关于C51的中断函数要注意的几个问题(高手绕行)

        最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖子,希望对小虾米有所帮助,如

    有错误之处,还请指正,就当抛砖引玉吧!

        C51的中断函数的格式为:

        void FuncIr(void) interrupt x [using y]

        以下是梦游的一些分析:

        一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过

    只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一

    些。

        二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存

    器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈

    的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,

    有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。

        三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是

    这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如

    果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接

    写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部

    分单独拉出来做成函数,可能代码和时间都会更好

        四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命

    的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多

    堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。

        五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的

    函数就使用哪个寄存器组,我认为这样不好:

        这样会增加额外的消耗,使用using会增加一下语句:

        PUSH PSW

        MOV PSW, #XX

        ....

        POP PSW

       更重要的是,使用using的函数不能有返回值,这是致命伤

       个人推荐的方法有两种:

       1、使用“#pragma NOAREGS”禁止使用绝对寄存器

       2、使用“#pragme RB(x)”来指定本文件的工作寄存器组

       六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定

    时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数

    也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

    51单片机的中断函数

    中断使用interrupt 关键字和中断编号0-4来实现:

    返回值 函数名 interrupt n

    n对应中断源的编号,中断编号告诉中断器中断程序的入口地址,它对应着IE寄存器中的使能位,即IE寄存器中的0位对应着外部中断0。

    8051单片机的中断源以及终端编号如下:

    中断编号   中断源                             入口地址

     0            外部中断0                          0003H 

    1             定时器/计数器0 溢出         000BH 

    2             外部中断1                           0013H 

    3             定时器/计数器1 溢出         001BH 

    4              串行口中断                  0023H

    在51系列单片机中,有的单片机多达32个中断源,所以中断编号是0-31.

    当正在执行一个特定的任务时,可能有更紧急的事情需要CPU处理,这就涉及到了中断优先级。高优先级中断可以中断正在处理的低优先级中断程序,因而最好给每种优先级程序分配不同的寄存器组。在C51中可使用using指定寄存器组,using后的变量为0-3的常整数,分别表示51单片机内的4哥寄存器组。中断函数的完整语法如下:

    返回值 函数名([参数])[模式][重入]interrupt n[usingn]

    unsigned int interruptcnt;

    unsigned char second;

    void timer0(void) interrupt 1 using 2

    if(++interruptcnt==4000) // 计数到4000

    second++; //另一个计数器

    interruptcnt=0; //计数器清零


    转自:http://blog.csdn.net/caoweiyan/article/details/8191483



    展开全文
  • 中断函数调用的异同

                                                                               中断和函数调用的异同

    1、中断分为:软中断和硬件中断

         1)软中断:上层应用调用底层接口(以linux操作系统为例,在上层open函数,可以调用到kernel中的open函数)

         2)硬件中断:芯片比如SOC、MCU等IO口可以设置为中断功能,实现已外部通信功能;

    2、函数调用:一个函数调用另外一个函数

    展开全文
  • 中断函数

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

    C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]

    以下是梦游的一些分析:
           一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。
           二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。
           三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部单独拉出来做成函数,可能代码和时间都会更好。
           四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。
            五、中断调用了函数,会出现一些莫名其妙的问题,一些数据不对(我现在遇到这个问题其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的函数就使用哪个寄存器组(我认为好参考C51.PDF:Functions called from an interrupt procedure must function with the same register bank as the interrupt procedure. When the NOAREGS directive is not explicitly specified, the compiler may generate absolute register accesses using the register bank selected (by the using attribute or by the REGISTERBANK control) for that function. Unpredictable results may occur when a function assumes a register bank other than the one currently selected. Refer to “Register Bank Access” on page 124 for more information.),我认为这样不好:
           这样会增加额外的消耗,使用using会增加一下语句:
           PUSH PSW
           MOV PSW, #XX
            ....
            POP PSW
           更重要的是,使用using的函数不能有返回值(这个地方有问题,应该可以有返回值,下文说是不能不能返回 bit 类型的值),这是致命伤(所以这不是致命伤,可以使用using解决这个问题
           个人推荐的方法有两种:
           1、使用“#pragma NOAREGS”禁止使用绝对寄存器
           2、使用“#pragme RB(x)”来指定本文件的工作寄存器组
           六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

    转自http://www.ednchina.com/blog/hotchip/,请大家去他的博客中支持他,里面有不错的文章。括号中是我的理解

    关于using:
    举个例子来说:
    定义一个函数
    void func(unsigned char i) {
    ...
    }
    有如下一个中断函数
    void int_0(void) interrupt 0 using 1 {
    ....
    }
    在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误?

    如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:
    1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。
    2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。(应该是这样的)
    3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
    MOV PSW #0
    这点保证了,没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。
    4、使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH 和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。 ISR 或使用实时操作系统 RTOS 中,寄存器非常有用。
    寄存器组使用的原则:
    1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51 编译器规定使用 using 或 禁止中断的函数(#pragma disable )均不能返回 bit 类型的值。
    2、主程序(main函数)使用一组,如 bank 0;低中断优先级的所有中断均使用第二组,如 bank 1;高中断优先级的所有中断均使用再另外一组,如 bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。
    3、在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。
    举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:
    1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。
    2、如果 ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用 using 指定了其他 BANK),则被调用函数必须放在:
    #pragma NOAREGS
    #pragma AREGS
    控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在 Options->C51,选中“Don''t use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改 OVERLAY 参数,做重入说明。
    3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。
    因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。
    详细使用可参见C51.PDF文件,以上供参考

     

    http://blog.sina.com.cn/s/blog_4c5da5d8010009tu.html

    展开全文
  • 写了一个按键中断服务程序,按下key1pwm输出,按下key2关闭pwm输出,在不加延时的时候key2可以关闭key1打开的pwm,但是加了延时之后key2就不起作用了,是因为在中断服务函数中加了延时导致key2无法响应了吗,即是在...
  • 中断服务函数函数调用的区别

    千次阅读 2019-12-23 17:02:06
    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...
  • 调用HOOK 函数,锁定键盘,用中断的方式实现对硬件的控制。
  • 中断中C函数调用C++

    千次阅读 2012-06-24 20:26:31
    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数... 我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。
  • 51中断函数学习笔记

    2011-04-09 09:14:03
    51中断函数学习笔记 51中断函数学习笔记 word
  • C语言函数调用中断处理

    万次阅读 2018-08-16 19:50:05
    C语言函数调用就好比,你在一个村庄,这个村庄共有100户人家,你就是CPU,100户人家就是100个函数。 你去串门,就是去执行一个函数,你每次只能串一户人家,进户出户就好比进栈出栈,你平时的任务就是不断的去王五...
  • 中断函数和中断处理函数

    万次阅读 2014-10-22 13:52:37
    (1)当你在做一个计算机(嵌入式)系统时,在为系统做初始化时往往会有设置中断向量的操作。 当你设置好某个特定的外部事件(比如定时器超时)的中断向量后,当你允许(使能)了该设备(定时器),那么等到特定...
  • 在使用freertos的过程中,由于没有注意到中断中使用系统函数的问题导致单片机死机。 注意点: 1:首先要将中断的嵌套设置为抢占优先级...3:将freertos的最大系统调用中断优先级(configMAX_SYSCALL_INTERRUPT_PRIOR
  • 中断函数调用的区别

    千次阅读 2015-09-01 11:06:35
    中断函数调用的区别   转载▼ 标签:  中断   函数 分类: C/C++ 中断: 1)何时发生可能是不可预料的;CPU正在处理某件事情的时候,外部发生的某一事件(如一个...
  • Linux内核情景分析之三中断函数调用 Linux内核情景分析之三中断函数调用
  • PendSV中断服务函数

    千次阅读 2019-09-23 14:44:38
    之前在系统滴答定时器中断服务函数调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务...
  • 我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2:
  • 中断优先级状态机描述中断优先级改变行为,在不包含中断处理函数函数静态调用路径基础上,应用迭代方程得到中断优先级序列,将此序列叠加到函数静态调用路径中。实验表明,结合中断优先级的函数静态测试方法,...
  • FreeRTOS正好相反,为了满足某些应用对中断实时性要求高的需求,使得中断优先级高于某个值之后,就不能调用操作系统的内核函数来提高实时性。而我们经常所犯的错误就是将中断的优先级设置的高于这个值,却还在中断中...
  • 系统调用中断

    千次阅读 2015-08-31 12:05:56
    系统调用中断
  • STM32中,关于中断函数调用全局变量的问题

    万次阅读 多人点赞 2018-02-18 19:41:02
    本人菜鸟小白一枚,第一次记录自己在学习中遇到的问题,也当是与各位交流交流。首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:... void KEY1_IRQHandler(void){ //确保是否产生了EXTI Line中断 if(E...
  • 系统调用函数调用

    千次阅读 2015-11-24 13:42:25
    系统调用函数调用1. 系统调用a. 什么是系统调用系统调用,通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件...
  • 系统调用函数调用

    千次阅读 2015-04-16 08:43:23
    操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口...
  • 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 ...
  • 中断函数调用的区别

    千次阅读 2017-08-04 00:17:00
    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 310,593
精华内容 124,237
关键字:

怎么调用中断函数