久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)中的掉電存儲管理

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2013年11月06日   【字體:

各位單片機(jī)程序猿們,在單片機(jī)程序設(shè)計(jì)的時候,經(jīng)常碰到一些數(shù)據(jù)的掉電存儲問題。往往這些數(shù)據(jù)量又不是很大,但是操作起來特別麻煩。每次變更數(shù)據(jù)都得調(diào)用存儲函數(shù)進(jìn)行讀寫操作。今天總結(jié)一下近幾天的思路,對普通單片機(jī)的的NV變量的管理給出一個較為方便的操作方法。

    一般,我們的數(shù)據(jù)都由8,16,32位組成,因此,在此例中,我給出16長度數(shù)據(jù)的接口函數(shù),旨在表明這種方法的思路。具體讀者可以根據(jù)自己的使用環(huán)境,自己改進(jìn)。

    首先,說明下筆者的編程習(xí)慣,筆者在編寫單片機(jī)C程序的過程中,往往喜歡把程序中涉及的東西封裝成類似于面向?qū)ο笏枷胫械念悺0褦?shù)據(jù)結(jié)構(gòu)假想成類的屬性,把對相應(yīng)數(shù)據(jù)結(jié)構(gòu)操作的函數(shù),假想成類的方法。這種方法在實(shí)際編程過程中,往往給自己帶來很大的便利。不僅思路清晰,而且便于模塊化管理自己的程序。

    現(xiàn)在,我們創(chuàng)建兩個文件,分別為NV.h和NV.C,h文件作為NV管理的模塊。NV.h中我們來定義NV變量的數(shù)據(jù)結(jié)構(gòu)(即筆者所認(rèn)為的類的屬性)和聲明對NV操作的函數(shù)。
#ifndef    _NV_
#define _NV_

//NV操作的狀態(tài)定義
#define NV_Succeed      1

#defineNV_Failed       0
//定義16位長度的NV變量數(shù)據(jù)結(jié)構(gòu)

structNV_Struct16
{
    u16 Val;        //NV16變量的值
    u16 NVAddr;     //NV16變量在存儲器中的首地址
};
//聲明外部調(diào)用函數(shù)
extern void NV16_Get(struct NV_Struct16 *temp);
u8 NV16_Set(struct NV_Struct16 *temp,u16 val);
#endif

    在NV_Struct16中,我們封裝了一個叫做NV16的變量,其成員中有變量的值和在存儲器中的首地址。在這里,只是給它定義了一個數(shù)據(jù)的結(jié)構(gòu),并沒有定義實(shí)體變量,在C++或C#等面向?qū)ο蟪绦蛟O(shè)計(jì)方法中,這叫類的定義,并沒有創(chuàng)建類的實(shí)體。這樣做的目的,就是做到盡量把我們這個NV操作模塊從我們編寫的其他應(yīng)用程序中抽象出來。

    那么,接下來,我們就來編寫NV16變量的操作函數(shù)。在NV.C中,我們添加兩個函數(shù),一個是獲取NV變量的值,另一個是修改NV變量的值。

#include"NV.h"
#include"24CXX.h"
#defineCheckTimes          4       //寫入時校驗(yàn)次數(shù)
#defineNV8_Enable          1       //NV8使能開關(guān)        
#defineNV16_Enable         1       //NV16使能開關(guān)
#defineNV32_Enable         1       //NV32使能開關(guān)

//以下是NV_Struct16的操作函數(shù)

#ifNV16_Enable
voidNV16_Get(struct NV_Struct16 *temp)
{
    temp->Val=AT24CXX_ReadLenByte(temp->NVAddr,2);
}
u8NV16_Set(struct NV_Struct16 *temp,u16 val)
{
    u8 cnt=0;
        if(temp->Val==val)returnNV_Succeed;
    temp->Val=val;
    AT24CXX_WriteLenByte(temp->NVAddr,temp->Val,2);
    while(cnt<CheckTimes||AT24CXX_ReadLenByte(temp->NVAddr,2)!=temp->Val)
        cnt++;
    if(cnt<CheckTimes)return NV_Failed;
    else return NV_Succeed;
}

