//=====================================================================
//TITLE:
// 重定位启动代码和向量表
//AUTHOR:
// norains
//DATE:
// Thursday 30-September-2010
//Environment:
// KEIL MDK 4.0
// .NET Micro Framework Porting 4.1
//=====================================================================
叶帆在他的文章《【.Net Micro Framework PortingKit - 04】修改启动代码&重写向量表》(http://blog.csdn.net/yefanqiu/archive/2010/01/03/5125745.aspx)已经很明确地给出了适合STM32F103ZE使用的启动代码和向量表的修改方式。但我认为有一点不足,就是这些修改都是在.NET Micro Framework Porting 4.1原有的框架之上的,如果在向STM32F103ZE移植的同时,还有别的Solution需要兼顾,则是一件非常痛苦的事情。所以,在这里采用另外一种方式来修改启动代码和向量表。
首先,根据这篇文件《重定位编译文件》(http://blog.csdn.net/norains/archive/2010/09/29/5913611.aspx)的方式,先建立一个位于./Solutions/[MySolution]/DeviceCode/cores/arm路径下的dotNetMF.proj文件。这一步非常重要,因为文章后面所做的更改,都是在这文件上动手。当然不要忘记,还要对NativeSample.proj进行修改,让它连接到我们这个新的文件。
1.打开已经重定位成功的dotNetMF.proj文件,做如下的修改:
原语句:
<ItemGroup Condition="'$(INSTRUCTION_SET)'=='thumb2'">
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/FirstEntry.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsTrampolines.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/IDelayLoop.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/Sampling_Profiler_RAM.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsHandlers.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsTrampolines.s" />
</ItemGroup>
更改为:
<ItemGroup Condition="'$(INSTRUCTION_SET)'=='thumb2'">
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/FirstEntry.s" />
<Compile Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsHandlers.s" />
<Compile Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsTrampolines.s" />
<Compile Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsHandlers_Func.c" />
</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. 拷贝一个VectorsTrampolines.s文件到./Solutions/[MySolution]/DeviceCode/cores/arm/AssemblyCode/thumb2/RVD_S,输入如下内容:
;*****************************************************************************
; Import the handle function
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
;Vector list
ARM_Vectors
DCD StackTop ; Top of Stack
DCD EntryPoint; Reset
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.拷贝一个VectorsHandlers.s文件到./Solutions/[MySolution]/DeviceCode/cores/arm/AssemblyCode/thumb2/RVD_S,输入如下内容:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Copyright (c) Microsoft Corporation. All rights reserved.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*****************************************************************************
EXPORT HARD_Breakpoint
;IMPORT HARD_Breakpoint_Handler ; HARD_Breakpoint_Handler(unsigned int*, unsigned int, unsigned int)
;*****************************************************************************
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
;*****************************************************************************
END
4. 在./Solutions/[MySolution]/DeviceCode/cores/arm/AssemblyCode/thumb2/RVD_S路径下,新建一个VectorsHandlers_Func.c文件,输入如下内容:
5. 在命令行中进入到NativeSample工程目录,输入Msbuild /t:rebuild /p:flavor=debug;memory=ram 进行编译。如果没有错误,那么在调试时应该也不会出现问题了。
分享到:
相关推荐
进程调度、银行家算法、页式地址重定位模拟,LRU算法模拟和先来先服务算法代码
本文档是基于C语言设置TMS320 DSP中断向量表的设置和书写方法,希望对初学者有帮助!
可自动修改DLL镜像基址,DLL重定位资源修改。
操作系统-页式地址重定位模拟实验报告.doc
开发平台2440,主要是介绍的代码的重定位问题。
该文件包含一个dll和PEview,和文章中的截图对应,方便大家更好的理解PE重定位原理
relox 重定位 ImportRec作者 DLL 重定位修复
重定位项的高4位表示重定位的类型,如下图而低12位表示相对于 VirtualAddress 的偏移量,故需要重定位的地址的 RVA = VirtualAddre
代码重定位和虚拟内存.pptx
1.重定位表的修改方法,而不是修改入口点函数,根据相对地址偏移的方法。 2:重定位表的内容: 第[0001]项 数据项的数据为:[0006] 数据属性为:[3] RVA的地址为:[00001006] 重定位的数据:[68264000]; RVA里面的地址...
重定位06 C语言 嵌入式
详细说明了exe文件结构及dos加载exe文件的过程。对其中的步骤进行了一步步的说明,是...在源码的 kernel.asm 里找 relocation 标号,有 exe 文件加载,重定位,执行的汇编指令。我加载了 dos 时代的几个游戏玩了玩 :D
分析了ELF obj文件中重定位信息
当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址...
ros2+cartographer 在rviz中点击一下initpose,即可实现全局重定位,匹配到机器人的准确位置;同时可发布机器人位姿话题robot_pose; 内含操作教程和测试的bag,环境配置说明;
利用这个,如果特征码定位到了输出表和重定位表上的时候,你重建就能达到免杀的目的
里面有源程序和实验报告,源程序已经调试过了有什么问题可问我。
PE文件重定位信息编辑工具是一款编程工具类软件,有了它以后,用户在编辑PE文件时就不需要每次都去查看重定位表的内容了,非常的方便和实用,喜爱的朋友赶快下载体验吧! 官方介绍 PE文件重定位信息编辑工具是一款...
1:包含一个dll,PElord工具和一个文档说明 2:用一个dll对PE结构中的重定位表进行了解析和数据还原
存储空间与重定位、分区分页技术