好的,我有问题,我不知道确切的术语才能在Google上找到所需的内容。所以我希望这里有人可以帮助我。
在嵌入式设备上开发实时程序时,可能必须迭代数百或数千次,直到获得所需的结果。使用时ARM设备会很快耗尽内部闪存。因此,通常您将程序开发为驻留在设备的RAM中,一切正常。这是通过使用GCC的功能将代码分成不同的部分来完成的。
不幸的是,大多数设备的RAM比闪存要小得多。因此,在某个时间点,您的程序变得太大,无法容纳所有变量等的RAM。(选择设备的大小,使之以为以后会适合整个代码。)
经典共享对象不起作用,因为在我的环境中没有什么比动态链接器更好。没有任何操作系统。
我的想法如下:对于控制器,从RAM和闪存中执行代码都没有问题。使用正确的函数属性进行编译时,对于编译器而言,将程序的一部分放入RAM中,并将一部分放入闪存中,这也不是什么大问题。 成功运行某些功能后,我将创建一个库并将其放入闪存中。主要开发是在RAM开发的“易失性”部分完成的。这样就保留了闪存。
这里的问题是:我需要确保,只要我不刷新,就总是将库链接到完全相同的位置。因此,对于每个编译周期,单个函数必须始终位于闪存的同一地址上。如果闪存中缺少某些内容,则必须将其放置在RAM中,否则必须抛出内衬错误。
我考虑过要建立一个真正的图书馆并与之建立链接。在这里我有点迷路。我需要告诉GCC / LD链接到预链接的文件(并创建这样的预链接的文件)。
应该有可能将所有库对象放在一起并将其链接到Flash中。然后可以提取地址,并且主程序(用于RAM)可以链接到它。但是:如何执行这些步骤?
在互联网上,术语prelink
以及Linux的匹配程序。这是为了加快加载时间。我不知道该程序是否可以帮助我解决副作用。我对此表示怀疑,但我不了解其工作的内部。
您有一个好主意如何实现目标吗?
答案 0 :(得分:0)
您正在解决一个非问题。嵌入式闪存的最小写入周期通常为10,000。因此,即使您每天将其闪烁20次,也可以持续一年半。 St-Nucleo是$ 13。每天不到3便士:-)。典型的写周期甚至更长,大约为100,000。要花很长时间才能使它们磨损。
现在,如果您将它们用于动态存储,则可能要担心,这取决于使用模式。
但是要回答您的问题,您可以轻松地将代码构建到库.a文件中。但是,GCC不能保证以任何顺序链接目标代码,因为它取决于优化级别。此外,仅引入库文件中引用的函数,因此,如果您的函数调用发生更改,则可能引入或多或少的库函数。