当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 1. Vxworks下的高速缓冲存储器一致性问题美国风河(WindRiver)公司的VxWorks是目前最先进的实时嵌入式操作系统。Tornade是它的集成一体开发环境。然而,vxWorks下编程硬件驱

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