TI中文支持网
TI专业的中文技术问题搜集分享网站

MSMC能不能负载8个核心的同时读取同一段空间 有没有什么需要注意的地方

如题 我使用自己制作的6678板子调试算法

目前已经成功地将openEM与sysbios相结合 并且程序运行出现了一定的效果 但是目前遇到这样一个问题

在我的openEM中 每个核心的process_job中有如下一段程序

for( i = 0; i < numFeatures; i++)
{
// index <<= 1;

fp0 = img[bbox[0] + off[0]];
fp1 = img[bbox[0] + off[1]];

// if(fp0 > fp1)
// {
// index |= 0x0001;
// }
//
// off += 2;
}

我发现 只要程序中这段话运行一段时间(小于1s) 就会出现DSP 与 CCS 卡死的状况 此时CCS的开始和暂停程序都不可能 只能终止调试

即使点了终止调试 也得比较久的时间才能退出调试模式。最后我将程序注释掉一部分来观察结果 最后发现只剩上面这两句话的时候会

出现卡死的状况。

fp0 = img[bbox[0] + off[0]];
fp1 = img[bbox[0] + off[1]];

这两句话的意思就是从img内读取两个像素点,img为一幅uint8型的图片,存放在MSMC内。因为我使用的是openEM,所以对这段

图片的读取将十分频繁,所以想问问如果8个核心同时频繁读取MSMC内同一段存储空间,是不是需要什么特别的设置?

Na Li7:

做个信号量机制吧,或者加个握手信号

Allen35065:

8核同时读写同一块区域肯定会对总线带来压力,应该考虑对内存读写做一些优化,比如用EDMA3先把一部分处理数据搬移到核内,处理完了再把结果输出。

shiyan sun:

回复 Na Li7:

如果用信号量 感觉效率实在是不高 我想用 在每次图片刷新的时候cache图片进L2 Cache里

shiyan sun:

回复 Allen35065:

Yin 你好 

我的图片是放在MSMC里的 我的想法是 可不可以在图片刷新的时候将图片数据(360*288*uint8)Cache到L2 cache里(设置了128K)

这样相当于每幅图只Cache一次 并且这样减少了MSMC的压力 因为图片数据的话只在自己的Cache里进行读取

shiyan sun:

回复 Allen35065:

Yin 你好

我的图片是放在MSMC里面的 我想是使用L2 Cache 先把推按存入Cache 之后在从Cache里读取 这样的话就会减少读取MSMC的次数

这样可以吗? 如果用Cache读取 和 IDMA读取 哪个好一点呢

shiyan sun:

回复 Allen35065:

我现在的做法是使用QDMA 将MSM的图像数据搬运到 L2 里这样每个核心只在自己的L2里读取数据

同时在QDMA搬运数据的时候 使用硬件信号量 保证每次只有一个核心顺序搬运 但是发现这样非常浪费时间。

我需要处理实时PAL数据 但是目前只是搬运数据就已经不能达到实时了 所以这个办法可能还是有点问题依旧需要改进

shiyan sun:

回复 Allen35065:

我又试了一下 还是不可以 

QDMA搬数应该没有问题 因为我可以在从核看到自己的私有L2内有图像数据

但是加上那两句读取图像像素值的句子还是会卡死 这回可是从自己的L2里读取的数据 

这是为什么呢? 而且这种卡死有什么可能的原因呢? 就是程序运行之后不能暂停了这种

Allen35065:

回复 shiyan sun:

有可能是程序跑飞了,看代码是否有改写或者溢出的风险。

shiyan sun:

回复 Allen35065:

谢谢Yin

问题最终我找到了 在这个函数外部有一个循环 循环的最大值被我弄错了 导致循环变量的值超过预计的最大值之后

接下来几个循环 以上程序都是在某个位置不断读同一个数 多核又同时都这么做就会发生问题。修改外面的循环函数之后程序就不会卡死了

赞(0)
未经允许不得转载:TI中文支持网 » MSMC能不能负载8个核心的同时读取同一段空间 有没有什么需要注意的地方
分享到: 更多 (0)