大多數軟件開發都會涉及到數據參數的保存與讀取,小至運行的單片機的軟件,大至操做系統級別的軟件(如linux,windows,mac),均會有專門的子程序或者模塊進行參數的保存和讀取。不一樣的平臺下開發,參數的保存與讀取會存在必定的差別化,例如,單片機下,保存參數是寫入eeprom或者rom,windows和linux下的軟件則會以配置文件的形式保存參數。下面以我之前在工做中所遇到狀況,重點寫寫嵌入式linux軟件是如何進行的數據參數的保存。linux
1、用數據庫來保存參數。sql
常見的嵌入式關係型數據庫SQLite,單純的用SQLite來進行配置參數數據的保存與讀取,我的以爲並非一個合理方案,有點殺雞用牛刀的意味。數據庫
在一些特定的嵌入式開發應用場景中,sqlite仍是有有武之地。例如,手機中的通訊錄(Android系統中就集成數據庫Sqlite)。windows
2、以文本的形式保存參數。app
數據以文本的形式保存到一個參數數據文件。有過windows下軟件開發經驗的同窗,必定清楚windows下配置文件---ini文件。不少windows下的應用程序採用ini的格式文件進行配置參數的保存,ini文件一樣也適用於linux下。ini的格式以下。工具
[login]spa
username=dcdclook操作系統
password=123456設計
上面提出的二進制保存數的幾個不足之處,偏偏就是文本形式保存參數的優勢。orm
咱們能夠很容易的進行數據擴展,用戶名想要定義爲17個字符?行,
[login]
username=dcdclook89abcdefghikj
password=123456
隨便一個文本編緝工具就能夠查看系統參數。保存的參數的數據內容對咱們來講是徹底可見的
因爲不關聯硬件設備文件,移植以來容易。
固然文本的形式保存參數也不可避免的存在着一個問題,解析花的時間會較二進制數據保存參數方案長那麼一點點。
其它常見的文本保存參數格式有xml,較之ini文件,xml能夠實現多層數據參數的寫入。
3、以二進制數據保存參數。
以二進制形式保存參數是非常常見的一種方案,也是不少項目組用於保存參數的一種方案。以咱們現有的軟件平臺中的方案爲例吧。
咱們的軟件平臺基於嵌入式linux, flash芯片容量是16M,flash芯片被分爲了五個區,以下所示,其中parameter分區用於數據參數的存儲。
|uboot|kernel|rootfs|app|parameter|
-----------------------------------------------------------------------------
uboot分區對應設備文件/dev/mtdblock0
kernel分區對應設備文件/dev/mtdblock1
rootfs分區對應設備文件/dev/mtdblock2
app分區對應設備文件/dev/mtdblock3
parameter分區對應設備文件/dev/mtdblock4
假設咱們想要保存用戶名與密碼。
一、定義一個結構體,結構體成員包含用戶名與密碼
struct_Parameter{
charusename[16];
charpassword[16];
};
intfd=-1;
fd=open(/dev/mtdblock5,O_RDWR);
struct_Parametersys_parameter;
二、填充sys_parameter的成員usename和password,倘若username爲dodolook,密碼爲123456
strncpy(sys_parameter.username,「dodolook」,16);
strncpy(sys_parameter.password,「123456」,16);
三、將sys_parameter以二進制的形式寫入flash分區5的映射的設備文件/dev/mtdblock4.
write(fd,&sys_parameter,sizeof(struct_Parameter));
參數的讀取
從設備文件/dev/mtdblock4讀取sizeof(struct_Parameter)大小的字節到所定義的參數結構體sys_parameter的變量地址。
intfd=-1;
fd=open(/dev/mtdblock5,O_RDWR);
read(fd,&sys_parameter,sizeof(struct_Parameter));
上述的保存參數的過程,與單片機開發的參數保證很有幾份類似之處,早期的嵌入式軟件開發工程師大多有過單片機軟件開發的經歷,在單片機中,參數會寫入一個eeprom芯片(部分單片機自身集成eeprom芯片),當有着單片機開發經歷的工程師轉行到嵌入式軟件開發,不可避免的沿續了之前的工做經驗,也許這即是咱們系統中數據參數存儲方案的來歷。
二進制數據保存參數的方案的確存在速度的優點,但同時也存在着如下幾個不是避免的問題。
一、對現有數據進行擴展極爲不便。
例如在設計時,咱們理所固然的想到,16個字符徹底足夠可以顯示一個用戶名,假設,客戶提一個特別變態的需求,須要輸入17個字符。怎麼辦?動之以情,曉之以理,勸勸客戶別提這麼變態的需求。可人客戶不聽,怎麼辦?只能從新定義結構體。這下更好了,新的參數結構體與早先的軟件不兼容。怎麼辦?定義客戶編繹開關,只有此客戶纔用到此編繹開關。行,問題是解決了,隨意的添加工編繹開關,又爲後期的維護埋下的定時炸彈。
二、沒法直接查看編緝參數。
保存的參數對咱們來講是不透明的,不可交互的。在軟件開發,咱們經常遇到因爲參數區數據被破壞而引起的bug,咱們爲會拷貝參數區到一個文件,與正常的參數區二進制進行對比,以肯定參數區是否被破壞。存入參數區的數據爲二進制數據,二進制式數據對咱們來講,幾乎不具備可讀性,進而影響到軟件的可維護性。
三、軟件移植起來困難。
若是咱們想把軟件從嵌入式平臺移植linux(或者windows)下進行開發,因爲參數保存關聯到設備文件/dev/mtdblock4,會給移植形成必定的阻礙。
想必各位看了這篇文章以後必定會有所收貨,若想了解更多相關知識請繼續鎖定希賽系統學院!