日志模塊,創(chuàng)建當(dāng)天日志文件,如果日志文件存在就打開(kāi)日志文件,然后執(zhí)行步驟S32。
[0091 ] 步驟S32:阻塞等待日志隊(duì)列中的消息。
[0092]步驟S33:判斷所述消息的類(lèi)型,若所述消息為日志消息,執(zhí)行步驟S35 ;若所述消息為退出消息,執(zhí)行步驟S34。
[0093]步驟S34:當(dāng)前紙幣識(shí)別模塊的狀態(tài)為退出狀態(tài),執(zhí)行退出流程。
[0094]優(yōu)選地,所述退出消息包括:異常掉電消息、復(fù)位消息和關(guān)機(jī)消息中的一種或多種;所述退出流程,包括:退出系統(tǒng),并把所有日志緩存區(qū)中的日志消息同步到物理存儲(chǔ)器中。
[0095]步驟S35:接收日志消息,把所述日志消息寫(xiě)入日志緩存區(qū)。
[0096]步驟S36:獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài)。
[0097]優(yōu)選地,所述獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài),包括,通過(guò)命令狀態(tài)機(jī)或其他命令獲取當(dāng)前現(xiàn)金識(shí)別模塊的狀態(tài)。若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),則執(zhí)行步驟S37 ;若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),則執(zhí)行步驟S38。
[0098]優(yōu)選地,所述步驟S36之后,還包括,若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),且所述日志緩存區(qū)的日志消息小于最大預(yù)置字節(jié)時(shí),則返回執(zhí)行步驟S32。
[0099]步驟S37:若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),計(jì)算出寫(xiě)入日志空間,根據(jù)所述寫(xiě)入日志空間從日志緩存區(qū)中讀取日志消息。
[0100]步驟S37執(zhí)行完畢之后,執(zhí)行步驟S39。
[0101]步驟S38:若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),且所述日志緩存區(qū)的日志消息大于等于最大預(yù)置字節(jié),讀取日志緩存區(qū)全部的日志消息。
[0102]步驟S38執(zhí)行完畢之后,執(zhí)行步驟S39。
[0103]步驟S39:把讀取的日志消息同步寫(xiě)入到所述物理存儲(chǔ)器中。
[0104]步驟S40:把讀取的日志消息寫(xiě)入Nand Flash中。
[0105]優(yōu)選地,步驟S39與步驟S40沒(méi)有先后順序,也可以先執(zhí)行步驟S40,再執(zhí)行步驟S39,或者是步驟S39與步驟S40同時(shí)進(jìn)行。
[0106]步驟S40執(zhí)行完畢之后,返回執(zhí)行步驟S32。
[0107]優(yōu)選地,若在寫(xiě)入日志的過(guò)程中出現(xiàn)退出消息,如異常掉電消息、復(fù)位消息或關(guān)機(jī)消息等,系統(tǒng)將繼續(xù)寫(xiě)入日志消息,阻塞等待日志隊(duì)列中的退出消息,待日志消息寫(xiě)入完畢之后,進(jìn)入退出流程,退出系統(tǒng),并把所有日志緩存區(qū)中的日志消息同步到物理存儲(chǔ)器中,防止日志消息的丟失。
[0108]本實(shí)施例,通過(guò)獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài),根據(jù)不同的狀態(tài)采取不同的方法從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中,在不影響系統(tǒng)實(shí)時(shí)性的情況下,把日志消息完整記錄在現(xiàn)金識(shí)別模塊的Nand Flash,并把日志消息同步寫(xiě)入到所述物理存儲(chǔ)器中,只使用Nand Flash作為日志存儲(chǔ)單元,實(shí)現(xiàn)簡(jiǎn)單、成本低;日志消息只存儲(chǔ)在NandFlash,避免了通訊和轉(zhuǎn)存的風(fēng)險(xiǎn),安全度高;從設(shè)計(jì)原則上來(lái)講,只在空閑狀態(tài)和退出狀態(tài)進(jìn)行日志存儲(chǔ),不影響系統(tǒng)實(shí)時(shí)性,資源利用率高。
[0109]以下是本發(fā)明【具體實(shí)施方式】中提供的一種現(xiàn)金識(shí)別模塊的日志存儲(chǔ)系統(tǒng)的實(shí)施例,日志存儲(chǔ)系統(tǒng)的實(shí)施例基于上述的日志存儲(chǔ)方法的實(shí)施例實(shí)現(xiàn),在日志存儲(chǔ)系統(tǒng)中未盡的描述,請(qǐng)參考前述日志存儲(chǔ)方法的實(shí)施例。
[0110]請(qǐng)參考圖4,本發(fā)明【具體實(shí)施方式】中提供的一種現(xiàn)金識(shí)別模塊的日志存儲(chǔ)系統(tǒng)的第一實(shí)施例的結(jié)構(gòu)方框圖。如圖所示,該日志存儲(chǔ)系統(tǒng),包括:
[0111]接收模塊41,接收日志消息,把所述日志消息寫(xiě)入日志緩存區(qū);
[0112]獲取模塊42,獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài);
[0113]寫(xiě)入模塊43,若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),則從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中;若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),且所述日志緩存區(qū)的日志消息大于等于最大預(yù)置字節(jié),則從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中。
[0114]優(yōu)選地,所述獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài),包括,通過(guò)命令狀態(tài)機(jī)獲取當(dāng)前現(xiàn)金識(shí)別模塊的狀態(tài);
[0115]所述若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),則從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中,包括:若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),計(jì)算出寫(xiě)入日志空間,根據(jù)所述寫(xiě)入日志空間從日志緩存區(qū)中讀取日志消息,把讀取的日志消息寫(xiě)入Nand Flash中,其中,所述計(jì)算出寫(xiě)入日志空間,包括:
[0116]通過(guò)命令狀態(tài)機(jī)查詢(xún)當(dāng)前空閑狀態(tài)持續(xù)時(shí)間T,單位為ms ;
[0117]計(jì)算出寫(xiě)入日志空間:S = ((T.X-Bt)/Pt).Ps ;
[0118]其中,S為寫(xiě)入日志空間,單位為Byte,X為空閑時(shí)間有效利用率調(diào)節(jié)變量,Bt為系統(tǒng)擦除一個(gè)BLOCK所需時(shí)間,單位為ms,Pt為系統(tǒng)寫(xiě)一個(gè)page所需時(shí)間,單位為ms,Ps為一個(gè)page的大小,為常量,單位為Byte,T.X為空閑狀態(tài)的有效持續(xù)時(shí)間,綜上所述,上述公式可以求出空閑狀態(tài)有效持續(xù)時(shí)間最多可寫(xiě)入的日志消息。
[0119]通過(guò)命令狀態(tài)機(jī)查詢(xún)當(dāng)前空閑狀態(tài)持續(xù)時(shí)間T。X為空閑時(shí)間有效利用率調(diào)節(jié)變量,0〈X< 1,具體值根據(jù)系統(tǒng)差異進(jìn)行調(diào)節(jié)。Ps為一個(gè)page的大小,為常量,單位為Byte,系統(tǒng)不同Ps的值也可能有所差異。根據(jù)設(shè)計(jì),一次寫(xiě)入Nand Flash的日志數(shù)據(jù)量一定小于等于一個(gè)BLOCK的空間大小,Nand Flash的一個(gè)BLOCK的大小通常都在幾十K以上,一百多K也非常常見(jiàn),根據(jù)設(shè)計(jì),一個(gè)工作狀態(tài)到空閑狀態(tài)周期不可能產(chǎn)生那么多日志,通常都在IK之內(nèi),所以一個(gè)BLOCK能充分滿足一次寫(xiě)入Nand Flash的日志消息。
[0120]所述寫(xiě)入日志空間的大小小于等于一個(gè)BLOCK的大??;所述有效持續(xù)時(shí)間大于等于(Bt+Pt),以保證在空閑狀態(tài)最少可以寫(xiě)入一個(gè)page。
[0121]所述若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),且確定所述日志緩存區(qū)的大小大于等于最大預(yù)置字節(jié),則從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中,包括,若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),確定所述日志緩存區(qū)的日志消息大于等于最大預(yù)置字節(jié),讀取日志緩存區(qū)全部的日志消息,把讀取的日志消息寫(xiě)入Nand Flash中,其中,所述最大預(yù)置字節(jié)的取值滿足:
[0122]最大預(yù)置字節(jié)小于等于一個(gè)BLOCK的大??;和
[0123]最大預(yù)置字節(jié)小于等于紙幣識(shí)別模塊異常掉電安全寫(xiě)入日志大小的1/2 ;和
[0124]最大預(yù)置字節(jié)大于等于一個(gè)工作狀態(tài)到空閑狀態(tài)周期產(chǎn)生的最大日志量。
[0125]根據(jù)設(shè)計(jì),最大預(yù)置字節(jié)要同時(shí)滿足這三個(gè)相互制約的條件。
[0126]原則上根據(jù)設(shè)計(jì),工作狀態(tài)不可能出現(xiàn)日志緩存區(qū)大于最大預(yù)置字節(jié)的情況,如果出現(xiàn)則說(shuō)明系統(tǒng)設(shè)計(jì)還不夠完善,因?yàn)樵诠ぷ鳡顟B(tài)寫(xiě)入日志可能會(huì)影響到系統(tǒng)的實(shí)時(shí)性,這里設(shè)計(jì)這種情況是為程序添加保護(hù)流程。最大預(yù)置字節(jié)小于等于紙幣識(shí)別模塊異常掉電安全寫(xiě)入日志大小的1/2,是因?yàn)橥顺隽鞒膛c空閑狀態(tài)、工作狀態(tài)、寫(xiě)日志流程,處于同一日志處理流程,當(dāng)正在寫(xiě)日志時(shí),產(chǎn)生了異常掉電、復(fù)位或關(guān)機(jī)等退出事件,這時(shí)需要寫(xiě)完日志才能執(zhí)行退出流程,又因?yàn)橥顺隽鞒桃惨獙?xiě)日志,所以為保證安全寫(xiě)入所有日志,必須對(duì)工作狀態(tài)和空閑狀態(tài)寫(xiě)入的日志量做出限制,又因?yàn)椋畲箢A(yù)置字節(jié)大于等于一個(gè)工作狀態(tài)到空閑狀態(tài)周期產(chǎn)生的最大日志量,所以限制工作狀態(tài)寫(xiě)入日志的量。此外,這里不考慮外部電源設(shè)備的情況,例如UPS(不間斷電源)等情況,這里要保證出現(xiàn)異常掉電情況時(shí)日志消息能完整安全的寫(xiě)入。
[0127]綜上所述,本實(shí)施例提供的日志存儲(chǔ)系統(tǒng)通過(guò)接收模塊41接收日志消息,把所述日志消息寫(xiě)入日志緩存區(qū);獲取模塊42獲取當(dāng)前紙幣識(shí)別模塊的狀態(tài);寫(xiě)入模塊43,若所述當(dāng)前紙幣識(shí)別模塊為空閑狀態(tài),從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中;若所述當(dāng)前紙幣識(shí)別模塊為工作狀態(tài),則確定所述日志緩存區(qū)的日志消息大于等于最大預(yù)置字節(jié),從日志緩存區(qū)中讀取日志消息寫(xiě)入Nand Flash中。本實(shí)施例提供的日志系統(tǒng)在不影響系統(tǒng)實(shí)時(shí)性的情況下,把日志消息完整記錄在現(xiàn)金識(shí)別模塊的Nand Flash,實(shí)現(xiàn)簡(jiǎn)單、成本低、安全度高、資源利用率高。
[0128]請(qǐng)參考圖5,本發(fā)明【具體實(shí)施方式】中提供的一種現(xiàn)金識(shí)別模塊的日志存儲(chǔ)系統(tǒng)的第二實(shí)施例的結(jié)構(gòu)方框圖。如圖所示,該日志存儲(chǔ)系統(tǒng),包括:
[0129]打開(kāi)模塊51,打開(kāi)日志文件,創(chuàng)建日志等待線程;
[0130]阻塞模塊52,阻塞等待日志隊(duì)列中的消息;
[0131]優(yōu)選地,所述阻塞模塊52,具體用于檢測(cè)系統(tǒng)是否有消息生成,并阻塞所述消息在等待日志隊(duì)列中。
[0132]判斷模塊53,判斷所述消息的類(lèi)型;
[0133]退出模塊54,若所述消息為退出消息,則當(dāng)前紙幣識(shí)別模塊的狀態(tài)為退出狀態(tài),執(zhí)行退出流程;
[0134]優(yōu)選地,所述退出消息包括:異常掉電消息、復(fù)位消息和關(guān)機(jī)消息中的一種或多種;所述退出流程,包括:退出系統(tǒng),并把所有日志緩存區(qū)中的日志消息同步到物理存儲(chǔ)器中。
[0135]若當(dāng)前紙幣識(shí)別模塊的狀態(tài)為退出狀態(tài)