...
File accesses often incur repeated reading of the same volume sectors. On a FAT volume, these may be sectors in the root directory, the area of the file allocation table (FAT) from which clusters are being allocated or data from important (often-read) files. A cache wedged between the system driver and volume layers (as shown in Volume cache architecture) will eliminate many unnecessary device accesses. Sector data is stored upon first read or write. Further reads return the cached data; further writes update the cache entry and, possibly, the data on the volume (depending on the cache mode).
Panel |
---|
borderWidth | 0 |
---|
title | Volume cache architecture |
---|
|
Image Added |
A cache is defined by three parameters: size, sector type allocation and mode. The size of the cache is the number of sectors that will fit into it at any time. Every sector is classified according to its type, either management, directory or file; the sector type allocation determines the percentage of the cache that will be devoted to each type. The mode determines when cache entries are created (i.e., when sectors are cached) and what happens upon write.
Panel |
---|
borderWidth | 0 |
---|
title | Cache types |
---|
|
Cache Mode | Description | Cache Mode #define |
---|
Read cache | Sectors cached upon read; never cached upon write. | FS_VOL_CACHE_MODE_RD | Write-through cache | Sectors cached upon read and write; data on volume always updated upon write. | FS_VOL_CACHE_MODE_WR_THROUGH | Write-back cache | Sectors cached upon read and write; data on volume never updated upon write. | FS_VOL_CACHE_MODE_WR_BACK |
|
Choosing Cache Parameters
Cache is an example using the cache for the volume “sdcard:0:”. The cache is used in write back mode, and the cache parameters are:
25% of cache size is used for management sector, 15% is used for directories sectors and the remaining (60%) is used for file sectors.
Code Block |
---|
language | cpp |
---|
linenumbers | true |
---|
|
FSVol_CacheAssign ((CPU_CHAR *)"sdcard:0:", /* <-- volume name */
(FS_VOL_CACHE_API *) NULL, /* <-- pointer to vol cache API */
(void *)&CACHE_BUF[0], /* <-- pointer to the cache buf */
(CPU_INT32U ) CACHE_BUF_LEN, /* <-- cache buf size in bytes */
(CPU_INT08U ) 25, (1)
(CPU_INT08U ) 15, (2)
(FS_FLAGS ) FS_VOL_CACHE_MODE_WR_BACK, /* <-- cache mode */
(FS_ERR *)&err); /* <-- used for error code */
if (err != FS_ERR_NONE) {
APP_TRACE_INFO ((" Error : could not assign Volume cache"));
return;
}
pfile = FSFile_Open("sdcard:0:\\file.txt",
FS_FILE_ACCESS_MODE_WR |
FS_FILE_ACCESS_MODE_CACHED,
&err);
if (pFile == (FS_FILE *)0) {
return;
}
/*
DO THE WRITE OPERATIONS TO THE FILE
*/
FSFile_Close (pFile, &err);
FSVol_CacheFlush ("sdcard:0:", &err); /* <-- Flush volume cache. */ |
Code Block |
---|
|
(1) Percent of cache buffer dedicated to management sectors.
(2) Percent of cache buffer dedicated to directory sectors. |
The application using μC/FS volume cache should vary the third and fourth parameters passed to FSVol_CacheAssign()
, and select the values that give the best performance.
...