Cortex-M3的中斷架構非常有特色,晶片内建一個嵌套向量中斷控制器NVIC(Nested Vectored Interrupt Controller),它與核心是緊耦合的,提供如下的功能:可嵌套中斷支援,向量中斷支援,動态優先級調整支援,中斷延遲大大縮短,中斷可屏蔽。NVIC 支援240 個優先級可動态配置的中斷,每個中斷的優先級有256 個選擇。低延遲的中斷處理可以通過緊耦合的NVIC 和處理器核心接口來實作,讓新進的中斷可以得到有效的處理。NVIC通過時刻關注壓棧(嵌套)中斷來實作中斷的末尾連鎖(tail-chaining)。
.Net Micro Framework的中斷處理建構在Cortex-M3的中斷架構之上,将大大提升的.Net Micro Framework的實時性能,不過由于架構全新,需要大幅度改寫.Net Micro Framework原有中斷處理代碼,不破不立,這對性能有所诟病的.Net Micro Framework也許是個好事情。
下面就新中斷架構,進行代碼改寫。
1、修改FirstEntry.s代碼
由于廢棄了./devicecode/cores/arm/assemblycode/thumb2/rvd_s/VectorsHanlers.s 是以為了編譯通過,我們要在同目錄下的FirstEntry.s中添加一些代碼,
在檔案頭添加如下代碼:
EXPORT HARD_Breakpoint
;IMPORT HARD_Breakpoint_Handler ; HARD_Breakpoint_Handler(unsigned int*, unsigned int, unsigned int)
在檔案尾“END”指令前添加如下代碼:
;AREA ||i.HARD_Breakpoint||, CODE, READONLY ; void HARD_Breakpoint()
HARD_Breakpoint
; on entry, were are being called from C/C++ in system mode
;b HARD_Breakpoint_Handler ; address of vector routine in C to jump to, never expect to return
2、重寫中斷向量表(VectorsTrampolines.s)
重寫同目錄下的VectorsTrampolines.s檔案為如下内容:
; 導入異常或中斷處理程式
IMPORT NMIException
IMPORT HardFaultException
IMPORT MemManageException
IMPORT BusFaultException
IMPORT UsageFaultException
IMPORT SVCHandler
IMPORT DebugMonitor
IMPORT PendSVC
IMPORT SysTickHandler
IMPORT WWDG_IRQHandler
IMPORT PVD_IRQHandler
IMPORT TAMPER_IRQHandler
IMPORT RTC_IRQHandler
IMPORT FLASH_IRQHandler
IMPORT RCC_IRQHandler
IMPORT EXTI0_IRQHandler
IMPORT EXTI1_IRQHandler
IMPORT EXTI2_IRQHandler
IMPORT EXTI3_IRQHandler
IMPORT EXTI4_IRQHandler
IMPORT DMA1_Channel1_IRQHandler
IMPORT DMA1_Channel2_IRQHandler
IMPORT DMA1_Channel3_IRQHandler
IMPORT DMA1_Channel4_IRQHandler
IMPORT DMA1_Channel5_IRQHandler
IMPORT DMA1_Channel6_IRQHandler
IMPORT DMA1_Channel7_IRQHandler
IMPORT ADC1_2_IRQHandler
IMPORT USB_HP_CAN_TX_IRQHandler
IMPORT USB_LP_CAN_RX0_IRQHandler
IMPORT CAN_RX1_IRQHandler
IMPORT CAN_SCE_IRQHandler
IMPORT EXTI9_5_IRQHandler
IMPORT TIM1_BRK_IRQHandler
IMPORT TIM1_UP_IRQHandler
IMPORT TIM1_TRG_COM_IRQHandler
IMPORT TIM1_CC_IRQHandler
IMPORT TIM2_IRQHandler
IMPORT TIM3_IRQHandler
IMPORT TIM4_IRQHandler
IMPORT I2C1_EV_IRQHandler
IMPORT I2C1_ER_IRQHandler
IMPORT I2C2_EV_IRQHandler
IMPORT I2C2_ER_IRQHandler
IMPORT SPI1_IRQHandler
IMPORT SPI2_IRQHandler
IMPORT USART1_IRQHandler
IMPORT USART2_IRQHandler
IMPORT USART3_IRQHandler
IMPORT EXTI15_10_IRQHandler
IMPORT RTCAlarm_IRQHandler
IMPORT USBWakeUp_IRQHandler
IMPORT TIM8_BRK_IRQHandler
IMPORT TIM8_UP_IRQHandler
IMPORT TIM8_TRG_COM_IRQHandler
IMPORT TIM8_CC_IRQHandler
IMPORT ADC3_IRQHandler
IMPORT FSMC_IRQHandler
IMPORT SDIO_IRQHandler
IMPORT TIM5_IRQHandler
IMPORT SPI3_IRQHandler
IMPORT UART4_IRQHandler
IMPORT UART5_IRQHandler
IMPORT TIM6_IRQHandler
IMPORT TIM7_IRQHandler
IMPORT DMA2_Channel1_IRQHandler
IMPORT DMA2_Channel2_IRQHandler
IMPORT DMA2_Channel3_IRQHandler
IMPORT DMA2_Channel4_5_IRQHandler
EXPORT ARM_Vectors
IMPORT StackTop
IMPORT EntryPoint
;*****************************************************************************
AREA |.text|, CODE, READONLY
;向量表
ARM_Vectors
DCD StackTop ; Top of Stack 棧頂
DCD EntryPoint ; 複位
DCD NMIException
DCD HardFaultException
DCD MemManageException
DCD BusFaultException
DCD UsageFaultException
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVCHandler
DCD DebugMonitor
DCD PendSVC
DCD SysTickHandler
DCD WWDG_IRQHandler
DCD PVD_IRQHandler
DCD TAMPER_IRQHandler
DCD RTC_IRQHandler
DCD FLASH_IRQHandler
DCD RCC_IRQHandler
DCD EXTI0_IRQHandler
DCD EXTI1_IRQHandler
DCD EXTI2_IRQHandler
DCD EXTI3_IRQHandler
DCD EXTI4_IRQHandler
DCD DMA1_Channel1_IRQHandler
DCD DMA1_Channel2_IRQHandler
DCD DMA1_Channel3_IRQHandler
DCD DMA1_Channel4_IRQHandler
DCD DMA1_Channel5_IRQHandler
DCD DMA1_Channel6_IRQHandler
DCD DMA1_Channel7_IRQHandler
DCD ADC1_2_IRQHandler
DCD USB_HP_CAN_TX_IRQHandler
DCD USB_LP_CAN_RX0_IRQHandler
DCD CAN_RX1_IRQHandler
DCD CAN_SCE_IRQHandler
DCD EXTI9_5_IRQHandler
DCD TIM1_BRK_IRQHandler
DCD TIM1_UP_IRQHandler
DCD TIM1_TRG_COM_IRQHandler
DCD TIM1_CC_IRQHandler
DCD TIM2_IRQHandler
DCD TIM3_IRQHandler
DCD TIM4_IRQHandler
DCD I2C1_EV_IRQHandler
DCD I2C1_ER_IRQHandler
DCD I2C2_EV_IRQHandler
DCD I2C2_ER_IRQHandler
DCD SPI1_IRQHandler
DCD SPI2_IRQHandler
DCD USART1_IRQHandler
DCD USART2_IRQHandler
DCD USART3_IRQHandler
DCD EXTI15_10_IRQHandler
DCD RTCAlarm_IRQHandler
DCD USBWakeUp_IRQHandler
DCD TIM8_BRK_IRQHandler
DCD TIM8_UP_IRQHandler
DCD TIM8_TRG_COM_IRQHandler
DCD TIM8_CC_IRQHandler
DCD ADC3_IRQHandler
DCD FSMC_IRQHandler
DCD SDIO_IRQHandler
DCD TIM5_IRQHandler
DCD SPI3_IRQHandler
DCD UART4_IRQHandler
DCD UART5_IRQHandler
DCD TIM6_IRQHandler
DCD TIM7_IRQHandler
DCD DMA2_Channel1_IRQHandler
DCD DMA2_Channel2_IRQHandler
DCD DMA2_Channel3_IRQHandler
DCD DMA2_Channel4_5_IRQHandler
END
3、建立VectorsHandler_Temp庫檔案
在./DeviceCode/Targets/Native/CortexM3/DeviceCode目錄下,建立目錄VectorsHandler_Temp,并建立兩個檔案dotNetMF.proj(編譯配置,可參見其它同類檔案),VectorsHandler_Temp.c(空的中斷處理函數)。
VectorsHandler_Temp.c的内容如下:
void NMIException(void) {}
void HardFaultException(void){while (1);}
void MemManageException(void){while (1);}
void BusFaultException(void){while (1);}
void UsageFaultException(void){while (1);}
void DebugMonitor(void){}
void SVCHandler(void){}
// 省略部分代碼 .....
void TIM6_IRQHandler(void){}
void TIM7_IRQHandler(void){}
void DMA2_Channel1_IRQHandler(void){}
void DMA2_Channel2_IRQHandler(void){}
void DMA2_Channel3_IRQHandler(void){}
void DMA2_Channel4_5_IRQHandler(void){}
以上函數為暫且為空,以後我們在根據需要再添加相應的中斷處理代碼。
4、dotNetMF.proj檔案調整
(1)對./DeviceCode/cores/arm/dotNetMF.proj檔案做如下調整:
<ItemGroup Condition="'$(INSTRUCTION_SET)'=='thumb2'">
<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/FirstEntry.s" />
<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/IDelayLoop.s" />
<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/Sampling_Profiler_RAM.s" />
<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsHandlers.s" />
<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsTrampolines.s" />
</ItemGroup>
修改為:
<ItemGroup>
<HFiles Include="../../Initialization/MasterConfig.h" />
<Compile Include="Diagnostics/Aborts.cpp" />
<Compile Include="Diagnostics/FIQ_Profiler.cpp" />
<Compile Include="Diagnostics/RamTest.cpp" />
<Compile Include="Diagnostics/RamTest.h" />
<LIB_FIRSTENTRY_OBJ Include="$(OBJ_DIR)/FirstEntry.$(OBJ_EXT)" />
(2)在./Solutions/STM3210E/NativeSample/NativeSample.proj檔案中添加如下内容:
<RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/VectorsHandler_Temp/dotNetMF.proj" />
<DriverLibs Include="VectorsHandler_Temp.$(LIB_EXT)" />
</ItemGroup>
5、編譯
編譯我們的代碼,看看是否能編譯成功。編譯成功後,在用MDK下載下傳的開發闆試一試,如果運作正常,這一步工作将告一段落。下一步我們将編寫SRAM初始化代碼和設定NVIC中斷表偏移。