gpt4 book ai didi

c - Flash 中的两个不同程序

转载 作者:行者123 更新时间:2023-11-30 16:03:25 25 4
gpt4 key购买 nike

是否可以一次运行一个存储在闪存(微 Controller )中的 2 个不同的 C 程序(即 2 个 main())?

我有一个引导加载程序代码,它是一个单独的程序,驻留在 ROM 的单独 protected 部分中。然后我的应用程序位于单独的 ROM 部分。虽然驻留在内存中不是问题,但是链接器将如何解释这一点?如何在两个程序之间切换。这可能吗?

例如:一旦我完成了引导加载程序,我可以让它跳转到应用程序功能,但是链接器如何知道这个功能?

补充一下,我使用的是Freescale HCS08系列,IDE是Codewarrior。

此外,以下是步骤顺序:我在 ROM 中加载引导加载程序代码。然后需要这个引导加载程序代码来加载我的应用程序代码。然后我的应用程序代码应该接管。

引导加载程序代码:程序应用区ROM启动应用程序

应用程序代码:检查是否运行引导加载程序代码或应用程序本身。

最佳答案

Main 只是一个函数。您可以重命名它并编写另一个 main 来调用它们中的任何一个。

如果您不想在源代码中重命名 main,您可以通过定义或编译器键来修改其名称:

cc -Dmain=main1 ...

(对于第一个程序),以及

cc -Dmain=main2 ...

(第二个)。选择器主:

int main(void) {
if(x) return main1();
else return main2();
}

然后将所有内容链接在一起并下载到您的 Controller 。

但是 ISR 存在问题:您无法将两个例程分配给单个 irq vector 。如果 vector 被硬编码到某个闪存位置(如大多数 8 位 Controller ),则无法切换 ISR。您必须编写 ISR 包装器,识别正在运行的程序并调用适当的 ISR。

UPD第二个问题是,来自第一个和第二个程序的静态链接变量将同时位于 RAM 中,而仅使用其中一组。这可能会过早耗尽 RAM(微 Controller 中通常存在少量 RAM)。

UPD2哦,现在我真的明白了。如果您想单独链接并下载它们,则应该处理链接器映射。在这种情况下,相同的符号名称(例如许多主符号)不是问题。在链接器映射中,您应该定义已知的入口点[将其设置为绝对地址],任一应用程序代码都从该入口点开始。启动代码(通常是汇编代码)应从此地址链接。您应该从选择器中决定并直接跳转到定义的位置。 (如果您的应用程序也是选择器,则仅对引导加载程序执行此操作)。

链接器提供的入口点可以由程序作为外部函数访问:

int app2_start(void);

{
.... /* condition check */
app2_start(); /* this symbol defined in linker map, not in any source */
}

但这不是它的 main() 的地址,因为 C RTL 在 main() 开始之前确实进行了许多初始化(堆栈、初始化变量、堆、IO 等)。

引导加载程序有更常见的方式来决定是运行自身还是应用程序,因为如果应用程序代码失败,引导加载程序可能会变得无法访问。

关于c - Flash 中的两个不同程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4160258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com