本文簡要介紹一下本人在cortex-m3系統的stm32f10x晶元上開發的乙個日誌檔案系統(與其說是系統,不如說是小小的庫)。該庫的特點是將在stm32f10x晶元上處理資料(歷史記錄)變得簡單可靠。因為我所做的專案基本上都為監控系統,需要記錄各種各樣的日誌,並可隨時上傳至中心伺服器。利用該庫就可以很容易的使用該介面完成資料的初始化、讀取、寫入和刪除。而且隨著該庫的應用,穩定性也得到了驗證,應用到其它專案中也更有底氣了。本庫分兩部分,一部分支援內部flash,一部分支援外部flash。由於硬體設計的成本考慮,我們經常需要考慮使用內部flash或者外部flash的情況,在儲存資料量不大,而選擇的晶元內部flash空間足夠時,就可以將資料儲存在內部flash,當資料量大時,卻可以選擇儲存在外部flash,對於應用程式而言,只需要修改一下巨集定義來對映不同的庫函式即可。
通過該庫在我的專案團隊中應用,感覺對於資料儲存部分,大家都形成了共識,**基本上不用考慮flash位址如何計算,如果確保擦寫平均等……通過應用此庫,並規劃好空間分析,並設定,即可開始記錄的操作了。
以下是關於此庫的簡要說明:
內部flash採用的是nor flash,它的特點是晶元內執行,這樣應用程式就可以直接在flash快閃儲存器內執行,不必再把**讀到系統的ram中。日誌檔案系統的主要功能是以內部flash位址作為儲存空間(直接使用內部flash空間,減少硬體成本),在cortex-m3系統cpu晶元上,按頁建立的乙個日誌檔案系統。可以使用乙個或者多個連續頁建立乙個檔案系統,乙個檔案系統可以儲存乙個定長的資料,對於不定長的資料,可以按最長長度建立。日誌檔案系統提供統一的api介面來訪問內部flash中的資料,同時提供了flash空間的平均擦除演算法,提高flash的使用壽命。日誌檔案系統按記錄方式進行儲存,對於需要提供記錄方式的應用來說,利用此檔案系統可以帶來很大的便利性。例如:某監控系統需要記錄歷史告警資訊,又或某系統需要記錄操作日誌記錄等。
內部檔案系統按扇區建立記錄引導表,通過扇區引導錶可快速定位記錄位置,同時,通過扇區記錄表的資訊可以快速建立檔案的資訊(記錄數量,第一條記錄位置)等。一般情況下,每個扇區為2k,為充分利用檔案系統的優勢,記錄長度應該遠小於2k,以確保合適的空間利用率。建立扇區資料儲存可支援不定長記錄,同時儲存了資料的校驗和,同時資料寫入後會立馬會立即校驗,以確保資料成功寫入,失敗時會繼續向後寫入,以應對各種異常情況。資料儲存時會寫入的資料長度,讀取時也會有返回寫入的長度,寫入時會生成校驗,並在寫入和讀取時都會校驗。
本檔案系統具有任意時間掉電恢復功能,由於操作flash過程中,程式出現意外宕機或者掉電,程式可最大限度的保障使用者資料的安全,並對資料進行恢復。日誌檔案系統使用連續的空間作為其儲存的條件,因此,在日誌檔案系統中的記錄是有序的,不能從中間刪除記錄,以確保日誌記錄的完整性。
本說明書編寫的目的是介紹內部flash日誌檔案系統包含的api函式資訊、各函式的作用、各函式如何呼叫和它們之間的關聯以及一些結構體和常數的定義。本說明可作為初級程式設計師使用本檔案系統的程式設計師在使用flash時的參考手冊。
主要優勢:
1、 日誌化記錄結構,方便操作和維護
2、 平均擦除演算法,提高flash使用壽命
3、 異常掉電自恢復功能
4、 資料校驗功能
5、 無需作業系統支援,簡單易用
日誌檔案系統使用的方式非常簡單,通過簡單三步即可完成日誌檔案系統的使用。
(1) 定義乙個檔案描述控制代碼物件
定義檔案描述控制代碼物件,是使用前必須完成的一步,該描述定義了本檔案系統使用扇區開始位址(注意:不般在程式用不到的空間之外的連續空間)、使用扇區的數量、本檔案的區別id,本日誌檔案記錄的最大資料長度,提供了上述資訊之後,就已經定義好了乙個日誌檔案了。
檔案描述控制代碼物件一般為全域性變數,一般可在檔案範圍內使用,同時必須儲存控制代碼在整個程式執行期內有效。
(2) 初始化檔案控制代碼
定義的檔案描述控制代碼僅僅指定了檔案需要使用的空間位置,日誌記錄大小,區別id等資訊,為正式開始使用此日誌檔案,需要對其進行初始化,包括掃瞄指定flash位址的各扇區,確保與檔案描述控制代碼描述一致,當出現不一致的扇區時,將會重新初始化此扇區。同時初始化會掃瞄扇區分割槽表資訊,獲取扇區內記錄數量。
(3) 使用檔案控制代碼
當初始化成功後,就可以開始使用此日誌檔案了。包括取得日誌檔案中包括的記錄數量,讀取、刪除其中的記錄,向日誌檔案記錄中新增記錄等操作。
一段簡單應用的示例:
// 從flash中載入某一配置,成功返回0,否則返回1// 通過使用日誌檔案系統的方式,將可以占用乙個扇區來存放配置(實際上你必須這麼做-
// flash只能按扇區擦除),如此,當多次配置變更時,通過寫入一條新的配置,並刪除
// 前一條配置(置刪除標誌),正至配置寫完整個區域,才會開始刪除扇區,並開始新的寫入。
// 以下示例占用乙個扇區的空間作為配置空間,寫的配置的大小由引數設定(cfg)
lfsin_t lfs_cfg =
;int loadcfg(void)
else
}
我將在另一篇部落格中詳細說明具體的實現方式。
Cortex M3異常筆記
異常型別 cortex m3編號為1 15對應系統異常,大於等於16的全部是核心級額外部中斷,除個別異常 復位,nmi,硬fault 的優先順序被定死之外,其他異常優先順序都是可以程式設計的。如果乙個發生的異常不能即刻響應,就稱它被 懸起 pending 少數異常時不能被懸起的。乙個異常被懸起的原因...
Cortex M3復位序列
在離開復位狀態後,cm3 做的第一件事就是讀取下列兩個32 位整數的值 從位址 0x0000,0000 處取出msp 的初始值。從位址 0x0000,0004 處取出pc 的初始值 這個值是復位向量,lsb 必須是1。然後從這個值所對應的位址處取指。請注意,這與傳統的arm 架構不同 其實也和絕大多...
qemu除錯cortex m3程式
1.安裝arm none eabi arm 2011.09 69 arm none eabi.bin 2.安裝qemu 3.建立原始檔 4.arm none eabi gcc o main.elf hello.c g mcpu cortex m3 mthumb t generic hosted.ld...