更新一下进展: 基本实现如何将bootloader代码从flash 搬到RAM运行, 目前除了 Reset_Handler 以及 SystemInit 两个函数以外, 其他代码全部搬运到了ram里面运行
说一下思路:
1.Reset_Handler 负责将除Reset_Handler 以及 SystemInit 两个函数以外的所有代码搬运到ram;
2.之前遇到的问题是代码启动后直接去ram里面执行Reset_Handler 了,但是这会ram里面还是空的,__main 函数还没帮忙把代码拷贝到ram里面去;
3.现在就先将Reset_Handler 以及 SystemInit 的执行域仍定在flash,在flash里面运行,
[C] 纯文本查看 复制代码 AREA RESET, CODE, READONLY ; 复用原始启动文件的段名
THUMB
Reset_Handler PROC
EXPORT Reset_Handler ; 必须显式 EXPORT(无 [WEAK])
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
END
4. Reset_Handler 单独在.s 文件里面实现, 重定向的ram 中断向量表也在新的.s 文件里面实现
[C] 纯文本查看 复制代码 PRESERVE8
THUMB
; /* reset Vector Mapped to at Address 0 */
AREA RESET_Ram, DATA, READONLY
EXPORT __Vectors_Ram
EXPORT __Vectors_End_Ram
EXPORT __Vectors_Size_Ram
__Vectors_Ram DCD 0 ; Top of Stack
DCD 0 ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
...中间省略 对比复制原始__Vectors...
DCD USBHS_EP1_In_IRQHandler ; 91:USBHS Endpoint 1 in
DCD USBHS_WKUP_IRQHandler ; 92:USBHS Wakeup through EXTI Line
DCD USBHS_IRQHandler ; 93:USBHS
DCD DCI_IRQHandler ; 94:DCI
DCD 0 ; 95:Reserved
DCD TRNG_IRQHandler ; 96:TRNG
DCD FPU_IRQHandler ; 97:FPU
__Vectors_End_Ram
__Vectors_Size_Ram EQU __Vectors_End_Ram - __Vectors_Ram
AREA |.text|, CODE, READONLY
IMPORT NMI_Handler
IMPORT HardFault_Handler
IMPORT MemManage_Handler
IMPORT BusFault_Handler
IMPORT UsageFault_Handler
IMPORT SVC_Handler
IMPORT DebugMon_Handler
IMPORT PendSV_Handler
IMPORT SysTick_Handler
; /* external interrupts handler */
IMPORT WWDGT_IRQHandler [WEAK]
IMPORT LVD_IRQHandler [WEAK]
IMPORT TAMPER_STAMP_IRQHandler [WEAK]
...中间省略 对比复制原始__Vectors...
IMPORT USBHS_EP1_In_IRQHandler [WEAK]
IMPORT USBHS_WKUP_IRQHandler [WEAK]
IMPORT USBHS_IRQHandler [WEAK]
IMPORT DCI_IRQHandler [WEAK]
IMPORT TRNG_IRQHandler [WEAK]
IMPORT FPU_IRQHandler [WEAK]
END
现在遇到了另外一个问题, 没法打断点了, 有哪位大佬帮忙看看

|