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

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

在上三篇《移植初步:环境搭建》《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){}

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

 

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

相关文章
|
11月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
2205 2
|
11月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
2321 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
1188 0
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
2007 1
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
763 0
|
开发工具 Android开发
Mac 安卓(Android) 配置adb路径
Mac 安卓(Android) 配置adb路径
1814 0
|
12月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
1016 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
975 0
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
11071 2