加载时基地址cortex-m3裸机

我正在使用裸机环境在cortex-m3 CPU上进行项目。 由于软件升级的需要,CPU上的可执行映像可能位于闪存中的两个地址之一中,这带来了问题。映像的起始地址仅在加载时才知道,而在静态链接时不知道。 我不太确定,但我认为这并不能真正算作动态加载,但我真的会误会,因为我对此并不熟练。 如果没有操作系统且没有动态加载器,是否可以通过仅在加载时给出基地址的方式来编译和链接映像?     
已邀请:
        对于像您这样的裸机嵌入式系统,这是通过将您的代码编译/链接为可重定位代码(也称为位置独立代码)来实现的。 如何完成此操作受处理器的影响,而实际方法则由开发工具集实现,因此,您需要查阅有关交叉开发工具的文档。它通常是一组编译器和链接器选项(如果有的话,包括链接器命令脚本),这些选项确定事物的布局方式以及使用哪些寄存器访问它们。 当您在支持MMU的平台(处理器和OS)上工作时,事情变得容易一些(抱歉,不在CM3上)-然后可以将代码放置在物理内存中的任何位置,但是通过MMU,它的逻辑地址空间可以不同。因此,在链接时,可以固定代码和数据的地址,然后在加载时,通过MMU设置逻辑地址空间,而程序则不明智。 您可能还会发现其他SO问题(\“试图在cortex-m3上加载与位置无关的代码\”)也很有帮助。     
        您需要某种方式让设备确定何时将其复位,然后从两个可能的位置中的哪个位置开始执行。但是通常,裸机设备只有在重置时才运行的起始位置(某些控制器可以根据设备上某些引脚的逻辑电平从两个或更多入口点中进行选择)。 我们有类似的要求,并制定了以下方案: 需要一个小的引导加载程序-它已构建并链接为在复位时可控制CPU的程序 实际上,主程序映像已生成两次-每个可能的位置一次。注意:这两个可能的加载位置是固定的,并且由引导加载程序知道。 程序映像的开头有一个小的数据结构,其中包含对引导加载程序重要的几位信息。其中包括程序的入口地址和程序映像的校验和 引导加载程序检查固定的已知位置,以对两个可能的映像进行校验和。 如果找不到有效的图像,它只会循环(看门狗将重置设备,但这并不重要-在加载有效的主程序之前,它是一块砖) 如果它只找到一个有效的图像,那就是它跳转到的入口点。 如果发现两个图像均有效,则它将使用数据结构中的其他信息来确定要对哪个图像进行控制(版本信息,最新已知商品,无论您的策略可能是什么)。 这样做的关键是引导加载程序必须简单而愚蠢。它不容易升级,因此您希望它足够愚蠢以至于没有错误。 现在,可以通过将映像刷新到非运行位置来在运行时升级设备(我们拥有的Cortex-M3设备允许这样做-如果LPC1758不允许这样做,那么您必须拥有一些从RAM运行执行Flash更新)。重置,引导加载程序将拾取新刷新的映像。 该系统需要做一些前期工作才能使引导加载程序运行并坚如磐石,但是一旦运行正常,更新就会100%可靠(如果新的闪存未完成,则旧映像是唯一的映像)校验和,因此它将在下次重置时运行-无积木)。主要缺点(也是一个很大的缺点)是,由于闪存必须能够保存两个相互竞争的映像,因此您实质上损失了主程序一半的闪存地址空间。     

要回复问题请先登录注册