#endif
    在這個文件中,我們調(diào)用了一個24CXX.h文件中提供的24CXX的讀寫函數(shù),這部分在我們移植的過程中是需要考慮的。下面貼出這個函數(shù)的原型,如果這個都不知道怎么寫出來,那我也無語了。

//在AT24CXX里面的指定地址開始讀出長度為Len的數(shù)據(jù)
//該函數(shù)用于讀出16bit或者32bit的數(shù)據(jù).
//ReadAddr  :開始讀出的地址
//返回值     :數(shù)據(jù)
//Len       :要讀出數(shù)據(jù)的長度2,4
u32AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)

    u8 t;
    u32 temp=0;
    for(t=0;t<Len;t++)
    {
       temp<<=8;
        temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);                      
    }
    return temp;                                                  
}

//在AT24CXX里面的指定地址開始寫入長度為Len的數(shù)據(jù)
//該函數(shù)用于寫入16bit或者32bit的數(shù)據(jù).
//WriteAddr :開始寫入的地址 
//DataToWrite:數(shù)據(jù)數(shù)組首地址
//Len       :要寫入數(shù)據(jù)的長度2,4
voidAT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)


    u8 t;
    for(t=0;t<Len;t++)
    {
        AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
    }                                                 
}


    用以上方法來管理我們的NV變量,在程序中會大大地減少我們的工作量。下面來舉一個簡單的例子。記錄設(shè)備開機(jī)次數(shù),并從串口打印出來。
#include “相關(guān)頭文件”
#include "NV.H"

#define    Flag   0x33                               //存儲器初始化標(biāo)志
#define    FlagAddr    0x00
#define    PowerOnTimesAddr   0x10        //將開機(jī)次數(shù)數(shù)據(jù)存儲在0x10位置
//創(chuàng)建NV16非易失變量實(shí)體
struct NV_Struct16     PowerOnTimes;
struct NV_Struct16     MemFlag;

void NV_Init()
{
   //NV地址裝入
    MemFlag.NVAddr=FlagAddr;
    PowerOnTimes.NVAddr=PowerOnTimesAddr;
    //檢查存儲器是否初始化
    if(NV16_Get(&MemFlag)!=Flag)
    {
        NV16_Set(&MemFlag,Flag);
        NV16_Set(&PowerOnTimes,0);
    }
}

void main()
{
    u16 times;
    NV_Init();
    times=NV16_Get(&PowerOnTimes);
    NV16_Set(&PowerOnTimes,times++);
    printf("%d\n",times);
    while(1);
}
        哈哈,這樣子,你的應(yīng)用程序是不是很簡潔呀。喜歡那就嘗試下吧!

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 日本三级电影在线看 | 欧美日韩精品中文字幕 | 亚洲成av人影片在线观看 | 国产精品毛片一区二区三区 | 日韩在线视频免费观看 | 一区二区三区国产精品 | 999免费观看视频 | 久久爱黑人激情av摘花 | 久草精品视频 | 亚洲精品欧美 | 成人在线免费 | 欧美日韩中文字幕在线 | 中文字幕日韩欧美 | 少妇黄色| 成人在线观看黄 | 少妇精品久久久久久久久久 | 青草青草久热精品视频在线观看 | 久久伊人免费视频 | 国产精品久久久久久亚洲调教 | 久久成人免费 | 欧美久久精品一级黑人c片 91免费在线视频 | 国产精品视频网 | 午夜羞羞 | 日韩精品av | 激情五月婷婷丁香 | 日韩中文字幕免费在线 | 91亚洲精品国偷拍自产在线观看 | av在线伊人 | 天天射影院 | 国产分类视频 | 国产区一区 | 欧美精品一区二区三区在线播放 | 亚洲色图综合 | 成人三级电影 | www.伊人.com| 韩日在线观看视频 | 二区视频| 日韩影音 | 久久69精品久久久久久国产越南 | 国产精品18hdxxxⅹ在线 | 999久久久精品 |