【GCC】因存在BootLoader,设置启动地址偏移,中断向量表偏移

【GCC】因存在BootLoader,设置启动地址偏移

因为加入BootLoader的缘故,我们的用户代码启动位置需要进行一个偏移。

在Keil中我们能很方便的设置,只需要修改IROM1 处 start 地址就可以了

请添加图片描述

在GCC中我们需要在两处进行修改:

  1. .ld 文件内 Line64 在flash处做一个偏移地址
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
    CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
    FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 512K
    我们就可以修改FLASH的地址
    eg:
    FLASH (rx) : ORIGIN = 0x80008000, LENGTH = 480K
    此处为启动地址偏移
  2. system_stm32f4xx.c 文件下 VECT_TAB_OFFSET 也需要做一个偏移
    Line 364:
    #define VECT_TAB_OFFSET 0x8000
    此处就为中断向量表的偏移
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在中断向量表修改启动位置,你需要进行以下步骤: 1. 在你的代码中定义一个中断向量表,并将其放置在适当的位置。例如,你可以在代码开头处定义一个数组来存储中断向量表: ```c const uint32_t InterruptVectorTable[] __attribute__((section(".isr_vector"))) = { // 中断向量表条目 }; ``` 在这个例子中,我们使用 `__attribute__((section(".isr_vector")))` 将数组放置在 `.isr_vector` 节(Section)中,这是中断向量表所在的位置。 2. 在你的代码中实现中断处理程序。例如,你可以实现一个名为 `Reset_Handler()` 的函数来代替启动代码的默认行为。 ```c void Reset_Handler(void) { // 初始化代码 } ``` 3. 修改中断向量表中适当的条目,将其指向你实现的中断处理程序。例如,你可以将中断向量表的第一个条目指向你的 `Reset_Handler()` 函数: ```c const uint32_t InterruptVectorTable[] __attribute__((section(".isr_vector"))) = { (uint32_t)&_estack, // 栈顶指针 (uint32_t)Reset_Handler, // 复位中断 // 其他中断向量表条目 }; ``` 在这个例子中,我们将中断向量表的第二个条目指向我们实现的 `Reset_Handler()` 函数。 4. 在你的代码中禁用默认的启动代码。这可以通过编译器选项或链接器脚本来完成。例如,你可以使用 `-nostartfiles` 编译器选项来禁用默认的启动代码。 ```bash gcc -nostartfiles -o main.elf main.c ``` 或者,你可以在链接器脚本中禁用默认的启动代码。例如,你可以将以下行添加到链接器脚本中: ```ld /* 禁用默认的启动代码 */ ENTRY(Reset_Handler) SECTIONS { /* 其他节 */ } ``` 在这个例子中,我们使用 `ENTRY(Reset_Handler)` 指定我们的 `Reset_Handler()` 函数作为程序的入口点。 完成以上步骤后,你就可以在中断向量表修改启动位置了。当你的代码被加载并运行时,启动代码将会跳转到你定义的中断处理程序中,而不是默认的启动代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值