Cortex M架构与Cortex A架构中断系统的区别

2025-05-29 0 89

Cortex M架构与Cortex A架构中断系统的区别

Cortex M架构,典型就是STM32系列,比如STM32F103(Cortex M3)。

Cortex A架构,可以细分为Cortex A7,Cortex A8,Cortex A9,Cortex A15等,比如NXP的IMX6系列,TI的AM335X系列等。

Cortex M主要用在微控制器领域,Cortex R主要用在对实时性要求比较高的领域,Cortex A主要用在高端应用领域。

Cortex M架构与Cortex A架构中断系统的区别

Cortex M架构

在Cortex M架构中,比如STM32F103,中断向量表是写在启动文件当中,一般为startup_stm32f10x_hd.s或者startup_stm32f10x_md.s中,.s结尾为汇编文件,这个汇编语言写的启动文件的作用,是在板子上电后为C语言代码的运行做好初始化工作,比如设置堆栈大小,设置中断向量表等,然后再跳转到main函数去执行你的C代码。文件内容如下(部分省略):

设置栈大小

  1. Stack_SizeEQU0x00000400

设置堆大小

  1. Heap_SizeEQU0x00000200

; Vector Table Mapped to Address 0 at Reset后面很多 DCD 的就是STM32的中断向量表,系统所有可用的中断都写在这里,包括外部中断、定时器中断、DMA中断、IIC中断、串口中断等。

  1. Stack_SizeEQU0x00000400
  2. AREASTACK,NOINIT,READWRITE,ALIGN=3
  3. Stack_MemSPACEStack_Size
  4. __initial_sp
  5. ;<h>HeapConfiguration
  6. ;<o>HeapSize(inBytes)<0x0-0xFFFFFFFF:8>
  7. ;</h>
  8. Heap_SizeEQU0x00000200
  9. AREAHEAP,NOINIT,READWRITE,ALIGN=3
  10. __heap_base
  11. Heap_MemSPACEHeap_Size
  12. __heap_limit
  13. PRESERVE8
  14. THUMB
  15. ;VectorTableMappedtoAddress0atReset
  16. AREARESET,DATA,READONLY
  17. EXPORT__Vectors
  18. EXPORT__Vectors_End
  19. EXPORT__Vectors_Size
  20. __VectorsDCD__initial_sp;TopofStack
  21. DCDReset_Handler;ResetHandler
  22. DCDNMI_Handler;NMIHandler
  23. DCDHardFault_Handler;HardFaultHandler
  24. DCDMemManage_Handler;MPUFaultHandler
  25. DCDBusFault_Handler;BusFaultHandler
  26. DCDUsageFault_Handler;UsageFaultHandler
  27. DCD0;Reserved
  28. DCD0;Reserved
  29. DCD0;Reserved
  30. DCD0;Reserved
  31. DCDSVC_Handler;SVCallHandler
  32. DCDDebugMon_Handler;DebugMonitorHandler
  33. DCD0;Reserved
  34. DCDPendSV_Handler;PendSVHandler
  35. DCDSysTick_Handler;SysTickHandler
  36. ;ExternalInterrupts
  37. DCDWWDG_IRQHandler;WindowWatchdog
  38. DCDPVD_IRQHandler;PVDthroughEXTILinedetect
  39. DCDTAMPER_IRQHandler;Tamper
  40. DCDRTC_IRQHandler;RTC
  41. DCDFLASH_IRQHandler;Flash
  42. DCDRCC_IRQHandler;RCC
  43. DCDEXTI0_IRQHandler;EXTILine0
  44. DCDEXTI1_IRQHandler;EXTILine1
  45. DCDEXTI2_IRQHandler;EXTILine2
  46. DCDEXTI3_IRQHandler;EXTILine3
  47. DCDEXTI4_IRQHandler;EXTILine4
  48. DCDDMA1_Channel1_IRQHandler;DMA1Channel1
  49. DCDDMA1_Channel2_IRQHandler;DMA1Channel2
  50. DCDDMA1_Channel3_IRQHandler;DMA1Channel3
  51. DCDDMA1_Channel4_IRQHandler;DMA1Channel4
  52. DCDDMA1_Channel5_IRQHandler;DMA1Channel5
  53. DCDDMA1_Channel6_IRQHandler;DMA1Channel6
  54. DCDDMA1_Channel7_IRQHandler;DMA1Channel7
  55. DCDADC1_2_IRQHandler;ADC1&ADC2
  56. DCDUSB_HP_CAN1_TX_IRQHandler;USBHighPriorityorCAN1TX
  57. DCDUSB_LP_CAN1_RX0_IRQHandler;USBLowPriorityorCAN1RX0
  58. DCDCAN1_RX1_IRQHandler;CAN1RX1
  59. DCDCAN1_SCE_IRQHandler;CAN1SCE
  60. DCDEXTI9_5_IRQHandler;EXTILine9..5
  61. DCDTIM1_BRK_IRQHandler;TIM1Break
  62. DCDTIM1_UP_IRQHandler;TIM1Update
  63. DCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutation
  64. DCDTIM1_CC_IRQHandler;TIM1CaptureCompare
  65. DCDTIM2_IRQHandler;TIM2
  66. DCDTIM3_IRQHandler;TIM3
  67. DCDTIM4_IRQHandler;TIM4
  68. DCDI2C1_EV_IRQHandler;I2C1Event
  69. DCDI2C1_ER_IRQHandler;I2C1Error
  70. DCDI2C2_EV_IRQHandler;I2C2Event
  71. DCDI2C2_ER_IRQHandler;I2C2Error
  72. DCDSPI1_IRQHandler;SPI1
  73. DCDSPI2_IRQHandler;SPI2
  74. DCDUSART1_IRQHandler;USART1
  75. DCDUSART2_IRQHandler;USART2
  76. DCDUSART3_IRQHandler;USART3
  77. DCDEXTI15_10_IRQHandler;EXTILine15..10
  78. DCDRTCAlarm_IRQHandler;RTCAlarmthroughEXTILine
  79. DCDUSBWakeUp_IRQHandler;USBWakeupfromsuspend
  80. DCDTIM8_BRK_IRQHandler;TIM8Break
  81. DCDTIM8_UP_IRQHandler;TIM8Update
  82. DCDTIM8_TRG_COM_IRQHandler;TIM8TriggerandCommutation
  83. DCDTIM8_CC_IRQHandler;TIM8CaptureCompare
  84. DCDADC3_IRQHandler;ADC3
  85. DCDFSMC_IRQHandler;FSMC
  86. DCDSDIO_IRQHandler;SDIO
  87. DCDTIM5_IRQHandler;TIM5
  88. DCDSPI3_IRQHandler;SPI3
  89. DCDUART4_IRQHandler;UART4
  90. DCDUART5_IRQHandler;UART5
  91. DCDTIM6_IRQHandler;TIM6
  92. DCDTIM7_IRQHandler;TIM7
  93. DCDDMA2_Channel1_IRQHandler;DMA2Channel1
  94. DCDDMA2_Channel2_IRQHandler;DMA2Channel2
  95. DCDDMA2_Channel3_IRQHandler;DMA2Channel3
  96. DCDDMA2_Channel4_5_IRQHandler;DMA2Channel4&Channel5
  97. __Vectors_End
  98. __Vectors_SizeEQU__Vectors_End-__Vectors
  99. AREA|.text|,CODE,READONLY

