【发布时间】:2013-09-21 12:57:53
【问题描述】:
我正在研究 Cortex-M3。 我想在现有固件映像中添加一个功能(或 ISR)而不更新整个程序。 我可以在没有 main 的情况下编译和构建一个函数并写入闪存吗? 如果我知道这个函数的写地址,我可以用函数指针调用这个函数吗?
我们有单线程代码,没有操作系统。根本问题是在这种情况下,我们将如何创建一个安装和使用应用程序的环境。
【问题讨论】:
-
不,我们不是在尝试修补其他二进制文件。我们在单线程中有一个代码,我们没有操作系统,问题是如何创建环境以在这样的环境中安装和使用该应用程序案例。
-
您的大部分问题都可以通过 链接器 优雅地解决。查看您的工具包的文档。例如,Gnu Ld 与
gcc工具。您可以从一个模块中提取符号并在没有函数指针的情况下调用它们。即使您可以在没有链接器技巧的情况下使用纯 C 语言执行此操作,但您的代码通常会受限。如果你真的没有操作系统,那么我猜你已经有一个自定义链接器脚本。 -
是的,你可以。您将能够做什么将完全取决于您如何实现它。事实上,你可以实现一个重置向量,甚至给它一个新的向量表,这样你就可以在内存的某个地方上传一个小的引导加载程序。
-
如果您能详细解释一下您的目标,我可能会提供帮助。现在我正在为 Cortex-M3 编写引导加载程序,并且我已经完成了类似的操作。
-
这个问题 100% 恰当、切题且完整。要记住的一个主要挑战是,您使用的任何库例程(即使是不知道的,来自编译器内置函数)都必须被复制,否则您将不得不手动通知构建系统它们在内存中的位置现有图像。但是 ISR 通常应该保持相当精简,所以你可能没有问题。最后,如果系统使用闪存中的向量表运行,您将必须使用具有指向您的 ISR 的向量的新版本重新刷新该块。
标签: c embedded arm bare-metal