Cortex M架構(gòu),典型就是STM32系列,比如STM32F103(Cortex M3)。
Cortex A架構(gòu),可以細(xì)分為Cortex A7,Cortex A8,Cortex A9,Cortex A15等,比如NXP的IMX6系列,TI的AM335X系列等。
Cortex M主要用在微控制器領(lǐng)域,Cortex R主要用在對實(shí)時(shí)性要求比較高的領(lǐng)域,Cortex A主要用在高端應(yīng)用領(lǐng)域。
Cortex M架構(gòu)
在Cortex M架構(gòu)中,比如STM32F103,中斷向量表是寫在啟動(dòng)文件當(dāng)中,一般為startup_stm32f10x_hd.s或者startup_stm32f10x_md.s中,.s結(jié)尾為匯編文件,這個(gè)匯編語言寫的啟動(dòng)文件的作用,是在板子上電后為C語言代碼的運(yùn)行做好初始化工作,比如設(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)所有可用的中斷都寫在這里,包括外部中斷、定時(shí)器中斷、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 的入口地址,依次類推,直到最后一個(gè)中斷服務(wù)函數(shù)DMA2_Channel4_5_IRQHandler 的入口地址,這樣 STM32F103 的中斷向量表就建好了。
中斷使用方法:
1、配置中斷向量表(ST提供)。 2、配置NVIC(內(nèi)嵌向量中斷控制器)。 3、中斷使能。 4、中斷服務(wù)函數(shù)。
先配置好中斷向量表(自動(dòng)),然后配置一下IO口,配置NVIC來管理中斷,使能中斷,最后編寫中斷服務(wù)函數(shù),中斷服務(wù)函數(shù)里是我們真正想做的事情。
這個(gè)思路也適合于Cortex A架構(gòu),只是中斷系統(tǒng)不同,中斷管理器也不同,STM32中的中斷管理器是NVIC,Cortex A架構(gòu)的中斷管理器是GIC控制器。GIC 是 ARM 公司給 Cortex-A/R 內(nèi)核提供的一個(gè)中斷控制器。
Cortex A架構(gòu)
下表為Cortex A架構(gòu)中斷向量表,這個(gè)表也是寫在.s結(jié)尾的啟動(dòng)文件當(dāng)中,為C語言代碼的運(yùn)行提供前期的初始化工作,只有做好了初始化,你的C語言代碼才會(huì)運(yùn)行,啟動(dòng)文件中做好初始化以后,會(huì)跳轉(zhuǎn)到你的main函數(shù)。
可以發(fā)現(xiàn)比STM32的中斷少了很多,只有八個(gè)中斷,還有一個(gè)未使用。其中我們最常用的中斷是復(fù)位中斷和 IRQ 中斷。
實(shí)際上Cortex A架構(gòu)是不可能只有這么少的中斷,Cortex-A 內(nèi)核 CPU 的所有外部中斷都屬于IQR 中斷,當(dāng)任意一個(gè)外部中斷發(fā)生的時(shí)候都會(huì)觸發(fā) IRQ 中斷。
在 IRQ 中斷服務(wù)函數(shù)里面就可以讀取指定的寄存器來判斷發(fā)生的具體是什么中斷,進(jìn)而根據(jù)具體的中斷做出相應(yīng)的處理,如下圖:
中斷解釋:
1、復(fù)位中斷(Rest),CPU 復(fù)位以后就會(huì)進(jìn)入復(fù)位中斷,我們可以在復(fù)位中斷服務(wù)函數(shù)里面做一些初始化工作,比如初始化 SP 指針、DDR 等等。
2、未定義指令中斷(Undefined Instruction),如果指令不能識別的話就會(huì)產(chǎn)生此中斷。
3、軟中斷(Software Interrupt,SWI),由 SWI 指令引起的中斷,Linux 的系統(tǒng)調(diào)用會(huì)用 SWI指令來引起軟中斷,通過軟中斷來陷入到內(nèi)核空間。
4、指令預(yù)取中止中斷(Prefetch Abort),預(yù)取指令的出錯(cuò)的時(shí)候會(huì)產(chǎn)生此中斷。
5、數(shù)據(jù)訪問中止中斷(Data Abort),訪問數(shù)據(jù)出錯(cuò)的時(shí)候會(huì)產(chǎn)生此中斷。
6、IRQ 中斷(IRQ Interrupt),外部中斷,芯片內(nèi)部的外設(shè)中斷都會(huì)引起此中斷的發(fā)生。
7、FIQ 中斷(FIQ Interrupt),快速中斷,如果需要快速處理中斷的話就可以使用此中。
存放地址
中斷向量表都是鏈接到代碼的最前面,比如一般 ARM 處理器都是從地址 0X0000 0000 開始執(zhí)行指令的,那么中斷向量表就是從0X0000 0000 開始存放的。
在STM32中,一般代碼是下載到 0X0800 0000開始的存儲(chǔ)區(qū)域中。因此中斷向量表是存放到 0X0800 0000 地址處的,而不是 0X00000000。這種是通過中斷向量表偏移實(shí)現(xiàn)的。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7646瀏覽量
151949 -
ARM
+關(guān)注
關(guān)注
134文章
9164瀏覽量
368790 -
STM32
+關(guān)注
關(guān)注
2271文章
10923瀏覽量
357219 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61044 -
STM32F103
+關(guān)注
關(guān)注
33文章
479瀏覽量
63821
原文標(biāo)題:Cortex M架構(gòu)與Cortex A架構(gòu)中斷系統(tǒng)的區(qū)別
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論