Cortex M架構(gòu),典型就是STM32系列,比如STM32F103(Cortex M3)。
Cortex A架構(gòu),可以細分為Cortex A7,Cortex A8,Cortex A9,Cortex A15等,比如NXP的IMX6系列,TI的AM335X系列等。
Cortex M主要用在微控制器領(lǐng)域,Cortex R主要用在對實時性要求比較高的領(lǐng)域,Cortex A主要用在高端應(yīng)用領(lǐng)域。
Cortex M架構(gòu)
在Cortex M架構(gòu)中,比如STM32F103,中斷向量表是寫在啟動文件當中,一般為startup_stm32f10x_hd.s或者startup_stm32f10x_md.s中,.s結(jié)尾為匯編文件,這個匯編語言寫的啟動文件的作用,是在板子上電后為C語言代碼的運行做好初始化工作,比如設(shè)置堆棧大小,設(shè)置中斷向量表等,然后再跳轉(zhuǎn)到main函數(shù)去執(zhí)行你的C代碼。文件內(nèi)容如下(部分省略):
設(shè)置棧大小
Stack_SizeEQU0x00000400
設(shè)置堆大小
Heap_SizeEQU0x00000200
; Vector Table Mapped to Address 0 at Reset后面很多 DCD 的就是STM32的中斷向量表,系統(tǒng)所有可用的中斷都寫在這里,包括外部中斷、定時器中斷、DMA中斷、IIC中斷、串口中斷等。
Stack_SizeEQU0x00000400 AREASTACK,NOINIT,READWRITE,ALIGN=3 Stack_MemSPACEStack_Size __initial_sp ;HeapConfiguration ;HeapSize(inBytes)<0x0-0xFFFFFFFF:8> ; Heap_SizeEQU0x00000200 AREAHEAP,NOINIT,READWRITE,ALIGN=3 __heap_base Heap_MemSPACEHeap_Size __heap_limit PRESERVE8 THUMB ;VectorTableMappedtoAddress0atReset AREARESET,DATA,READONLY EXPORT__Vectors EXPORT__Vectors_End EXPORT__Vectors_Size __VectorsDCD__initial_sp;TopofStack DCDReset_Handler;ResetHandler DCDNMI_Handler;NMIHandler DCDHardFault_Handler;HardFaultHandler DCDMemManage_Handler;MPUFaultHandler DCDBusFault_Handler;BusFaultHandler DCDUsageFault_Handler;UsageFaultHandler DCD0;Reserved DCD0;Reserved DCD0;Reserved DCD0;Reserved DCDSVC_Handler;SVCallHandler DCDDebugMon_Handler;DebugMonitorHandler DCD0;Reserved DCDPendSV_Handler;PendSVHandler DCDSysTick_Handler;SysTickHandler ;ExternalInterrupts DCDWWDG_IRQHandler;WindowWatchdog DCDPVD_IRQHandler;PVDthroughEXTILinedetect DCDTAMPER_IRQHandler;Tamper DCDRTC_IRQHandler;RTC DCDFLASH_IRQHandler;Flash DCDRCC_IRQHandler;RCC DCDEXTI0_IRQHandler;EXTILine0 DCDEXTI1_IRQHandler;EXTILine1 DCDEXTI2_IRQHandler;EXTILine2 DCDEXTI3_IRQHandler;EXTILine3 DCDEXTI4_IRQHandler;EXTILine4 DCDDMA1_Channel1_IRQHandler;DMA1Channel1 DCDDMA1_Channel2_IRQHandler;DMA1Channel2 DCDDMA1_Channel3_IRQHandler;DMA1Channel3 DCDDMA1_Channel4_IRQHandler;DMA1Channel4 DCDDMA1_Channel5_IRQHandler;DMA1Channel5 DCDDMA1_Channel6_IRQHandler;DMA1Channel6 DCDDMA1_Channel7_IRQHandler;DMA1Channel7 DCDADC1_2_IRQHandler;ADC1&ADC2 DCDUSB_HP_CAN1_TX_IRQHandler;USBHighPriorityorCAN1TX DCDUSB_LP_CAN1_RX0_IRQHandler;USBLowPriorityorCAN1RX0 DCDCAN1_RX1_IRQHandler;CAN1RX1 DCDCAN1_SCE_IRQHandler;CAN1SCE DCDEXTI9_5_IRQHandler;EXTILine9..5 DCDTIM1_BRK_IRQHandler;TIM1Break DCDTIM1_UP_IRQHandler;TIM1Update DCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutation DCDTIM1_CC_IRQHandler;TIM1CaptureCompare DCDTIM2_IRQHandler;TIM2 DCDTIM3_IRQHandler;TIM3 DCDTIM4_IRQHandler;TIM4 DCDI2C1_EV_IRQHandler;I2C1Event DCDI2C1_ER_IRQHandler;I2C1Error DCDI2C2_EV_IRQHandler;I2C2Event DCDI2C2_ER_IRQHandler;I2C2Error DCDSPI1_IRQHandler;SPI1 DCDSPI2_IRQHandler;SPI2 DCDUSART1_IRQHandler;USART1 DCDUSART2_IRQHandler;USART2 DCDUSART3_IRQHandler;USART3 DCDEXTI15_10_IRQHandler;EXTILine15..10 DCDRTCAlarm_IRQHandler;RTCAlarmthroughEXTILine DCDUSBWakeUp_IRQHandler;USBWakeupfromsuspend DCDTIM8_BRK_IRQHandler;TIM8Break DCDTIM8_UP_IRQHandler;TIM8Update DCDTIM8_TRG_COM_IRQHandler;TIM8TriggerandCommutation DCDTIM8_CC_IRQHandler;TIM8CaptureCompare DCDADC3_IRQHandler;ADC3 DCDFSMC_IRQHandler;FSMC DCDSDIO_IRQHandler;SDIO DCDTIM5_IRQHandler;TIM5 DCDSPI3_IRQHandler;SPI3 DCDUART4_IRQHandler;UART4 DCDUART5_IRQHandler;UART5 DCDTIM6_IRQHandler;TIM6 DCDTIM7_IRQHandler;TIM7 DCDDMA2_Channel1_IRQHandler;DMA2Channel1 DCDDMA2_Channel2_IRQHandler;DMA2Channel2 DCDDMA2_Channel3_IRQHandler;DMA2Channel3 DCDDMA2_Channel4_5_IRQHandler;DMA2Channel4&Channel5 __Vectors_End __Vectors_SizeEQU__Vectors_End-__Vectors AREA|.text|,CODE,READONLY
其中“__initial_sp”就是第一條中斷向量,存放的是棧頂指針,接下來是第 2 行復(fù)位中斷復(fù)位函數(shù)Reset_Handler 的入口地址,依次類推,直到最后一個中斷服務(wù)函數(shù)DMA2_Channel4_5_IRQHandler 的入口地址,這樣 STM32F103 的中斷向量表就建好了。
中斷使用方法:
1、配置中斷向量表(ST提供)。 2、配置NVIC(內(nèi)嵌向量中斷控制器)。 3、中斷使能。 4、中斷服務(wù)函數(shù)。
先配置好中斷向量表(自動),然后配置一下IO口,配置NVIC來管理中斷,使能中斷,最后編寫中斷服務(wù)函數(shù),中斷服務(wù)函數(shù)里是我們真正想做的事情。
這個思路也適合于Cortex A架構(gòu),只是中斷系統(tǒng)不同,中斷管理器也不同,STM32中的中斷管理器是NVIC,Cortex A架構(gòu)的中斷管理器是GIC控制器。GIC 是 ARM 公司給 Cortex-A/R 內(nèi)核提供的一個中斷控制器。
Cortex A架構(gòu)
下表為Cortex A架構(gòu)中斷向量表,這個表也是寫在.s結(jié)尾的啟動文件當中,為C語言代碼的運行提供前期的初始化工作,只有做好了初始化,你的C語言代碼才會運行,啟動文件中做好初始化以后,會跳轉(zhuǎn)到你的main函數(shù)。
可以發(fā)現(xiàn)比STM32的中斷少了很多,只有八個中斷,還有一個未使用。其中我們最常用的中斷是復(fù)位中斷和 IRQ 中斷。
實際上Cortex A架構(gòu)是不可能只有這么少的中斷,Cortex-A 內(nèi)核 CPU 的所有外部中斷都屬于IQR 中斷,當任意一個外部中斷發(fā)生的時候都會觸發(fā) IRQ 中斷。
在 IRQ 中斷服務(wù)函數(shù)里面就可以讀取指定的寄存器來判斷發(fā)生的具體是什么中斷,進而根據(jù)具體的中斷做出相應(yīng)的處理,如下圖:
中斷解釋:
1、復(fù)位中斷(Rest),CPU 復(fù)位以后就會進入復(fù)位中斷,我們可以在復(fù)位中斷服務(wù)函數(shù)里面做一些初始化工作,比如初始化 SP 指針、DDR 等等。
2、未定義指令中斷(Undefined Instruction),如果指令不能識別的話就會產(chǎn)生此中斷。
3、軟中斷(Software Interrupt,SWI),由 SWI 指令引起的中斷,Linux 的系統(tǒng)調(diào)用會用 SWI指令來引起軟中斷,通過軟中斷來陷入到內(nèi)核空間。
4、指令預(yù)取中止中斷(Prefetch Abort),預(yù)取指令的出錯的時候會產(chǎn)生此中斷。
5、數(shù)據(jù)訪問中止中斷(Data Abort),訪問數(shù)據(jù)出錯的時候會產(chǎn)生此中斷。
6、IRQ 中斷(IRQ Interrupt),外部中斷,芯片內(nèi)部的外設(shè)中斷都會引起此中斷的發(fā)生。
7、FIQ 中斷(FIQ Interrupt),快速中斷,如果需要快速處理中斷的話就可以使用此中。
存放地址
中斷向量表都是鏈接到代碼的最前面,比如一般 ARM 處理器都是從地址 0X0000 0000 開始執(zhí)行指令的,那么中斷向量表就是從0X0000 0000 開始存放的。
在STM32中,一般代碼是下載到 0X0800 0000開始的存儲區(qū)域中。因此中斷向量表是存放到 0X0800 0000 地址處的,而不是 0X00000000。這種是通過中斷向量表偏移實現(xiàn)的。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7947瀏覽量
154863 -
ARM
+關(guān)注
關(guān)注
134文章
9349瀏覽量
377298 -
STM32
+關(guān)注
關(guān)注
2293文章
11031瀏覽量
364606 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61395 -
STM32F103
+關(guān)注
關(guān)注
33文章
483瀏覽量
65498
原文標題:Cortex M架構(gòu)與Cortex A架構(gòu)中斷系統(tǒng)的區(qū)別
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【圖書分享】《ARM Cortex-M3應(yīng)用開發(fā)實例詳解》
arm架構(gòu)和cortex架構(gòu)
Cortex-M處理器采用的架構(gòu)是什么
cortex-m3/cortex-m4/cortex-a8的區(qū)別是什么?
cortex-m下各種微架構(gòu)的區(qū)別是什么?
Cortex-A8與STM32有哪些區(qū)別呢
介紹Cortex-A和Cortex-M的TrustZone之間的差異
關(guān)于ARM cortex-A5架構(gòu)的介紹
Cortex-A8與STM32的區(qū)別

基于Cortex M0微型操作系統(tǒng)架構(gòu)及API

評論