二分法遍歷 flash

2021-09-26 14:33:57 字數 1917 閱讀 8075

dialog的sdk沒有提供類似fds的這種檔案作業系統,da14585 的話基本上也用不著。目前原生的dialog sdk中,僅提供了乙個叫做 spi_flash的庫函式,用於基本的flash操作。我在我們的乙個產品中,設計資料儲存結構的時候,分配了50頁(50*4096byte)用來儲存不間斷實時記錄的溫度資料,當儲存的資料量超過50頁的記錄上限後,就會擦除第一頁,在這一頁繼續記錄,第一頁滿了之後,再去第二頁。如此這般的操作,空間不夠的時候就擦除較早一些時候儲存的資料,保證永遠有空間可以用來記錄新的資料。這裡的話,有乙個需求是開機的時候要找到當前寫到哪個地方了,下乙個資料需要儲存到哪個位址?第乙個有效的記錄在哪個位置?

這裡有多種方式來實現我們的目的。這裡的話,我最初設計了乙個兩層的記錄-查詢結構。由於不想遍歷50頁的資料(太多了),這裡我新增了一頁,用於單獨記錄index資料,每新加乙個實際的溫度記錄,就會在這一頁中同步新增乙個index記錄,查由於溫度記錄的格式都是統一的,所以查詢實際記錄的時候,可以根據index的值來直接計算出對應的位置。記錄index的頁寫滿之後,直接擦除掉,從頭開始寫。

這裡的話,這個專案其實是我轉韌體做的第乙個專案,沒啥經驗。設計這個 實際記錄 + index 記錄的 資料儲存方式的時候,沒有想到要將二分法應用到flash的遍歷中。當時的想法是,遍歷一頁的資料比遍歷50頁的資料速度快多了。實際上,如果使用二分法的話,多少頁的資料都能快速遍歷完,是不需要額外設計一頁來記錄index資料的。二分法是後邊靈機一動,應用上的,但是資料結構已經設計好了,就沒有必要再修改掉。

所以目前這裡寫的二分法來遍歷,其實只是遍歷了一頁flash,當然如果有需要的話,演算法的原理不變,隨意擴充多少頁都是可以的。這裡我使用過兩種方式,一種是常規的逐個4位元組遍歷,一種是使用二分查詢的思想遍歷,當然這個和二分法查詢還是有一點區別的。這裡將兩種方法都分享一下。

為了儲存遍歷的結果,我這裡設計了乙個header,結構如下:

struct index_header;
每個溫度資料的完整記錄都以乙個不斷遞增的唯一index開始,uint32型別,占用4個位元組。當時分層設計的一頁flash,專門儲存header資訊,每儲存乙個溫度記錄,就會在這裡同步新增乙個4個位元組的對應的index。遍歷的時候,就是找這個index,如果是0xffffffff,表示這個位置沒有記錄,如果找到了,可以直接根據index計算出實際的位置。這個header包含了第乙個和最後乙個有效溫度資料的儲存位址和index。

對於flash而言,要在大量的記錄中找到目標,是需要花費很多時間的,使用二分法去查詢,會節約大量的時間。由於記憶體有限,這裡每次只會讀取4個位元組出來,但是如果記憶體足夠多,可以一次讀取幾十或者上百個位元組,這樣的話不使用二分法也能快速找到目標的。

先上**:

/**view the index page,get index and address info.

* * @return res_ok,res_read_error,res_other,

**///check first address, and then use a binary search.

int8_t check_index_binary(void) else

is_pos_writed=is_valid_data(data,index_size,index_size);

if(is_pos_writed) else

} else

// }

}if(is_find)

} } if(is_find) else

address-=read_size;

} while(address>=index_page_start);

return res_ok;

}

以上所有**均通過大量unit 測試,可靠性有充分保證。

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...