This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MessageQ调度周期

Other Parts Discussed in Thread: SYSBIOS

大家好:

自己想了解一下MessageQ在核间传递消息的调度周期。

我建立了一个实现两个核间MessageQ通信的工程,工程0对应6670的零核,工程1对应6670的1核。

每个核上只跑一个任务,用于实现MessageQ的收发,任务的优先级均设置为5。

0核给1核发MessageQ,1核收到后直接转发给0核,每次收发消息都有alloc和free的操作。

在0核的MessageQ_get函数之后用一个int数组timer记录TSCL的值。

现象:当我连续运行两个核的工程时,运行一段时间之后打断点(断点在0核的get之后,只有这一个断点)观察timer中的值,数组中相邻两值差的一为接近一万的值(我认为这是一次MessageQ调度的周期)。此时,保留程序中的断点,并且是timer可以继续用来几率TSCL的值,每次让程序自动跑到断点处停止,此时timer中的相邻两值差的一半只有5000左右。

问题:这种粗略测量MessageQ调度周期的方法,为何会在连续运行和单步运行过程中出现不同的结果?

还请各位了解的朋友解释一下。

下面附的是我的MessageQ工程的配置:

/******XDC******/
var System = xdc.useModule('xdc.runtime.System');
var SysStd = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;

/******BIOS******/
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.heapSize = 0x8000;
var Task = xdc.useModule('ti.sysbios.knl.Task');
var tsk_msgQInit = Task.create('&tsk_msgQInit_func');
tsk_msgQInit.instance.name = "tsk_msgQInit";
var tsk_msgQTest = Task.create('&tsk_msgQTest_func');
tsk_msgQTest.priority = 5;
tsk_msgQTest.instance.name = "tsk_msgQTest";

var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var semaphore0Params = new Semaphore.Params();
semaphore0Params.instance.name = "sem_msgQTest";
Program.global.sem_msgQTest = Semaphore.create(null, semaphore0Params);

/******IPC******/
var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
MultiProc.setConfig(null, ["CORE0", "CORE1"]);
var Ipc = xdc.useModule('ti.sdo.ipc.Ipc');
Ipc.procSync = Ipc.ProcSync_ALL;
var HeapBufMP = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');//固定大小的消息分配
var Notify = xdc.module('ti.sdo.ipc.Notify');
var MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ');

/* Use shared memory IPC */
MessageQ.SetupTransportProxy = xdc.module('ti.sdo.ipc.transports.TransportShmNotifySetup');
Notify.SetupProxy = xdc.module('ti.sdo.ipc.family.c647x.NotifyCircSetup');

/* Set shared memory region for all processors */
var SHAREDMEM = 0x0C000000;
var SHAREDMEMSIZE = 0x00010000;


var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.translate = false;
/**/
SharedRegion.setEntryMeta(0,
{ base: SHAREDMEM,
len: SHAREDMEMSIZE,
ownerProcId: 0,
isValid: true,
cacheEnable: true,
cacheLineSize: 64,
createHeap: true,
name: "SHAREDMEMORY",
});

  • 根据你的配置,messageQ底层使用的是shared memory进行核间通信,其通信的起始时刻取决于上层的业务对messageQ的调用如何时使用messageQ_put进行消息发送,核间通信的时长与消息的长度有关,pdk中提供了各种通信方式benchmark测试例程:C:\ti\pdk_C6670_1_1_2_6\packages\ti\transport\ipc\examples

    还有你在timer中断中是通过读取寄存器TSC来记录时间点的话,需要在同一个核上记录做差分来统计,由于不同核上的起始时间不一致,或者可以通过读取Timer count然后折算成cpu的时间。