首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Vxworks下的高速缓冲存储器一致性问题 02

Vxworks下的高速缓冲存储器一致性问题 02

  MPC860是摩托罗拉公司的32位多用途集成通信控制器.主要包括一个32位的嵌入式PowerPC core。一个通信处理模块CPM,一个系统集成模块SIM60及一个独立的快速以太网FEC模块.在VxWorks下编写MPC860的驱动程序。要保护的是CPM、FEC模块的发送/接收缓冲区描述符TXBD/RXBD及其对应的缓冲区对于MPC860开发中象BD(Buffer DescriptiOn)这样的静态空间适合采用cache-safe boffer方法。即采用第1种方法;
  而对BD域中对应的缓冲区.由于该缓冲区多是动态分配和释放,更适合采用第2种方法,即采用flush()/invalidate()函数或宏来配合读/写使用此段缓冲区空间.这样可以避免将整个的包括还未分配的空间都预先标记为non-cacheable而造成效率低下。具体可以采用下面的方法:
  (1)TXBD/RXBD放在MPC860双口RAM中。并在板级支持包BSP文件Syslib.c中的页描述符数据结构 svsPhysMemDesc[]中定义860上所有64K内存空间为non-cachable的缓冲区。从而不必做cache coherence的保护了.
  (2)对应TXBD/RXBD中数据指针域的发/收缓冲区均用cache DmaMalloc()获得(具体是指初始化时给所有接收RXBD挂接的初始缓冲区和接收帧函数中给RXBD挂接的新缓冲区.以及在应用层中使用的发送 TXBD对应的缓冲区)。而用cacheDmaFree()释放.同时发送帧函数中用cacheFlush()函数保护待发送TXBD对应的缓冲区:接收帧函数中用cache Invalidate()函数保护已经装载了接收数据的接收缓冲区。以快速以太网FEC的驱动程序为例,保护具体实现如下:
  /* FEC发送帧函数 */
  FEC_SEND_FRAME()
  {
  /* 填写发送buffer内容,实际填写在data cache中 */
  sptr_tx_buffer[i]=data;
  fec.txBd.dataPointer=(char*)sptr_tx_buffer;
  /*将填写在data cache中的内容写回内存中的实际发送buffer(即以sptr_tx_buffer为地址的内存)中*/
  cacheFlush(DATA_CACHE,sptr_tx_buffer,1518);
  /*启动发送命令,FEC控制器发送内存中buffer内容而非data cache中内容*/
  *(UINT32*)VXImmrGet()+MOT_FEC_TX_ACT_OFF))=MOT_FEC_TX_ACT;
  }
  /*FEC接收帧函数*/
  FEC_RECEIVE_FRAME()
  {
  /*取得实际接收buffer的地址*/
  pBuffer=(void*)fec.rxBd.dataPointer;
  /*将RXBD对应的内存中接收buffer中内容写回data cache中*/
  cacheInvalidate(DATA_CACHE,pBuffer,1520);
  *vptr_buffer=pBuffer;
  /*以后CPU可以安全使用接收buffer中的内容**vptr_buffer了*/
  }
  if ((pBuffer = (void *)malloc (allocBytes)) == NULL)
  return (NULL);
  /* Flush any data that may be still sitting in the cache */
  cacheClear (DATA_CACHE, pBuffer, allocBytes);
  cacheInvalidate (INSTRUCTION_CACHE, pBuffer, allocBytes);
返回列表