微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 中断服务函数的调用机制

中断服务函数的调用机制

时间:10-02 整理:3721RD 点击:
(初学中断,学到中断服务函数时感受到蛋蛋的惊讶,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文件中用户自定的中断服务函数)就优先调用其他定义的标号。

讲到这里就差不多是整个中断机制了,唯有一点楼组也没明白:DCD定义的数据的地址是怎么精确到中断向量上的,希望各位指点!

赞赞赞赞。

赞一个,mark,先留着,后面再来看

mark一下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top