【STM32H757XIH6 双核】IPC 进程间通信 —— CM7 printf 重定向到 OpenAMP 发送

1. 引言

在阅读此文章前,请快速浏览上一篇从零配置 OpenAMP 的文章:
【STM32H757XIH6 双核】IPC 进程间通信 —— OpenAMP 多核异构处理器间通信框架配置

注意:这里是配置 CM7 的 printf 重定向到 OpenAMP 发送上,反过来,将 CM4 的 printf 重定向到 OpenAMP 发送上也是一样的。

2. CM7 printf 重定向

/*
 * 覆盖 syscalls.c 中的弱定义,将 CM7 的 printf 发送到 CM4。
 */
int _write(int file, char *ptr, int len)
{
  (void)file;

  if (!is_rpmsg_ept_ready(&s_ept))
  {
    /*
     * OpenAMP 尚未建立 endpoint 时,不能等待。
     * 否则启动阶段的 printf 可能永久阻塞。
     */
    return len;
  }

  while (len > 0)
  {
    int send_len = len;

    /*
     * RPMsg 单次发送长度不能无限大。
     * 使用 128 字节可以避免超过当前 OpenAMP buffer 的有效载荷大小。
     */
    if (send_len > 128)
    {
      send_len = 128;
    }

    if (rpmsg_send(&s_ept, ptr, (size_t)send_len) != 0)
    {
      return -1;
    }

    ptr += send_len;
    len -= send_len;
  }

  return 0;
}

3. CM4 回调函数修改

static int cm4_rx_callback(struct rpmsg_endpoint *rp_chnl,
                           void *data,
                           size_t len,
                           uint32_t src,
                           void *priv)
{
  char msg[64];

  memset(msg, 0, sizeof(msg));

  (void)src;
  (void)priv;

  if (len >= sizeof(msg))
  {
    len = sizeof(msg) - 1;
  }

  memcpy(msg, data, len);
  msg[len] = '\0';

  printf("%s", msg);

  return RPMSG_SUCCESS;
}

4. 测试结果

可以看到,除了 OpenAMP 初始化时用 printf 打印的结果,还有别的模块初始化时用 printf 打印的结果,说明已经完全成功了。不过有两点需要注意的是:

  1. 有大量的数据需要打印的时候,尽量加上一点延时,否则很容易卡死在 OpenAMP;
  2. 打印开始最好加上 CM4:/CM7: 用于区分两个核打印出来的数据。

image

博客导航

博客导航

posted @ 2026-09-02 15:26  膝盖中箭卫兵  阅读(14)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X