C6678的IPC移植出现Ipc_start函数报错-11

IPC移植

IPC是sysbios中必要的多核间通信模块
先说结论:是因为IPC所依赖的SharedRegion内存模块没有正确配置导致的-11错误。

下图为学习的例程:
例程地址

对照例程shmIpcBenchmark_c6678来新建自己的sysbios工程后,需要将IPC模块引入进来,但在仿写代码的过程中,发现Ipc_start();函数始终报错-11.

1.错误代码查询

对照Ipc_start函数返回的说明,在vscode中查询ipc_1_24_03_32文件夹中的其中一个返回值试着看看能不能找到对应的说明与错误代码。
确实可以查找到
然后找到错误代码-11对应的说明:
发现他的描述是这样的:
没有是运算准备好
在这里插入图片描述

2.查看完文档手册

当然这其中也走了很多错路,我在这里只展示正确的解决问题流程。
查看《IPC_Users_Guide.pdf》文档手册的第五章:IPC移植
在这里插入图片描述
这是其中的简短描述:
在这里插入图片描述
然后进行分析,一步一步排除,最后排除到了5.2中的shared region(s),这个模块在仿写例程代码的时候我在CFG文件配置中已经引入进来了,但是在这还是要跳转过去看一下。
在这里插入图片描述
这里可以看到他的简短描述:他是用于配置共享区域(也就是内存配置的问题)这让我想起来查百度的时候好像有人提到过Ipc_start()如果内存没有准备好,会导致报-11的错误。所以问题的根结基本可以认为在这里了。
在这里插入图片描述

3.对照例子纠错

例子中的CFG文件直接查看代码,查找与SharedRegion相关的部分:
发现其确实对基地址与长度做了定义,这里进一步查找相关的定义,发现例程用了switch语句自动来对基地址等相关变量做了配置,需要我们进一步查找Program.platformName相关定义。
在这里插入图片描述
在这里插入图片描述

全局变量

接下来我们需要查找Program.platformName的相关定义,点开Outline窗口下的Program然后进入图形化界面(Properties),在这里我们基本可以确定了他的变量是“ti.platforms.evm6678”:在这里插入图片描述
最后我们回到代码下,将SharedRegion的其余配置一一给入,再次运行程序发现Ipc_start();已经可以正常返回成功了。

其他错误

当在做非全部核的核间通讯时,一定会涉及到Ipc_attach函数,他会在Ipc_start以后被调用。若Ipc_attach也报错-11,则需要注意两件事情:
1.你需要确保两个核心被以编组的方式运行,因为只有两个核心的这个函数都被调用时,他才会返回成功
2.你需要确保已经将这两个核心的名称名单在cfg文件中被定义,就像现在这样:procNameList = ["CORE0", "CORE1"];

posted @ 2025-06-03 16:46  东风点点吹  阅读(20)  评论(0)    收藏  举报