导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[liufengzhong][转帖]如何并行SDRAM服务器



No.81019
作者:liufengzhong
邮件:l_fz@sina.com
ID:149522
登陆:12次
文章数:695篇
最后登陆IP:183.13.93.245
最后登陆:2015/6/16 17:02:27
注册:2014/7/29 21:51:15
财富:3671
发帖时间:2014/9/7 15:06:09
发贴者IP:111.221.200.181
标题:liufengzhong:[转帖]如何并行SDRAM服务器
摘要:No.81019[转帖]如何并行SDRAM服务器 
亲爱的朋友们,
我尝试使用SDRAM内存条是我自己的SDRAM服务器和工作非常接近的SDRAM片项目。该数据被读取来自每一1.6us,我通过XS1-L8A-64-TQ128-C5的32位端口采样。这工作得很好,如果我用的是内部SRAM。然而,这是不幸太小所以决定为SDRAM切片的文档中的描述使用SDRAM中。我设计我自己的董事会,并成立XtimeComposer项目基于SDRAM的模块。í并行化我的应用程序,SDRAM的服务器,也需要进行数据交换快速的UART模块:

 par {
      sdram_server(sdram_c, ports);
      meas_TX(sdram_c,uart_c);
      uart_tx_fast(p_tx, uart_c, tics);
    }

数据被写入到通过sdram_buffer_write函数附带了模块的SDRAM。存储一个整数

sdram_buffer_write (c_server, bank, row, 1, writebuff);
          //Wait until idle, i.e. the sdram had completed writing.
          sdram_wait_until_idle(c_server, writebuff);

大约需要1.7us(用示波器测量),因此是太长了。所以我决定收集128整数和一步到位,这需要(与sdram_buffer_write或sdram_full_row_write)左右为10us,但当然只发生每205us写出来。所以应该有足够的时间。不幸的是,sdram_wait_until_idle功能停止测量线程10我们,所以我错过了一些传入的数据点 - 即使我融入这个函数的功能,直接写程序。这一点,我不明白:在我看来,线程并行化应确保存储在不同的核心进行同时测量螺纹继续工作。
我的问题是:
 
1, 如何避免,该函数sdram_wait_until_idle遗址的表现?我尝试了很多东西(比如我在循环移动的sdram_wait_until_idle功能的写命令之前,以减少等待时间。好了,性能的提高,但遗憾的是不够好),并阅读了大量文档,但现在经过一个星期,我有我自己没有什么更多的想法。
 
2, 我可以加速通过c_server流chanend的表现?这些应该更快,并且不需要使用之后被关闭。
 
3, 是否有可能让在多个内核上的SDRAM的服务器上运行?我已经看到了这一点,在基准测试程序,但我不知道这是否会有所帮助。这是特别真实的,因为在基准测试的性能确实不随所用的核心数。
 
我明白任何形式的帮助,并希望尽快得到您阅读。

托尔斯滕


回答:

托尔斯滕,

我有好消息告诉你 - 这是绝对有可能的。我刚刚做了一个非常类似的事情与实施音频延迟我的DSP项目,该项目是将更多的数据到SDRAM,并以更快的速度比你的需要。有几个不同的方法来实现这一目标。我用C和XC的混合物线程之间共享内存,并降低数据移动在渠道的数量,但你可能只做到了越野通过拆分成两个线程是这样的:

read_thread(chanend c_data)
{  
int buffer[128];  
while(1)  
{  
for(int i = 0; i   < 128; i++)  
{ read data into buffer }  
for(int i = 0; i   < 128; i++)  
{ c_data   <: buffer[i]; }  
}
}
write_thread(chanend c_data, chanend c_sdram_server)
{
   int buffer[128];
   while(1)
   {
      for(int i = 0; i   < 128; i++)
      { c_data :>   buffer[i]; }
      sdram_write()
      sdram_wait_idle();
   }
}


我认为,你想要做什么,应该足够快。如果这还不够快,或者如果我不明白你的问题吧,让我知道,我会看看我能不能解释一下C语言的共享内存的方法

回复:

你好,谢谢你的回答。我实现的代码,并想通了,第二for循环(为(int i = 0; I   <128;我+ +){C_DATA   <:缓冲区由[i];}})在read_thread现在需要大约20US,从而战利品性能(如wait_until_idle功能做之前)。现在,我有以下意见/问题: - 我需要使用异步信道传输,它应该可以通过“交易”通道。然而,这些都必须恰好与一个chanend定义,所以我不能包括SDRAM,chanends。所以,你也许忘记了“奴隶”,“大师”,或“交易” - 命令? - 在您的建议,您使用的SDRAM通道服务器和写程序。不过,我还需要获得该数据从SDRAM服务器返回到它传送到PC上。由于chanend只能在两个并行的线程中使用,我需要一个新的解决方案,在这里也。 - 我需要的时钟在每1.6us(微秒)的数据 - 而不是毫秒。既然你提到一个音频项目(我联想到毫秒时间),也许你误解了我的要求吗?正如你可能已经意识到,我是相当新手,那么请道歉,如果我监 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:8312毫秒 查询6次