嵌入式系统中的CACHE问题
“non-cacheable”即可。然而,动态缓冲区在释放时要标为“cacheable”,否则内存总会产生大量的缓冲区碎片。
下面给出一个高性能的驱动程序例子,它把更新/无效的概念进行了扩展。不是对整个CACHE系统,而是对每一个缓冲区都这样做。即通过分配对CACHE安全的缓冲区,在一个缓冲区的基础上操作,从而防止了不需要的更新/无效操作。在这个例子中使用了CACHE库中的函数cacheDMAMalloc??,宏CACHE_DMA_INVALIDATE和CACHE_DMA_FLUSH实现一致性。在第4行调用函数cacheDMAMalloc??后,如果指针返回为非空,则说明分配到了一块对于一致性问题来说是安全的缓冲区。
第7行驱动程序在缓冲区中写入要传给外部设备的数据,在第9行准备传给外设之前,驱动程序必须更新数据CACHE以保证要传的数据是在内存中,而不是在CACHE中。
当驱动程序准备读外设传给内存的数据,在第13行驱动程序处理这些数据之前,必须使数据CACHE中对应于输入缓冲区的那部分无效以消除这些包含过时内容的条目。之后,驱动程序才能安全地处理从内存中取来的输入数据。
1:?STATUSdrvExample?pBuf?
2:?void?pBuf?/?缓冲区指针?/
3:{/*?
4:?pBuf=cacheDMAMalloc?BUF_SIZE??
5:?if?pBuf==NULL?
6:?return?ERROR??/?内存分配失败?/
7:?/?其它初始化代码和向发送缓冲区填数据?/
8:?CACHE_DMA_FLUSH?pBuf?BUF_SIZE??
9:?drvWrite?pBuf??/?向外设发送数据?/
10:?……/?其它代码?/
11:?drvWait???/?等待外设来的数据?/
12:?CACHE_DMA_INVALIDATE?pBuf?BUF_SIZE??
13:?/?处理外设来的数据?/
14:?cacheDMAFree?pBuf??/?释放内存?/
15:?return?OK??
16:}
《嵌入式系统中的CACHE问题(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/168813.html
下面给出一个高性能的驱动程序例子,它把更新/无效的概念进行了扩展。不是对整个CACHE系统,而是对每一个缓冲区都这样做。即通过分配对CACHE安全的缓冲区,在一个缓冲区的基础上操作,从而防止了不需要的更新/无效操作。在这个例子中使用了CACHE库中的函数cacheDMAMalloc??,宏CACHE_DMA_INVALIDATE和CACHE_DMA_FLUSH实现一致性。在第4行调用函数cacheDMAMalloc??后,如果指针返回为非空,则说明分配到了一块对于一致性问题来说是安全的缓冲区。
第7行驱动程序在缓冲区中写入要传给外部设备的数据,在第9行准备传给外设之前,驱动程序必须更新数据CACHE以保证要传的数据是在内存中,而不是在CACHE中。
当驱动程序准备读外设传给内存的数据,在第13行驱动程序处理这些数据之前,必须使数据CACHE中对应于输入缓冲区的那部分无效以消除这些包含过时内容的条目。之后,驱动程序才能安全地处理从内存中取来的输入数据。
1:?STATUSdrvExample?pBuf?
2:?void?pBuf?/?缓冲区指针?/
3:{/*?
4:?pBuf=cacheDMAMalloc?BUF_SIZE??
5:?if?pBuf==NULL?
6:?return?ERROR??/?内存分配失败?/
7:?/?其它初始化代码和向发送缓冲区填数据?/
8:?CACHE_DMA_FLUSH?pBuf?BUF_SIZE??
9:?drvWrite?pBuf??/?向外设发送数据?/
10:?……/?其它代码?/
11:?drvWait???/?等待外设来的数据?/
12:?CACHE_DMA_INVALIDATE?pBuf?BUF_SIZE??
13:?/?处理外设来的数据?/
14:?cacheDMAFree?pBuf??/?释放内存?/
15:?return?OK??
16:}
《嵌入式系统中的CACHE问题(第3页)》