从SD卡读出记录后排序的问题

2019-12-18 18:47发布


现在有个单片机项目,需要做一个历史记录,每次发生此事件后存入SD卡,再进入到历史记录查询页面的时候,将SD卡的数据读出来显示到屏幕上,并且得按时间排序,最新的时间要显示在第一条
记录的内容格式是  序号         日期              /时间              /内容   
                   比如是  1          2018-09-21     11:09             柜门打开
                               2          2018-09-20     11:09             柜门关闭
                               3          2018-09-19     11:09             xxxx
                               4          2018-09-18     11:09             xxxx

因为如果按照正常来说,随着时间的增长,SD卡也在保持正增长,这样从后往前读,读出来的就是正序了, 如果时间久了,SD卡容量满了,要删除掉最早之前的那条记录占得物理位置,再在此位置写入一条新纪录,
像这种情况就不知道怎么做了, 并且还有个问题, 如果后来时间校准了, 这也就乱了。
个人认为最好的办法是全部读出来然后按时间排序,但是没有做过这方面的数据结构,请教一下各位有经验的大佬们该怎么做,麻烦指点一下给个思路,非常感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
dukelec
2019-12-19 18:23
本帖最后由 dukelec 于 2018-9-21 14:57 编辑

每次掃描全部記錄,內存只記錄上一次打印數據的時間信息和一份數據,掃描過程始終用大於並最接近上一次打印時間的數據替換當前數據,掃描完之後打印結果數據,然後重新整盤掃描直到掃不到更新時間的數據。

進階操作:
先把數據每 20 條一組,先掃描各組的最老時間和最新時間,每當掃描的結果位於某組數據,則除去之後重新更新該組數據的最老時間。
具體掃描過程和基本操作相同,只不過可以先快速定位到某個組,然後組內掃描,可提升效率。

另外就是,如果 MCU 內存很大,足以存放所有數據的頭(把頭和數據本體分開以減少內存使用),那麼先把所有頭讀到內存並使用鏈表存放,每讀一個都按時間順序插入鏈表。
然後順序遍歷鏈表打印數據即可。

最好的做法是,直接把 SD 卡當 RAM,其中所有記錄都按照鏈表存放即可(相當於一個簡化的文件系統,第一個 page 存放鏈表頭)。
鏈表的內存佈局建議使用靜態內存分配,簡單來說就是定義一個數組,譬如:(儘量做到整數個元素可以正好一個 page 或一個 block 大小)
  1. #define FRAME_MAX 10
  2. static cd_frame_t frame_alloc[FRAME_MAX];
  3. static list_head_t frame_free_head = {0};

  4. ...
  5.     for (i = 0; i < FRAME_MAX; i++)
  6.         list_put(&frame_free_head, &frame_alloc[i].node);
  7. ...
复制代码
初始化好之後,就不用理會 frame_alloc 數組了。

用 SD 卡存放鏈表,其指針操作要特殊處理(要先把對應偏移的數據塊讀到內存,然後再訪問)。

一周热门 更多>