其中“__initial_sp”就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数Reset_Handler 的入口地址,依次类推,直到最后一个中断服务函数DMA2_Channel4_5_IRQHandler 的入口地址,这样 STM32F103 的中断向量表就建好了。

中断使用方法:

  1. 1、配置中断向量表(ST提供)。
  2. 2、配置NVIC(内嵌向量中断控制器)。
  3. 3、中断使能。
  4. 4、中断服务函数。

先配置好中断向量表(自动),然后配置一下IO口,配置NVIC来管理中断,使能中断,最后编写中断服务函数,中断服务函数里是我们真正想做的事情。

这个思路也适合于Cortex A架构,只是中断系统不同,中断管理器也不同,STM32中的中断管理器是NVIC,Cortex A架构的中断管理器是GIC控制器。GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器。

Cortex A架构

下表为Cortex A架构中断向量表,这个表也是写在.s结尾的启动文件当中,为C语言代码的运行提供前期的初始化工作,只有做好了初始化,你的C语言代码才会运行,启动文件中做好初始化以后,会跳转到你的main函数。

可以发现比STM32的中断少了很多,只有八个中断,还有一个未使用。其中我们最常用的中断是复位中断和 IRQ 中断。

Cortex M架构与Cortex A架构中断系统的区别

实际上Cortex A架构是不可能只有这么少的中断,Cortex-A 内核 CPU 的所有外部中断都属于IQR 中断,当任意一个外部中断发生的时候都会触发 IRQ 中断。在 IRQ 中断服务函数里面就可以读取指定的寄存器来判断发生的具体是什么中断,进而根据具体的中断做出相应的处理,如下图:

Cortex M架构与Cortex A架构中断系统的区别

中断解释:

1、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。

2、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。

3、软中断(Software Interrupt,SWI),由 SWI 指令引起的中断,Linux 的系统调用会用 SWI指令来引起软中断,通过软中断来陷入到内核空间。

4、指令预取中止中断(Prefetch Abort),预取指令的出错的时候会产生此中断。

5、数据访问中止中断(Data Abort),访问数据出错的时候会产生此中断。

6、IRQ 中断(IRQ Interrupt),外部中断,芯片内部的外设中断都会引起此中断的发生。

7、FIQ 中断(FIQ Interrupt),快速中断,如果需要快速处理中断的话就可以使用此中。

存放地址

中断向量表都是链接到代码的最前面,比如一般 ARM 处理器都是从地址 0X0000 0000 开始执行指令的,那么中断向量表就是从0X0000 0000 开始存放的。

在STM32中,一般代码是下载到 0X0800 0000开始的存储区域中。因此中断向量表是存放到 0X0800 0000 地址处的,而不是 0X00000000。这种是通过中断向量表偏移实现的。

原文地址:https://mp.weixin.qq.com/s/PENYZoTIKYHOhCdCQhCd7A

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Cortex M架构与Cortex A架构中断系统的区别 https://www.kuaiidc.com/92418.html

相关文章

发表评论
暂无评论