Embedded 引导加载程序在内存中的位置

Embedded 引导加载程序在内存中的位置,embedded,microcontroller,pic,bootloader,microchip,Embedded,Microcontroller,Pic,Bootloader,Microchip,有没有办法让引导加载程序代码占据程序内存中的特定部分 我注意到一些代码写在内存的顶部,但另一部分是从$11000开始写的。在我的情况下,它与我的应用程序代码冲突。那么,如何强制引导加载程序代码占用从$00000到$10000的程序内存呢?我假设可以通过更改Mplab XC8编译器下的一些设置来完成 图:PIC18F87J11 编译器:mplabxc8 更新: 找到了解决办法 项目属性>XC8全局选项类别>内存模型>ROM范围 ROM范围:0-10000 更新: 不过,我看到了另一个问题 因此,我

有没有办法让引导加载程序代码占据程序内存中的特定部分

我注意到一些代码写在内存的顶部,但另一部分是从$11000开始写的。在我的情况下,它与我的应用程序代码冲突。那么,如何强制引导加载程序代码占用从$00000到$10000的程序内存呢?我假设可以通过更改Mplab XC8编译器下的一些设置来完成

图:PIC18F87J11

编译器:mplabxc8

更新:

找到了解决办法

项目属性>XC8全局选项类别>内存模型>ROM范围

ROM范围:0-10000

更新:

不过,我看到了另一个问题

因此,我将ROM的范围设置为$00000到$10000,但这对于引导加载程序代码来说是不够的,即使它应该这样做。然而,当我在构建项目后查看MPLAB XC8下的程序内存时,我注意到有一些收件人是空的

我如何强制使用这些收件人?如果使用了这些部分,那么指定的ROM大小(0-10000)应该足够我的引导加载程序代码使用

例如,使用这些地址(写入其中的数据)

00000-0925C

但是这些地址没有被使用,只是留空

0925E-0F77A(巨大的截面,多么浪费)

然后使用这些地址

0F77C-0FFFE

但是,我的程序在10000美元的时候被切断了,尽管似乎有更多的代码要写入内存

所以

我如何强制那些未使用的收件人被使用?跳过它们是一种巨大的内存浪费,我不明白它们为什么是空的。我不能给引导加载程序更多的ROM空间,其余的必须给应用程序代码


我希望一切都清楚,谢谢

要将引导加载程序放在指定内存中,您应该:

1) 在代码中,创建部分

int __section("_bootloader") helper(int mode) {
/* ... */ 
//bootloader functions here
}
2) 在链接器的选项中,添加选项以将节放置到指定内存中

-L-A_BLOADER=00h-ffffh
-L-p_bootloader=_BLOADER

要查看内存范围0F77C-0FFFE中的exect函数,可以查看*.map文件(如果已生成)。

我不熟悉PIC,但通常在链接器指令文件中指定内存部分。阅读链接器手册。在MPLAB C18下,没有间隙或未使用的地址。但是,在MPLAB XC8中,有些地址是未使用的,如上文所述,因此问题似乎来自编译器。我不确定您的答案,看起来非常不熟悉。我的Bootloader项目与应用程序项目是分开的,所以我不想讨论您答案的第1部分。第二部分看起来很熟悉,但我认为这不是解决问题的方法。正如我所说,问题似乎来自我正在使用的编译器。在Mplab C18下,没有未使用的地址,所有地址都被使用。然而,在Mplab XC8下,我看到程序内存中的某些地址存在间隙。它们应该被使用,但它们不是。