天天看點

【.Net Micro Framework PortingKit - 04】修改啟動代碼&重寫向量表

   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中斷表偏移。

繼續閱讀