您的位置 首页 5G

Vxworks下的高速缓冲存储器共同性问题

1. Vxworks下的高速缓冲存储器一致性问题美国风河(WindRiver)公司的VxWorks是目前最先进的实时嵌入式操作系统。Tornade是它的集成一体开发环境。然而,vxWork

1. Vxworks下的高速缓冲存储器共同性问题

美国风河(WindRiver)公司的VxWorks是现在最先进的实时嵌入式操作体系。Tornade是它的集成一体开发环境。但是,vxWorks下编程硬件驱动程序时却存在着高速缓冲存储器共同性(Cache Coherence)的问题。该体系下有两个cache区:数据高速缓冲存储器和指令高速缓冲存储器 本文评论的高速缓冲存储器问题均指数据高速缓冲存储器。

高速缓冲存储器共同性问题是指高速缓冲存储器中的数据有必要与内存中的数据坚持同步(共同) 这个问题常发生在CPU内核与另一个设备异步拜访内存时。

高速缓冲存储器能够作业在Write-through或copyback形式。在Write-through形式下,数据输出时.体系会把数据一起写入高速缓冲存储器和内存中.这样.就确保了输出时的高速缓冲存储器共同性。但该形式却无法处理输入时的高速缓冲存储器共同性问题.在Copyback形式下。体系只写数据到高速缓冲存储器中,因而关于数据输入和输出都存在高速缓冲存储器共同性问题。

VxWorks下一般有两种办法处理高速缓冲存储器共同性问题.

(1)Cache-safe buffer(即non-cacheable 的buffer)。这种状况下,CPU读数据时会从内存中读取.而不是从高速缓冲存储器中读取:而CPU写数据时则一起写入高速缓冲存储器和内存.

该计划可通过以下两种办法完成.

* 在内存段特点中界说此段buffer,空间特点为non-cacheable;

* 在内存办理单元MMU支撑下,用cacheDmaMalloc()/cacheDmaFree()获得此段buffer。则此段buffer是non-cacheable的(留意无MMU时。分配的buffer是cacheable.此法不支撑这种状况)。

(2)关于cacheable的buffer空间,选用flush()/invalidate()函数或宏来合作读/写运用此段buffer空间.flush()将高速缓冲存储器中的数据写入内存。invalidate()则将内存中数据写入高速缓冲存储器。这两个函数都确保了高速缓冲存储器与内存同步。

实践flush()/invalidate()函数有如下两组,功用相同稍有差异:

组1:CACHE_DMA_FLUSH()函数和CACHE_DMA_INVALIDATE()函数

组2:cacheFlush()函数和cacheInvalidate()函数

第一组实践是2个宏,与cacheDmaMalloc()函数合作运用。

2. MPC860上高速缓冲存储器共同性的软件设计办法

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);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/299754.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部