嗨,我正在研究一个定制的RS-485总线引导加载程序,在相同的时间将用户应用程序上传到多个设备。我正在用汇编语言编写Bootloader,使它尽可能小。目前,我基本掌握了引导加载程序的概念,但有一件事对我来说仍然很模糊。目前我正在使用PIC16F690微控制器来开发引导加载程序。根据存储器编程规范(DS41204),MCU的存储器组织形式如下:
http://foto.modelbouwforu...emory_orginization.png程序存储器从0x000映射到0x0FFF,例如4096个空格。目前,我计划在程序空间顶部实现引导加载程序。然后,引导加载程序将把用户应用程序放在保留的引导加载程序内存之后,重定向重置和中断向量,以及所有这些好东西;)就这一点而言,我完全理解引导加载程序的概念。然而,当涉及到配置词时,我感到有点困惑。根据数据表,在用程序员对MCU进行编程之后,不可能更改配置字,因此在将引导加载程序烧录到MCU之后,我将不能更改配置位。这意味着在引导加载程序本身中设置的所有配置位也适用于稍后通过引导加载程序上传到芯片的用户程序员。只要配置字被正确地配置以便它同时适用于引导加载程序和用户应用程序,这应该不是问题。但是现在假设某人在他的/她的应用程序中配置了配置字。当编译这个应用程序时,十六进制文件包含有关它不应该包含的配置字的信息,例如:一旦编译,我们得到一个十六进制文件,它看起来像下面这样:如果我们剖析那一行特定的机器代码,我们将得到以下结果:问题是引导加载程序:由于程序存储器是可访问的(0x000到0x0FFF),所以不能写入这个特定的存储器地址。如果我的PC应用程序用引导加载程序把这一行特定的机器代码发送到我的PIC16F690,那么它将导致一个循环,因为我们试图写入超出允许的存储器位置(数据表在第2.1段中提到了这一点)。这肯定会导致问题,因为它会覆盖内存的特定部分。那么,当我遇到这种情况时,我该怎么办呢?我想一旦PC应用程序加载了十六进制文件,就检查它,并省略任何超出可访问内存区域的代码。我想这会起作用,但对我来说似乎是一种蛮力的解决办法。我搜索了不同的BooLoad,但我无法找到其他BooLoops/PC应用程序如何处理这个问题。谁能帮我解释一下这个话题?如果有什么不清楚的地方,请让我知道,这样我就可以重新回答我的问题了。