精华内容
下载资源
问答
  • 中断服务函数与函数调用的区别

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

    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过把两过程结合起来,采用比较教学方法,能收到了很好的教学效果。

    1、两过程定义与作用

    子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。
    
    子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点(即调用指令的下一条指令),继续执行没有处理完的主程序,这一过程叫做(主程序)调用子程序过程。
    

    子程序结构可简化程序,防止重复书写错误,并可节省内存空间。计算机中经常把常用的各种通用的程序段编成子程序,提供给用户使用。用户在自己编写的程序中,只要会调用这些子程序,就可大大简化用户编程的困难。

    中断是计算机中央处理单元CPU与外设I/O交换数据的一种方式,除此方式外,还有无条件、条件(查询)、存贮器直接存取DMA和I/O通道等四种方式。由于无条件不可靠,条件效率低,DMA和I/O通道两方式硬件复杂,而中断方式CPU效率高,因此一般大多采用中断方式。
    

    中断概念是当计算机正在执行某一(主)程序时,收到一中断请求,如果中断响应条件成立,计算机就把正在执行的程序暂停一下,去响应处理这一请求,执行中断服务程序,处理完服务程序后,中断返回指令使计算机返回原来还没有执行完的程序断点处继续执行,这一过程称为中断过程。有了中断,计算机才能具有并行处理,实时处理和故障处理等重要功能。

    2、两过程的联系与区别

    2.1联系

    中断与调用子程序两过程属于完全不同的概念,但它们也有不少相似之处。两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。
    

    正是由于这些表面上的相似处,很容易使学生把两者混淆起来,特别是把中断也看为子程序,这就大错特错了。

    2.2区别

    中断过程与调用子程序过程相似点是表面的,从本质上讲两者是完全不一样的。
    

    两者的根本区别主要表现在服务时间与服务对象不一样上。首先,调用子程序过程发生的时间是已知和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序,调用指令所在位置是已知和固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主程序时收到中断源提出的中断申请时,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的(软中断发生时间是固定的),也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的;其次,子程序完全为主程序服务的,两者属于主从关系,主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序两者一般是无关的,不存在谁为谁服务的问题,两者是平行关系;第三,主程序调用子程序过程完全属于软件处理过程,不需要专门的硬件电路,而中断处理系统是一个软、硬件结合系统,需要专门的硬件电路才能完成中断处理的过程;第四,子程序嵌套可实现若干级,嵌套的最多级数由计算机内存开辟的堆栈大小限制,而中断嵌套级数主要由中断优先级数来决定,一般优先级数不会很大。


    中断是嵌入式系统中重要的组成部分,但是在标准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,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。
    http://www.cnblogs.com/thammer/p/5017329.html

    展开全文
  • 中断中C函数调用C++

    千次阅读 2012-06-24 20:26:31
    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数... 我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。
            之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需要解决了问题:在断函数中怎么调用C++的成员函数?
    

            我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。

            尝试1:直接将 CDebug.h 文件包含进来。

    #include "CDebug.h"
    
    void USART1_IRQHandler()
    {
            RxData = USART1->DR;
            gDebug.Printer(RxData);
            ...
    }
            结果,一大堆错误。原因在于编译器以C的方试进行编译,然而C不认得 CDebug.h 文件中 class 这样的C++中的关键字。

            尝试2:将 IRQHandle.c 文件重命名为 IRQHandle.cpp ,让其以C++的方式进行编译。

            结果,编译没有问题。一旦触发了中断,系统就死在 startup.s 文件中默认的中断函数中了。这个默认的中断函数为找不到用户定议的中断处理函数默认指定的。原因在于 IRQHandle.cpp 中 USART1_IRQHandler() 在用C++进行编译后会根据参数类型对函数名进行修饰,因为C++要实现重载功能。如:

           原定义函数:int  Func ( int , char * )

           C++编译后:int  Func_i_cp ( int, char* ) 

            尝试3:加 extern "C" {} 进行修饰,让编译器不修改函数名。

    #include "CDebug.h"
    
    extern "C" {
    
    void USART1_IRQHandler()
    {
            RxData = USART1->DR;
            gDebug.Printer(RxData);
            ...
    }
    void Other_IRQHandler()
    {
      ...  
    }
    ....
    
    }
            结果,OK了。分析如下:
            (1)IRQHandler.c文件重命名为IRQHandle.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。
            (2)加 extern "C" 的功能就是告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。


            所以,要在C函数调用C++的成员函数,就像方案3那么做。


    展开全文
  • 程序, 中断调用函数 在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别...
    
    

    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过把两过程结合起来,采用比较教学方法,能收到了很好的教学效果。 
    1、两过程定义与作用
        子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。
        子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点(即调用指令的下一条指令),继续执行没有处理完的主程序,这一过程叫做(主程序)调用子程序过程。
    子程序结构可简化程序,防止重复书写错误,并可节省内存空间。计算机中经常把常用的各种通用的程序段编成子程序,提供给用户使用。用户在自己编写的程序中,只要会调用这些子程序,就可大大简化用户编程的困难。 
        中断是计算机中央处理单元CPU与外设I/O交换数据的一种方式,除此方式外,还有无条件、条件(查询)、存贮器直接存取DMA和I/O通道等四种方式。由于无条件不可靠,条件效率低,DMA和I/O通道两方式硬件复杂,而中断方式CPU效率高,因此一般大多采用中断方式。
    中断概念是当计算机正在执行某一(主)程序时,收到一中断请求,如果中断响应条件成立,计算机就把正在执行的程序暂停一下,去响应处理这一请求,执行中断服务程序,处理完服务程序后,中断返回指令使计算机返回原来还没有执行完的程序断点处继续执行,这一过程称为中断过程。有了中断,计算机才能具有并行处理,实时处理和故障处理等重要功能。 
    2、两过程的联系与区别
    2.1联系
        中断与调用子程序两过程属于完全不同的概念,但它们也有不少相似之处。两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。
    正是由于这些表面上的相似处,很容易使学生把两者混淆起来,特别是把中断也看为子程序,这就大错特错了。
    2.2区别
        中断过程与调用子程序过程相似点是表面的,从本质上讲两者是完全不一样的。
    两者的根本区别主要表现在服务时间与服务对象不一样上。首先,调用子程序过程发生的时间是已知和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序,调用指令所在位置是已知和固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主程序时收到中断源提出的中断申请时,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的(软中断发生时间是固定的),也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的;其次,子程序完全为主程序服务的,两者属于主从关系,主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序两者一般是无关的,不存在谁为谁服务的问题,两者是平行关系;第三,主程序调用子程序过程完全属于软件处理过程,不需要专门的硬件电路,而中断处理系统是一个软、硬件结合系统,需要专门的硬件电路才能完成中断处理的过程;第四,子程序嵌套可实现若干级,嵌套的最多级数由计算机内存开辟的堆栈大小限制,而中断嵌套级数主要由中断优先级数来决定,一般优先级数不会很大。
    http://blog.csdn.net/douyuhua0918/article/details/7473254

    中断是嵌入式系统中重要的组成部分,但是在标准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,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。

    http://www.cnblogs.com/thammer/p/5017329.html





    展开全文
  • 第十六章:中断服务函数调用机制

    千次阅读 多人点赞 2018-01-12 21:25:06
    (初学中断,学到中断服务函数时感受到蛋蛋的惊讶,main中并没有调用但确实执行了,简直超出了我对c的理解,几番百度之后,总算有所收获!) 1首先是定性的理解:当中断触发之后会保存当前堆栈和寄存器(不清楚还有...
    (初学中断,学到中断服务函数时感受到蛋蛋的惊讶,main中并没有调用但确实执行了,简直超出了我对c的理解,几番百度之后,总算有所收获!)

    1首先是定性的理解:当中断触发之后会保存当前堆栈和寄存器(不清楚还有没有其他)的状态,然后程序跳转到中断向量(就是中断服务程序首地址)执行,执行完毕后返回之前的运行状态。

    2中断服务函数是如何写入中断:
    eg:void EXIT0_IRQHandler(void); 这个函数并不会在main中直接调用,也不会在header文件中声明接口,调用它的唯一方法是在中断触发后,从中断向量出执行该函数。那么最核心的问题是该函数如何写入中断向量处,在c文件中并没有实现这部分功能,完成这个任务的是startup文件。
    废话不说霸气上代码:
    1. ;******************** (C) COPYRIGHT 2009 STMicroelectronics ********************
    2. ;* File Name          : startup_stm32f10x_cl.s
    3. ;* Author             : MCD Application Team
    4. ;* Version            : V3.1.0
    5. ;* Date               : 06/19/2009
    6. ;* Description        : STM32F10x Connectivity line devices vector table for RVMDK 
    7. ;*                      toolchain. 
    8. ;*                      This module performs:
    9. ;*                      - Set the initial SP
    10. ;*                      - Set the initial PC == Reset_Handler
    11. ;*                      - Set the vector table entries with the exceptions ISR address
    12. ;*                      - Branches to __main in the C library (which eventually
    13. ;*                        calls main()).
    14. ;*                      After Reset the CortexM3 processor is in Thread mode,
    15. ;*                      priority is Privileged, and the Stack is set to Main.
    16. ;* <<< Use Configuration Wizard in Context Menu >>>   
    17. ;*******************************************************************************
    18. ; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
    19. ; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
    20. ; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
    21. ; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
    22. ; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
    23. ; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
    24. ;*******************************************************************************

    25. ; Amount of memory (in bytes) allocated for Stack
    26. ; Tailor this value to your application needs
    27. ; <h> Stack Configuration
    28. ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
    29. ; </h>
    30. ; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈
    31. ; 顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转C/C++标
    32. ; 准实时库的__main函数。假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000,
    33. ; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇
    34. ; 到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,
    35. ; 然后跳转__main函数,最后来到C的世界。

    36. ; DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”。开始建立的中断向量
    37. ; 表则类似于使用C语.其每一个成员都是一个函数指针,分别指向各个中断服务函数

    38. ;伪指令AREA,表示开辟一段大小为Stack_Size的内存空间作为栈,段名是STACK,可读可写。
    39. ;NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0

    40. ;常见的数据定义伪指令有如下几种:

    41. ;— DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
    42. ;— DCW (DCWU) 用于分配一片连续的半字存储单元并用指定的数据初始化。
    43. ;— DCD (DCDU) 用于分配一片连续的字存储单元并用指定的数据初始化。
    44. ;— DCFD (DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化。
    45. ;— DCFS  DCFSU) 用于为单精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化。
    46. ;— DCQ  DCQU) 用于分配一片以 8 字节为单位的连续的存储单元并用指定 的数据初始化。
    47. ;— SPACE 用于分配一片连续的存储单元
    48. ;— MAP 用于定义一个结构化的内存表首地址
    49. ;— FIELD 用于定义一个结构化的内存表的数据域
    50. ;EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用。

    51. ;;启动代码作用一般是:
    52. ;;1)堆和栈的初始化;
    53. ;2)向量表定义;
    54. ;;3)地址重映射及中断向量表的转移;
    55. ;;4)设置系统时钟频率;
    56. ;;5)中断寄存器的初始化;
    57. ;;6)进入C应用程序。


    58. ;1)堆和栈的初始化
    59. Stack_Size      EQU     0x00000400 ;栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
    60.   ;SPACE用来分配一片连续的存储区域并初始化为0.
    61.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3     ;AREA 伪指令用于定义一个代码段或数据,;定义栈,可初始为0,8字节对齐2*2*2,2的3次方
    62.   ;NOINIT:指定此数据段仅仅保留了内存单元,
    63.   ;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。
    64.   ;STACK 段名
    65.   ;ALIGN属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。
    66. Stack_Mem       SPACE   Stack_Size    ;;分配0x400个连续字节,并初始化为0
    67. __initial_sp   ;标号__initial_sp,表示栈空间顶地址。   ;汇编代码地址标号


    68. ; <h> Heap Configuration
    69. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    70. ; </h>

    71. Heap_Size       EQU     0x00000200 ;堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表

    72.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3    ;ALIGN用来指定对齐方式, 8字节对齐
    73. __heap_base     ;表示堆空间起始地址

    74. Heap_Mem        SPACE   Heap_Size
    75. __heap_limit  ;表示堆空间结束地址

    76.                 PRESERVE8 ;PRESERVE8 指令指定当前文件保持堆栈八字节对齐
    77.                 THUMB ; 告诉汇编器下面是32为的Thumb指令,如果需要汇编器将插入位以保证对齐

    78. ;2)中断向量表定义
    79. ; Vector Table Mapped to Address 0 at Reset   ;实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)

    80.                 AREA    RESET, DATA, READONLY ;定义一块数据段,只可读,段名字是RESET
    81. ;DATA属性:用于定义数据段,默认为READWRITE。指定本段为可读可写
    82.                 EXPORT  __Vectors     ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用
    83.                 EXPORT  __Vectors_End ;在程序中声明一个全局的标号__Vectors_End
    84.                 EXPORT  __Vectors_Size ;在程序中声明一个全局的标号__Vectors_Size

    85. __Vectors       DCD     __initial_sp              ; Top of Stack 第一个表项是栈顶地址
    86. ;该处物理地址值即为 __Vetors 标号所表示的值,
    87.                                         ;该地址中存储__initial_sp所表示的地址值,
    88. ;大小为一个字(32bit)
    89.                 DCD     Reset_Handler             ; Reset Handler  第二个表项是复位中断服务入口地址
    90.                 DCD     NMI_Handler               ; NMI Handler 不可屏蔽中断?
    91.                 DCD     HardFault_Handler         ; Hard Fault Handler 硬件错误处理
    92.                 DCD     MemManage_Handler         ; MPU Fault Handler 存储器错误处理
    93.                 DCD     BusFault_Handler          ; Bus Fault Handler  总线错误处理
    94.                 DCD     UsageFault_Handler        ; Usage Fault Handler 用法错误处理
    95.                 DCD     0                         ; Reserved  ; 这种形式就是保留地址,不给任何标号分配
    96.                 DCD     0                         ; Reserved
    97.                 DCD     0                         ; Reserved
    98.                 DCD     0                         ; Reserved
    99.                 DCD     SVC_Handler               ; SVCall Handler 执行系统服务调用指令(SVC)引发的异常
    100.                 DCD     DebugMon_Handler          ; Debug Monitor Handler 调试监视器(断点,数据观察点,或者是外部调试请求 
    101.                 DCD     0                         ; Reserved
    102.                 DCD     PendSV_Handler            ; PendSV Handler 为系统设备而设的“可悬挂请求” (pendable request)
    103.                 DCD     SysTick_Handler           ; SysTick Handler  系统滴答定时器

    104.                 ; External Interrupts 外设中断
    105.                 DCD     WWDG_IRQHandler            ; Window Watchdog   窗口看门狗
    106.                 DCD     PVD_IRQHandler             ; PVD through EXTI Line detect 电源电压检测(PVD)中断 
    107.                 DCD     TAMPER_IRQHandler          ; Tamper
    108.                 DCD     RTC_IRQHandler             ; RTC
    109.                 DCD     FLASH_IRQHandler           ; Flash
    110.                 DCD     RCC_IRQHandler             ; RCC
    111.                 DCD     EXTI0_IRQHandler           ; EXTI Line 0
    112.                 DCD     EXTI1_IRQHandler           ; EXTI Line 1
    113.                 DCD     EXTI2_IRQHandler           ; EXTI Line 2
    114.                 DCD     EXTI3_IRQHandler           ; EXTI Line 3
    115.                 DCD     EXTI4_IRQHandler           ; EXTI Line 4
    116.                 DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
    117.                 DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
    118.                 DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
    119.                 DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
    120.                 DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
    121.                 DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
    122.                 DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
    123.                 DCD     ADC1_2_IRQHandler          ; ADC1 and ADC2
    124.                 DCD     CAN1_TX_IRQHandler         ; CAN1 TX
    125.                 DCD     CAN1_RX0_IRQHandler        ; CAN1 RX0
    126.                 DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
    127.                 DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
    128.                 DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
    129.                 DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
    130.                 DCD     TIM1_UP_IRQHandler         ; TIM1 Update
    131.                 DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
    132.                 DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
    133.                 DCD     TIM2_IRQHandler            ; TIM2
    134.                 DCD     TIM3_IRQHandler            ; TIM3
    135.                 DCD     TIM4_IRQHandler            ; TIM4
    136.                 DCD     I2C1_EV_IRQHandler         ; I2C1 Event
    137.                 DCD     I2C1_ER_IRQHandler         ; I2C1 Error
    138.                 DCD     I2C2_EV_IRQHandler         ; I2C2 Event
    139.                 DCD     I2C2_ER_IRQHandler         ; I2C1 Error
    140.                 DCD     SPI1_IRQHandler            ; SPI1
    141.                 DCD     SPI2_IRQHandler            ; SPI2
    142.                 DCD     USART1_IRQHandler          ; USART1
    143.                 DCD     USART2_IRQHandler          ; USART2
    144.                 DCD     USART3_IRQHandler          ; USART3
    145.                 DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
    146.                 DCD     RTCAlarm_IRQHandler        ; RTC alarm through EXTI line
    147.                 DCD     OTG_FS_WKUP_IRQHandler     ; USB OTG FS Wakeup through EXTI line
    148.                 DCD     0                          ; Reserved
    149.                 DCD     0                          ; Reserved
    150.                 DCD     0                          ; Reserved
    151.                 DCD     0                          ; Reserved
    152.                 DCD     0                          ; Reserved
    153.                 DCD     0                          ; Reserved
    154.                 DCD     0                          ; Reserved
    155.                 DCD     TIM5_IRQHandler            ; TIM5
    156.                 DCD     SPI3_IRQHandler            ; SPI3
    157.                 DCD     UART4_IRQHandler           ; UART4
    158.                 DCD     UART5_IRQHandler           ; UART5
    159.                 DCD     TIM6_IRQHandler            ; TIM6
    160.                 DCD     TIM7_IRQHandler            ; TIM7
    161.                 DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
    162.                 DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
    163.                 DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
    164.                 DCD     DMA2_Channel4_IRQHandler   ; DMA2 Channel4
    165.                 DCD     DMA2_Channel5_IRQHandler   ; DMA2 Channel5
    166.                 DCD     ETH_IRQHandler             ; Ethernet
    167.                 DCD     ETH_WKUP_IRQHandler        ; Ethernet Wakeup through EXTI line
    168.                 DCD     CAN2_TX_IRQHandler         ; CAN2 TX
    169.                 DCD     CAN2_RX0_IRQHandler        ; CAN2 RX0
    170.                 DCD     CAN2_RX1_IRQHandler        ; CAN2 RX1
    171.                 DCD     CAN2_SCE_IRQHandler        ; CAN2 SCE
    172.                 DCD     OTG_FS_IRQHandler          ; USB OTG FS
    173. __Vectors_End   ; 结束

    174. __Vectors_Size  EQU  __Vectors_End - __Vectors  ;得到向量表的大小,304个字节也就是0x130个字节
    175. ;3)地址重映射及中断向量表的转移;
    176.                 AREA    |.text|, CODE, READONLY   ;定义一个代码段,可读,段名字是.text  段名若以数字开头,则该段名需用"|"括起来,如|1_test|。
    177. ;定义只读数据段,实际上是在CODE区,如果在FLASH区起动,则 中断向量起始地址为0X8000000
    178. ;;CODE属性:用于定义代码段,默认为READONLY
    179. ; Reset handler routine
    180. Reset_Handler    PROC ;;标记一个函数的开始;利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰
    181.                  EXPORT  Reset_Handler             [WEAK]  ;在外部没有定义该符号时导出该符号Reset_Handler  
    182. ;EXPORT伪指令用于在程序中声明一个全局的标号
    183.           IMPORT  __main   ;IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义
    184.                  LDR     R0, =__main ;__main为运行时库提供的函数;完成堆栈,堆的初始话等工作,会调用下面定义的__user_initial_stackheap
    185.                  BX      R0   ;跳到__main,进入C的世界   
    186.                  ENDP

    187. ; Dummy Exception Handlers (infinite loops which can be modified)
    188. ;虚拟异常处理器(无限循环可以修改了)

    189. NMI_Handler     PROC ;PROC表示汇编函数的开始
    190.                 EXPORT  NMI_Handler                [WEAK]   ;WEAK声明其他的同名标号优先于该标号被引用,就是说如果外面声明了的话,
    191.                 B       .  ;会调用外面的
    192.                 ENDP
    193. HardFault_Handler\
    194.                 PROC  ;PROC表示汇编函数的开始
    195.                 EXPORT  HardFault_Handler          [WEAK]  ;\换行的意思
    196.                 B       .
    197.                 ENDP
    198. MemManage_Handler\
    199.                 PROC ;PROC表示汇编函数的开始
    200.                 EXPORT  MemManage_Handler          [WEAK]
    201.                 B       .
    202.                 ENDP
    203. BusFault_Handler\
    204.                 PROC   ;PROC表示汇编函数的开始
    205.                 EXPORT  BusFault_Handler           [WEAK]
    206.                 B       .
    207.                 ENDP
    208. UsageFault_Handler\
    209.                 PROC
    210.                 EXPORT  UsageFault_Handler         [WEAK]
    211.                 B       .
    212.                 ENDP
    213. SVC_Handler     PROC    ;PROC表示汇编函数的开始
    214.                 EXPORT  SVC_Handler                [WEAK]
    215.                 B       .
    216.                 ENDP
    217. DebugMon_Handler\
    218.                 PROC ;PROC表示汇编函数的开始
    219.                 EXPORT  DebugMon_Handler           [WEAK]
    220.                 B       .
    221.                 ENDP
    222. PendSV_Handler  PROC
    223.                 EXPORT  PendSV_Handler             [WEAK]
    224.                 B       .
    225.                 ENDP
    226. SysTick_Handler PROC   ;PROC表示汇编函数的开始
    227.                 EXPORT  SysTick_Handler            [WEAK]
    228.                 B       .
    229.                 ENDP

    230. Default_Handler PROC

    231.                 EXPORT  WWDG_IRQHandler            [WEAK]
    232.                 EXPORT  PVD_IRQHandler             [WEAK]
    233.                 EXPORT  TAMPER_IRQHandler          [WEAK]
    234.                 EXPORT  RTC_IRQHandler             [WEAK]
    235.                 EXPORT  FLASH_IRQHandler           [WEAK]
    236.                 EXPORT  RCC_IRQHandler             [WEAK]
    237.                 EXPORT  EXTI0_IRQHandler           [WEAK]
    238.                 EXPORT  EXTI1_IRQHandler           [WEAK]
    239.                 EXPORT  EXTI2_IRQHandler           [WEAK]
    240.                 EXPORT  EXTI3_IRQHandler           [WEAK]
    241.                 EXPORT  EXTI4_IRQHandler           [WEAK]
    242.                 EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
    243.                 EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
    244.                 EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
    245.                 EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
    246.                 EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
    247.                 EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
    248.                 EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
    249.                 EXPORT  ADC1_2_IRQHandler          [WEAK]
    250.                 EXPORT  CAN1_TX_IRQHandler         [WEAK]
    251.                 EXPORT  CAN1_RX0_IRQHandler        [WEAK]
    252.                 EXPORT  CAN1_RX1_IRQHandler        [WEAK]
    253.                 EXPORT  CAN1_SCE_IRQHandler        [WEAK]
    254.                 EXPORT  EXTI9_5_IRQHandler         [WEAK]
    255.                 EXPORT  TIM1_BRK_IRQHandler        [WEAK]
    256.                 EXPORT  TIM1_UP_IRQHandler         [WEAK]
    257.                 EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
    258.                 EXPORT  TIM1_CC_IRQHandler         [WEAK]
    259.                 EXPORT  TIM2_IRQHandler            [WEAK]
    260.                 EXPORT  TIM3_IRQHandler            [WEAK]
    261.                 EXPORT  TIM4_IRQHandler            [WEAK]
    262.                 EXPORT  I2C1_EV_IRQHandler         [WEAK]
    263.                 EXPORT  I2C1_ER_IRQHandler         [WEAK]
    264.                 EXPORT  I2C2_EV_IRQHandler         [WEAK]
    265.                 EXPORT  I2C2_ER_IRQHandler         [WEAK]
    266.                 EXPORT  SPI1_IRQHandler            [WEAK]
    267.                 EXPORT  SPI2_IRQHandler            [WEAK]
    268.                 EXPORT  USART1_IRQHandler          [WEAK]
    269.                 EXPORT  USART2_IRQHandler          [WEAK]
    270.                 EXPORT  USART3_IRQHandler          [WEAK]
    271.                 EXPORT  EXTI15_10_IRQHandler       [WEAK]
    272.                 EXPORT  RTCAlarm_IRQHandler        [WEAK]
    273.                 EXPORT  OTG_FS_WKUP_IRQHandler     [WEAK]
    274.                 EXPORT  TIM5_IRQHandler            [WEAK]
    275.                 EXPORT  SPI3_IRQHandler            [WEAK]
    276.                 EXPORT  UART4_IRQHandler           [WEAK]
    277.                 EXPORT  UART5_IRQHandler           [WEAK]
    278.                 EXPORT  TIM6_IRQHandler            [WEAK]
    279.                 EXPORT  TIM7_IRQHandler            [WEAK]
    280.                 EXPORT  DMA2_Channel1_IRQHandler   [WEAK]
    281.                 EXPORT  DMA2_Channel2_IRQHandler   [WEAK]
    282.                 EXPORT  DMA2_Channel3_IRQHandler   [WEAK]
    283.                 EXPORT  DMA2_Channel4_IRQHandler   [WEAK]
    284.                 EXPORT  DMA2_Channel5_IRQHandler   [WEAK]
    285.                 EXPORT  ETH_IRQHandler             [WEAK]
    286.                 EXPORT  ETH_WKUP_IRQHandler        [WEAK]
    287.                 EXPORT  CAN2_TX_IRQHandler         [WEAK]
    288.                 EXPORT  CAN2_RX0_IRQHandler        [WEAK]
    289.                 EXPORT  CAN2_RX1_IRQHandler        [WEAK]
    290.                 EXPORT  CAN2_SCE_IRQHandler        [WEAK]
    291.                 EXPORT  OTG_FS_IRQHandler          [WEAK]

    292. WWDG_IRQHandler
    293. PVD_IRQHandler
    294. TAMPER_IRQHandler
    295. RTC_IRQHandler
    296. FLASH_IRQHandler
    297. RCC_IRQHandler
    298. EXTI0_IRQHandler
    299. EXTI1_IRQHandler
    300. EXTI2_IRQHandler
    301. EXTI3_IRQHandler
    302. EXTI4_IRQHandler
    303. DMA1_Channel1_IRQHandler
    304. DMA1_Channel2_IRQHandler
    305. DMA1_Channel3_IRQHandler
    306. DMA1_Channel4_IRQHandler
    307. DMA1_Channel5_IRQHandler
    308. DMA1_Channel6_IRQHandler
    309. DMA1_Channel7_IRQHandler
    310. ADC1_2_IRQHandler
    311. CAN1_TX_IRQHandler
    312. CAN1_RX0_IRQHandler
    313. CAN1_RX1_IRQHandler
    314. CAN1_SCE_IRQHandler
    315. EXTI9_5_IRQHandler
    316. TIM1_BRK_IRQHandler
    317. TIM1_UP_IRQHandler
    318. TIM1_TRG_COM_IRQHandler
    319. TIM1_CC_IRQHandler
    320. TIM2_IRQHandler
    321. TIM3_IRQHandler
    322. TIM4_IRQHandler
    323. I2C1_EV_IRQHandler
    324. I2C1_ER_IRQHandler
    325. I2C2_EV_IRQHandler
    326. I2C2_ER_IRQHandler
    327. SPI1_IRQHandler
    328. SPI2_IRQHandler
    329. USART1_IRQHandler
    330. USART2_IRQHandler
    331. USART3_IRQHandler
    332. EXTI15_10_IRQHandler
    333. RTCAlarm_IRQHandler
    334. OTG_FS_WKUP_IRQHandler
    335. TIM5_IRQHandler
    336. SPI3_IRQHandler
    337. UART4_IRQHandler
    338. UART5_IRQHandler
    339. TIM6_IRQHandler
    340. TIM7_IRQHandler
    341. DMA2_Channel1_IRQHandler
    342. DMA2_Channel2_IRQHandler
    343. DMA2_Channel3_IRQHandler
    344. DMA2_Channel4_IRQHandler
    345. DMA2_Channel5_IRQHandler
    346. ETH_IRQHandler
    347. ETH_WKUP_IRQHandler
    348. CAN2_TX_IRQHandler
    349. CAN2_RX0_IRQHandler
    350. CAN2_RX1_IRQHandler
    351. CAN2_SCE_IRQHandler
    352. OTG_FS_IRQHandler

    353.                 B       .

    354.                 ENDP

    355.                 ALIGN

    356. ;*******************************************************************************
    357. ; User Stack and Heap initialization(4)堆和栈的初始化
    358. ;*******************************************************************************
    359.                  IF      :DEF:__MICROLIB  ;判断是否使用DEF:__MICROLIB(micro lib)
    360.                 
    361.                  EXPORT  __initial_sp      ;使用的话则将栈顶地址,堆始末地址赋予全局属
    362.                  EXPORT  __heap_base  ;使外部程序可以使用

    363.                  EXPORT  __heap_limit
    364.                 
    365.                  ELSE    ;如果使用默认C库运行时
    366.                 
    367.                  IMPORT  __use_two_region_memory  ;定义全局标号__use_two_region_memory
    368.                  EXPORT  __user_initial_stackheap   ;声明全局标号__user_initial_stackheap,这样外程序也可调用此标号
    369.                     ;则进行堆栈和堆的赋值,在__main函数执行过程中调用

    370. __user_initial_stackheap   ;标号__user_initial_stackheap,表示用户堆栈初始化程序入口

    371.                  LDR     R0, =  Heap_Mem     ;保存堆始地址
    372.                  LDR     R1, =(Stack_Mem + Stack_Size) ;保存栈的大小
    373.                  LDR     R2, = (Heap_Mem +  Heap_Size) ;保存堆的大小
    374.                  LDR     R3, = Stack_Mem  ;保存栈顶指针
    375.                  BX      LR

    376.                  ALIGN   ;ALIGN属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方

    377.                  ENDIF

    378.                  END

    379. ;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE*****
    复制代码
    注释相当详细,对于中断部分主要是声明了EXIT0_IRQHander等标号(函数名也算),同时设定标号为[weak]即若存在其他定义的同名标号(在这里是在c文件中用户自定的中断服务函数)就优先调用其他定义的标号。
    展开全文
  • 中断函数调用的区别

    千次阅读 2015-09-01 11:06:35
    中断函数调用的区别   转载▼ 标签:  中断   函数 分类: C/C++ 中断: 1)何时发生可能是不可预料的;CPU正在处理某件事情的时候,外部发生的某一事件(如一个...
  • 我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2:
  • 写了一个按键中断服务程序,按下key1pwm输出,按下key2关闭pwm输出,在不加延时的时候key2可以关闭key1打开的pwm,但是加了延时之后key2就不起作用了,是因为在中断服务函数中加了延时导致key2无法响应了吗,即是在...
  • 中断函数调用的区别

    千次阅读 2017-08-04 00:17:00
    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...
  • 关于C51的中断函数要注意的几个问题(高手绕行)  最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖子,希望对小虾米有所帮助,如 有错误之处,还请指正,就当抛砖引玉吧! ...
  • 用了好久的FreeRTOS以前只是知道,如果在中断服务程序中调用某一些FreeRTOS的API函数时需要注意,如果有ISR版本的一定要调用,末尾带ISR的函数,并且要调用系统的API函数中断服务程序的中断优先级不能高于配置宏...
  • 定义全局变量: #ifdef TPD_ESD_PROTECT #define TPD_ESD_CHECK_CIRCLE ...中断函数: static void gsl_esd_check_func(struct work *work) { ************************** }
  • 中断函数

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

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

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

    万次阅读 2018-10-17 16:59:00
    probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数 probe函数调用后,系统就调用platform设备的probe函数完成驱动注册最后工作。下面是probe被调用前的一些流程。 device一般是先于...
  • 浅谈C语言函数调用与系统调用

    千次阅读 2019-11-12 09:55:50
    1. 函数调用和系统调用概述 1.1 定性的去区分函数调用和系统调用 很多初学C语言的同学,亦或者开发中很少接触系统底层的同学可能会认为函数调用以及系统调用是一回事。因为在应用程序,两者都被抽象成接口去给应用...
  • 如果在系统调用或者库函数被阻塞的时候调用了信号处理函数,那么库函数和系统调用将会表现两种情况中的一种:  1、在信号处理函数返回的时候自动重启。  2、调用失败,errno被设置为EINTR。  具体表现为那一种...
  • 中断函数和中断处理函数

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

    万次阅读 多人点赞 2018-07-19 15:49:02
    一开始接触到的一般都是软中断,软中断就是中断程序包含在主程序里面,当中断条件满足时,直接跳转到中断函数执行,然后再返回。就相当于判断语句。   刚开始接触STM32的小伙伴可能会发现main...
  • 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,...2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数
  • STM32共用中断和共用中断函数的判断

    千次阅读 2016-12-09 21:21:35
    STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢?使用 EXTI_GetITStatus()来查询哪根线产生了中断。 比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否...
  • 函数调用过程

    万次阅读 多人点赞 2018-01-31 09:21:19
    今天突然看到有人私信我说一直没写函数调用过程(栈帧的形成和销毁过程)这篇博文,赶紧补上。 刚看的栈帧内容时,我很迷惑,我觉得栈帧创建和销毁很麻烦,几句话根本说不完,而且我好像描述不清楚他的过程,所以...
  • stm32中断函数改变全局变量值

    千次阅读 2017-02-22 11:39:00
     当检测到有按键按下时,实现PA.0led闪亮,函数肯定不能在中断服务程序里写,就想着在进入中断函数后改变变量biaozhi的值(0变成1),然后main中while循环一直检测biaozhi的值若为1,则调用函数;  这里只说下...
  • 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 ...
  • 作为在中断调用FreeRTOS系统的API函数的参考,disp_str()是显示屏的显示函数会将传入的字符串进行显示。void TIM5_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,108
精华内容 121,643
关键字:

中断函数是无需调用的函数