如题 我使用自己制作的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
问题最终我找到了 在这个函数外部有一个循环 循环的最大值被我弄错了 导致循环变量的值超过预计的最大值之后
接下来几个循环 以上程序都是在某个位置不断读同一个数 多核又同时都这么做就会发生问题。修改外面的循环函数之后程序就不会卡死了