var_cache.h
来自「eCos操作系统源码」· C头文件 代码 · 共 315 行 · 第 1/2 页
H
315 行
register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_DCACHE, HAL_FETCH_AND_LOCK)), \ "r"(_addr_)); \ CYG_MACRO_END// Undo a previous lock operation#define HAL_DCACHE_UNLOCK_DEFINED#define HAL_DCACHE_UNLOCK(_base_, _asize_) \ CYG_MACRO_START \ register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_DCACHE, HAL_HIT_INVALIDATE)), \ "r"(_addr_)); \ CYG_MACRO_END// Unlock entire cache#define HAL_DCACHE_UNLOCK_ALL_DEFINED#define HAL_DCACHE_UNLOCK_ALL() HAL_DCACHE_UNLOCK(0,HAL_DCACHE_SIZE)//-----------------------------------------------------------------------------// Data cache line control// Allocate cache lines for the given address range without reading its// contents from memory.//#define HAL_DCACHE_ALLOCATE( _base_ , _asize_ )// Write dirty cache lines to memory and invalidate the cache entries// for the given address range.#define HAL_DCACHE_FLUSH_DEFINED#if HAL_DCACHE_WRITETHRU_MODE == 1// No need to flush a writethrough cache#define HAL_DCACHE_FLUSH( _base_ , _asize_ )#else#error HAL_DCACHE_FLUSH undefined for MIPS32 writeback cache#endif// Write dirty cache lines to memory for the given address range.#define HAL_DCACHE_STORE_DEFINED#if HAL_DCACHE_WRITETHRU_MODE == 1// No need to store a writethrough cache#define HAL_DCACHE_STORE( _base_ , _asize_ )#else#error HAL_DCACHE_STORE undefined for MIPS32 writeback cache#endif// Invalidate cache lines in the given range without writing to memory.#define HAL_DCACHE_INVALIDATE_DEFINED#define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ CYG_MACRO_START \ register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_DCACHE, HAL_HIT_INVALIDATE)), \ "r"(_addr_)); \ CYG_MACRO_END//-----------------------------------------------------------------------------// Global control of Instruction cache// Invalidate the entire cache#define HAL_ICACHE_INVALIDATE_ALL_DEFINED#define HAL_ICACHE_INVALIDATE_ALL() \ CYG_MACRO_START \ register volatile CYG_BYTE *addr; \ HAL_CLEAR_TAGLO(); \ HAL_CLEAR_TAGHI(); \ for (addr = (CYG_BYTE *)CYGARC_KSEG_CACHED_BASE; \ addr < (CYG_BYTE *)(CYGARC_KSEG_CACHED_BASE + HAL_ICACHE_SIZE); \ addr += HAL_ICACHE_LINE_SIZE ) \ { \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_ICACHE, HAL_INDEX_STORE_TAG)), \ "r"(addr)); \ } \ CYG_MACRO_END// Synchronize the contents of the cache with memory.extern void hal_icache_sync(void);#define HAL_ICACHE_SYNC_DEFINED#define HAL_ICACHE_SYNC() hal_icache_sync()// Set the instruction cache refill burst size//#define HAL_ICACHE_BURST_SIZE(_asize_)// Load the contents of the given address range into the data cache// and then lock the cache so that it stays there.#define HAL_ICACHE_LOCK_DEFINED#define HAL_ICACHE_LOCK(_base_, _asize_) \ CYG_MACRO_START \ register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_ICACHE, HAL_FETCH_AND_LOCK)), \ "r"(_addr_)); \ CYG_MACRO_END// Undo a previous lock operation#define HAL_ICACHE_UNLOCK_DEFINED#define HAL_ICACHE_UNLOCK(_base_, _asize_) \ CYG_MACRO_START \ register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_ICACHE, HAL_HIT_INVALIDATE)), \ "r"(_addr_)); \ CYG_MACRO_END// Unlock entire cache#define HAL_ICACHE_UNLOCK_ALL_DEFINED#define HAL_ICACHE_UNLOCK_ALL() HAL_ICACHE_UNLOCK(0,HAL_ICACHE_SIZE)//-----------------------------------------------------------------------------// Instruction cache line control// Invalidate cache lines in the given range without writing to memory.#define HAL_ICACHE_INVALIDATE_DEFINED#define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ CYG_MACRO_START \ register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ register CYG_WORD _size_ = (_asize_); \ for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ asm volatile (" cache %0, 0(%1)" \ : \ : "I" (HAL_CACHE_OP(HAL_WHICH_ICACHE, HAL_HIT_INVALIDATE)), \ "r"(_addr_)); \ CYG_MACRO_END//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_IMP_CACHE_H// End of imp_cache.h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?