【.Net Micro Framework PortingKit - 04】修改启动代码&重写向量表

在上三篇《移植初步:环境搭建》《STM3210E平台构建》《调试初步:点亮LED》文章中,我们介绍了如何搭建开发环境,并初步写了测试代码,下一步我们将根据Cortex-M3的架构特点,修改启动代码和重写中断向量表。

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 0 ; Reserved

DCD 0 ; Reserved

DCD SVCHandler

DCD DebugMonitor

DCD 0 ; Reserved

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){}

以上函数为暂且为空,以后我们在根据需要再添加相应的中断处理代码。

4dotNetMF.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 Condition="'$(INSTRUCTION_SET)'=='thumb2'">

<Compile Include="AssemblyCode/thumb2/$(AS_SUBDIR)/FirstEntry.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)" />

</ItemGroup>

修改为:

<ItemGroup>

<LIB_FIRSTENTRY_OBJ Include="$(OBJ_DIR)/FirstEntry.$(OBJ_EXT)" />

</ItemGroup>

2)在./Solutions/STM3210E/NativeSample/NativeSample.proj文件中添加如下内容:

<ItemGroup>

<RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/VectorsHandler_Temp/dotNetMF.proj" />

<DriverLibs Include="VectorsHandler_Temp.$(LIB_EXT)" />

</ItemGroup>

5、编译

编译我们的代码,看看是否能编译成功。编译成功后,在用MDK下载的开发板试一试,如果运行正常,这一步工作将告一段落。下一步我们将编写SRAM初始化代码和设置NVIC中断表偏移。

你可能感兴趣的:(framework)