cuốn sách gpt4 ai đã làm

Làm cách nào để sử dụng chức năng từ ứng dụng chính và bộ nạp khởi động? (được nhúng)

In lại Tác giả: Vũ trụ không gian 更新时间:2023-11-04 01:50:01 25 4
mua khóa gpt4 Nike

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

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

biên tập:

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

câu trả lời hay nhất

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

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

static int do_something(void)
{
trả lại 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
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress