服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - Cortex M架构与Cortex A架构中断系统的区别

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

2021-04-21 00:03嵌入式Linux系统开发Jasonangel 编程技术

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架构,典型就是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_Size      EQU     0x00000400 

设置堆大小

  1. Heap_Size       EQU     0x00000200 

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

  1. Stack_Size      EQU     0x00000400 
  2.  
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3 
  4. Stack_Mem       SPACE   Stack_Size 
  5. __initial_sp 
  6.                                                    
  7. ; <h> Heap Configuration 
  8. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 
  9. ; </h> 
  10.  
  11. Heap_Size       EQU     0x00000200 
  12.  
  13.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3 
  14. __heap_base 
  15. Heap_Mem        SPACE   Heap_Size 
  16. __heap_limit 
  17.  
  18.                 PRESERVE8 
  19.                 THUMB 
  20.  
  21.  
  22. ; Vector Table Mapped to Address 0 at Reset 
  23.                 AREA    RESET, DATA, READONLY 
  24.                 EXPORT  __Vectors 
  25.                 EXPORT  __Vectors_End 
  26.                 EXPORT  __Vectors_Size 
  27.  
  28. __Vectors       DCD     __initial_sp               ; Top of Stack 
  29.                 DCD     Reset_Handler              ; Reset Handler 
  30.                 DCD     NMI_Handler                ; NMI Handler 
  31.                 DCD     HardFault_Handler          ; Hard Fault Handler 
  32.                 DCD     MemManage_Handler          ; MPU Fault Handler 
  33.                 DCD     BusFault_Handler           ; Bus Fault Handler 
  34.                 DCD     UsageFault_Handler         ; Usage Fault Handler 
  35.                 DCD     0                          ; Reserved 
  36.                 DCD     0                          ; Reserved 
  37.                 DCD     0                          ; Reserved 
  38.                 DCD     0                          ; Reserved 
  39.                 DCD     SVC_Handler                ; SVCall Handler 
  40.                 DCD     DebugMon_Handler           ; Debug Monitor Handler 
  41.                 DCD     0                          ; Reserved 
  42.                 DCD     PendSV_Handler             ; PendSV Handler 
  43.                 DCD     SysTick_Handler            ; SysTick Handler 
  44.  
  45.                 ; External Interrupts 
  46.                 DCD     WWDG_IRQHandler            ; Window Watchdog 
  47.                 DCD     PVD_IRQHandler             ; PVD through EXTI Line detect 
  48.                 DCD     TAMPER_IRQHandler          ; Tamper 
  49.                 DCD     RTC_IRQHandler             ; RTC 
  50.                 DCD     FLASH_IRQHandler           ; Flash 
  51.                 DCD     RCC_IRQHandler             ; RCC 
  52.                 DCD     EXTI0_IRQHandler           ; EXTI Line 0 
  53.                 DCD     EXTI1_IRQHandler           ; EXTI Line 1 
  54.                 DCD     EXTI2_IRQHandler           ; EXTI Line 2 
  55.                 DCD     EXTI3_IRQHandler           ; EXTI Line 3 
  56.                 DCD     EXTI4_IRQHandler           ; EXTI Line 4 
  57.                 DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1 
  58.                 DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2 
  59.                 DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3 
  60.                 DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4 
  61.                 DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5 
  62.                 DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6 
  63.                 DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7 
  64.                 DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2 
  65.                 DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX 
  66.                 DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0 
  67.                 DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1 
  68.                 DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE 
  69.                 DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5 
  70.                 DCD     TIM1_BRK_IRQHandler        ; TIM1 Break 
  71.                 DCD     TIM1_UP_IRQHandler         ; TIM1 Update 
  72.                 DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation 
  73.                 DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare 
  74.                 DCD     TIM2_IRQHandler            ; TIM2 
  75.                 DCD     TIM3_IRQHandler            ; TIM3 
  76.                 DCD     TIM4_IRQHandler            ; TIM4 
  77.                 DCD     I2C1_EV_IRQHandler         ; I2C1 Event 
  78.                 DCD     I2C1_ER_IRQHandler         ; I2C1 Error 
  79.                 DCD     I2C2_EV_IRQHandler         ; I2C2 Event 
  80.                 DCD     I2C2_ER_IRQHandler         ; I2C2 Error 
  81.                 DCD     SPI1_IRQHandler            ; SPI1 
  82.                 DCD     SPI2_IRQHandler            ; SPI2 
  83.                 DCD     USART1_IRQHandler          ; USART1 
  84.                 DCD     USART2_IRQHandler          ; USART2 
  85.                 DCD     USART3_IRQHandler          ; USART3 
  86.                 DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10 
  87.                 DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line 
  88.                 DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend 
  89.                 DCD     TIM8_BRK_IRQHandler        ; TIM8 Break 
  90.                 DCD     TIM8_UP_IRQHandler         ; TIM8 Update 
  91.                 DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation 
  92.                 DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare 
  93.                 DCD     ADC3_IRQHandler            ; ADC3 
  94.                 DCD     FSMC_IRQHandler            ; FSMC 
  95.                 DCD     SDIO_IRQHandler            ; SDIO 
  96.                 DCD     TIM5_IRQHandler            ; TIM5 
  97.                 DCD     SPI3_IRQHandler            ; SPI3 
  98.                 DCD     UART4_IRQHandler           ; UART4 
  99.                 DCD     UART5_IRQHandler           ; UART5 
  100.                 DCD     TIM6_IRQHandler            ; TIM6 
  101.                 DCD     TIM7_IRQHandler            ; TIM7 
  102.                 DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1 
  103.                 DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2 
  104.                 DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3 
  105.                 DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 
  106. __Vectors_End 
  107.  
  108. __Vectors_Size  EQU  __Vectors_End - __Vectors 
  109.  
  110.                 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

延伸 · 阅读

精彩推荐