gpt4 book ai didi

c - 如何使用主应用程序和引导加载程序中的一项功能? (嵌入式)

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:01 25 4
gpt4 key购买 nike

首先我要说的是我开发的是基于cortex m4的嵌入式设备应用。

我有引导加载程序和主应用程序通用的功能。现在我为引导加载程序和应用程序编译源文件 2 次。但是我的双库 dfu 空间不足,我想在 ROM 中只使用一次这些功能。知道我怎样才能做到这一点?

编辑:

在某些情况下使用函数指针可能存在危险,检查我的问题 - Using pointer functions - 2 seperate applications on 1 device

最佳答案

这只是部分答案,并假设您可以使用相同的地址空间从主代码跳转到引导加载程序。然后,一种常见的技术是将您的“引导加载程序 API”作为函数指针表提供。

例如,您的引导加载程序中有以下功能:

static int do_something(void)
{
return 42;
}

static int do_something_else(int arg)
{
return arg+5;
}

然后您将在 header 中声明您的 API,如下所示:

struct bootloaderApi
{
int (*do_something)(void);
int (*do_something_else)(int arg);
};

在您的引导加载程序的实现中,您在其自己的部分中定义此表:

// this is GCC syntax, use whatever your compiler provides to specify the section
struct bootloaderApi api __attribute__((section("API"))) = {
do_something,
do_something_else
};

然后在构建引导加载程序时,确保您的部分位于合适的固定地址。当例如使用 GNU 链接器,您可以在链接器脚本中包含如下内容:

SECTIONS {
// standard sections, e.g.:
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) *(COMMON) }

// your API table:
.API 0x10000 : { *(.API) }
}

现在假定您的 API 表将放置在 0x10000 处。然后您可以执行以下操作以从您的主代码访问 API:

struct bootloaderApi *api = (struct bootloaderApi *)0x10000;

api->do_something();

所有这些只是一个草图,旨在让您了解如何以合理的方式执行此操作。这在很大程度上取决于您的目标平台和您使用的工具链。

关于c - 如何使用主应用程序和引导加载程序中的一项功能? (嵌入式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459776/

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