Я работаю с микроконтроллером, который имеет внешнюю EEPROM, содержащую таблицы информации.
Существует большое количество информации, однако есть большая вероятность, что мы будем запрашивать один и тот же информационный цикл, еслимы достаточно «стабильны» - например, если мы находимся при постоянной температуре.
Чтения из EEPROM занимают около 1 мс, а у нас около 30 за цикл.Наш цикл в настоящее время составляет около 100 мс, поэтому есть существенная экономия.
Поэтому я смотрю на реализацию кэш-памяти RAM.Удар должен быть значительно быстрее, чем 1 мс, поскольку ядро микроконтроллера работает на частоте 8 МГц.
Поиск включает 16-битный адрес, возвращающий 16-битные данные.Микроконтроллер 32-битный.
Любой вклад в кэширование будет принят, особенно если я полностью пропускаю метку и должен использовать что-то еще, например, связанный список или даже ранее существующую библиотеку.
Вот что я пытаюсь достичь:
-Кэш, состоящий из массива структур.Структура будет содержать адрес, данные и какой-то счетчик, указывающий, как часто к этой части данных обращаются (readCount).
- Массив будет отсортирован по адресу в обычном порядке.У меня была бы эффективная функция lookup () для поиска адреса и получения данных (предложения?)
-Если я получил ошибку в кэше, я бы отсортировал массив по readCount, чтобы определить наименее используемое кэшированное значение ивыброси это.Затем я заполнил бы его позицию новым значением, которое я нашел в EEPROM.Затем я бы переупорядочил массив по адресу.Любая сортировка будет использовать эффективную сортировку (shell sort? - не знаю, как справиться с этим с массивами)
- я бы как-то уменьшил все переменные readCount до того, что они будут стремиться к нулю, если не будут использоватьсяЭто должно сохранить постоянно используемые переменные.
Вот мои мысли (псевдокод, извинения за мой стиль кодирования):
#define CACHE_SIZE 50
//one piece of data in the cache
struct cacheItem
{
uint16_t address;
uint16_t data;
uint8_t readCount;
};
//array of cached addresses
struct cacheItem cache[CACHE_SIZE];
//function to get data from the cache
uint16_t getDataFromCache(uint16_t address)
{
uint8_t cacheResult;
struct cacheItem * cacheHit; //Pointer to a successful cache hit
//returns CACHE_HIT if in the cache, else returns CACHE_MISS
cacheResult = lookUpCache(address, cacheHit);
if(cacheResult == CACHE_MISS)
{
//Think this is necessary to easily weed out the least accessed address
sortCacheByReadCount();//shell sort?
removeLastCacheEntry(); //delete the last item that hasn't been accessed for a while
data = getDataFromEEPROM(address); //Expensive EEPROM read
//Add on to the bottom of the cache
appendToCache(address, data, 1); //1 = setting readCount to 1 for new addition
//Think this is necessary to make a lookup function faster
sortCacheByAddress(); //shell sort?
}
else
{
data = cacheHit->data; //We had a hit, so pull the data
cacheHit->readCount++; //Up the importance now
}
return data;
}
//Main function
main(void)
{
testData = getDataFromCache(1234);
}
Я иду по совершенно неправильному пути?Любой вклад приветствуется.