【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 打印的结果,说明已经完全成功了。不过有两点需要注意的是:
- 有大量的数据需要打印的时候,尽量加上一点延时,否则很容易卡死在 OpenAMP;
- 打印开始最好加上 CM4:/CM7: 用于区分两个核打印出来的数据。

博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/22808668

浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X