请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320C6678 工具/软件:TI-RTOS
我在 IPC 上遇到了一些问题。 我从 IPC 设计示例开始、它运行良好。 然后、我尝试将 Core0视为主内核、并将其连接到其他六个内核(Core1至 Core6)、它可以相互连接。 但是、当我将 Core6视为主内核并将其连接到 Core0至 Core5时、程序无法 通过。 这是我的主函数和.cfg 文件、您能帮助我找出哪些问题吗?
//
*版权所有(c) 2012,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在
*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经
事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、
不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
**/
/*
*=== notify_multicore.c ===
* Notify 示例的单映像版本
*
请参阅 notify_multicore.k 文件以了解预期的输出。
*/
#include
/*-------------------- XDC.Runtime 模块头*/
#include
/*-------------------- IPC 模块接头 */
#include
#include
#include
/*-------------------- BIOS6模块标题 */
#include
#include
#include
/*-------------------- 从.cfg 头*/
#include 获取全局变量
#define interrupt_line 0
/*通知应用程序使用的事件编号*/
#define EventID 10
#define masterProc 6
#define sloverNum 6
uint16received_num=0;
/*
=== cbFxn =====
*此函数已向 Notify 注册。
将任何事件*发送到该处理器时调用该函数。
//
void cbFxn (uint16 ProcID、uint16 lineId、
uint32 EventID、uArgarg、uint32有效载荷)
{
if (ProcID!=masterProc)
{
received_num ++;
if (received_num = sloverNum)
{
received_num = 0;
semaphore_post (semHandle);
}
}否则{
semaphore_post (semHandle);
}
}
*=
= tsk0_func ====
*向下一个处理器发送一个事件,然后在信标上挂起。
*信标由回调函数发布。
//
void tsk0_func (UArg0、UArg0 arg1)
{
int i = 0;
INT 状态;
if (MultiProc_self ()=masterProc){
while (I <sloverNum){
状态= Notify_sendEvent (i、interrupt_line、EventID、i、true);
if (status <0){
继续;
}
system_printf ("materCore 已将事件发送到 slaveCore %d\n",i);
i++;
}
system_printf ("已发送所有事件\n");
Semaphore_pend (semHandle、BIOS_WAIT_FOREVE);
system_printf ("所有从内核都已从主控器件接收到事件\n");
}
否则{
Semaphore_pend (semHandle、BIOS_WAIT_FOREVE);
状态= Notify_sendEvent (masterProc、interrupt_line、EventID、2、true);
if (status < 0){
System_abort ("sendEvent to MasterCore Failed\n");
}
system_printf ("slaveCore %d 已将事件发送到主内核"、MultiProC_self());
}
}
/*
=== main ====
*同步所有处理器(在 IPC_START 中)、调用 BIOS_START 和寄存器
*以接收事件
*/
int main (int argc、Char* argv[])
{
INT 状态;
int ProcID = 0;
status = IPC_START();
如果(状态< 0){
system_abort ("IPC_start failed\n");
}
if (MultiProc_self ()=masterProc){
while (ProcID < sloverNum)
{
while (IPC_Attach (ProceID))}{
Task_sleep (1);
}
status = Notify_registerEvent (ProcID、interrupt_line、EventID、(Notif_FnNotifyCbck) cbFxn、NULL);
if (status < 0)
{
System_abort ("Notify_registerEvent for sloverCore1 failed"
);}+
}
否则{
while (IPC_Attach (masterProc)){
Task_sleep(1);
}
状态= Notify_registerEvent (masterProc、interrupt_line、EventID、(Notif_FnNotifyCbck) cbFxn、NULL);
if (status <0){
system_abort ("Notify_registerEvent for sloverCore1 failed\n");
}
}
BIOS_start();
return (0);
}
//*
//*
@(#) ti.sdo.ipc.examples.multicore.evm667x;1、0、0、0、0、1; 5-22-2012 16:36:06;/db/vtree/library/trees/ipc/ipc-h32/src xlibrary
*/
//
*版权所有(c) 2012,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在
*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经
事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、
不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*//
var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
//
*获取构建设备支持的名称列表。
*即["CORE0"、"Core1"、"Core..."。]
//
var namelist = MultiProc.getDeviceProcNames ();
//
*由于这是一个单映像示例,因此我们(在构建时)不
会为哪个*处理器构建。 因此、我们提供'null'
*作为本地 procName、并使用 MultiProc_setLocalId 在
运行时设置 ProcID *。
*/
MultiProc.setConfig(null,namelist);
var System = xdc.useModule('xdc.runtime.System');
var SysStd = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;
//应用程序中明确使用的模块*/
var Notify = xdc.useModule('ti.sdo.ipc.Notify');
var IPC = xdc.useModule('ti.sdo.ipc.Ipc');
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.heapSize = 0x8000;
var 任务 = xdc.useModule('ti.sysbios.knl.Task');
var tsk0 = Task.create ('&tsk0_func');
tsk0.instance.name ="tsk0";
//为避免在 MessageQ 传输中浪费共享内存*/
对于(var i = 0;i < MultiProc.numProcessors;i++){
Ipc.setEntryMeta({
RemoteProId:i、
setupMessageQ:false、
});
}/*
同步所有处理器(这将在 IPC_START 中完成)*/
Ipc.procSync = IPC.ProcSync_PAIR;
//共享内存基址和长度*/
var SHAREMEM = 0x0C000000;
var SHAREDMEMSIZE = 0x00200000;
/*
需要定义共享区域。 IPC 模块使用此
*制作可移植指针。 所有处理器都需要添加此
*调用及其共享存储器区域的基址。
*如果处理器无法访问内存,请勿添加。
*/
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.setEntryMeta(0、
{基地址:SHAREMMEM,
Len:SHAREDMEMSIZE、
ownerProId:0、
IsValid:true、
名称:"DDR2_RAM"、
});
//创建计数为0的信号量*/
var 信号量= xdc.useModule('ti.sysbios.knl.Semaphore');
Program.global.semHandle = semaphore.create(0);
//
*@(#) ti.sdo.ipc.examples.multime.evm667x;1、0、0、0; 5-22-2012 16:36:06;/db/vtree/library/trees/ipc/ipc-h32/src xlibrary
*/