GCC-ARM 调用其他二进制的函数

问题描述

我有一个主二进制文件一个应用二进制文件。主二进制文件是用 FreeRTOS 编译的,可以访问 HAL 层,因此可以访问 uart。 应用程序二进制文件在运行时加载。现在从 App binary 我需要调用 main binary 的 uart_print 函数来记录来自 uart 的消息。除此之外,我还需要从应用程序二进制文件调用主二进制文件的其他函数。 我在网上搜索,发现 How to write dynamic loader for bare-metal arm-application 建议实现跳转表。 我有以下实现: jumptbl.h

typedef struct _MyAPI
{
  void    (*jumptbl_msg)(const char *msg);
} MyAPI;

在主二进制文件中,我已经实例化了结构:

void PrintMsg(const char* msg)
{
        HAL_UART_Transmit(&huart3,(uint8_t*)'\n',1,10);
}

__attribute__ ((section (".jumptbl"))) MyAPI main_API =
{
  &PrintMsg,};

链接描述文件中,我创建了一个放置在地址 :0x20001F00 处的部分

 .jumptbl_block 0x2001F000:
  {
     KEEP(*(.jumptbl))
  } > RAM 

然后从应用程序二进制文件调用 PrintMsg 函数

MyAPI *pAPI = (MyAPI*)(0x2001F000);
pAPI->jumptbl_msg("hello world");

但是我的程序在调用跳转函数时会出现硬故障。

另外,我尝试了另一种方法。我用arm-none-eabi-nm得到了PrintMsg的地址,直接调用了,但是程序又硬故障了。

typedef void (*t_funcPtr)(const char *);
t_funcPtr MyFunc = (t_funcPtr)0x08001af4;
MyFunc("hello world");

请您建议我如何调用从另一个二进制文件加载到地址 x 的 sec_x 部分中的一个二进制文件函数

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)