單片機keil C中的data, bdata, idata, hdata, pdata, code解釋

        在別處看到了一篇很不錯的文章,這裏我來轉載一下,希望能給廣大51學習者一點幫助。該文章來源是:http://www.51hei.com/mcu/3993.html

       從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內程序存儲器還分直接尋址區和間接尋址類型,以及根據51系列特點而設定的pdata類型。使用不同的存儲器,將使程序的執行效率不同,在編寫C51程序時,最好指定變量的存儲類型,這樣將有利於提高程序執行效率。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬件系統,也將有不同的編譯結果。

   在51系列中data,idata,xdata,pdata的區別:

  data: 固定指前面0x00~0x7f128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。

  idata: 固定指前面0x00~0xff的256個RAM,其中前128個RAM和data的128個RAM完全相同,只是因爲訪問的方式不同。idata是用類似C中的指針方式訪問的。彙編中的語句爲:mox ACC,@Rx.(不重要的補充:C中idata做指針式的訪問效果很好)

  xdata:外部擴展RAM,一般指外部0x0000~0xffff空間,用DPTR訪問。

  pdata:外部擴展RAM的低256個字節,地址出現在A0-A7上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好像對此有BUG,建議少用。(這是2014年的記錄,不知以後是否有改進)

   

   單片機C語言中unsigned char code table[] code是什麼作用?

    code的作用是高速單片機,我定義的數據要放在ROM(程序存儲區)裏面,寫入後就不能再更改。因爲C語言中沒辦法詳細描述存入的是ROM還是RAM,所以在軟件中添加了這一個語句代替彙編指令的作用,對應的還有data是存入RAM的意思。

    程序可以簡單的分爲code(程序)和data(數據)區,code區在運行的時候是不可以隨便更改的,data區放全局變量和臨時變量,是要不斷的改變的,cpu從code區讀取指令,對data區的數據進行運算處理,因此code區存儲在什麼介質上並不重要,像以前的計算機程序存儲在卡片上,code區也可以放在rom裏面,也可以放在 RAM裏面,也可以放在flash裏面(但是運行速度要慢很多,主要是讀flash比讀RAM要費時間),  因此一般的做法是將程序放在flash裏面,然後load到RAM裏面運行的,放到rom裏面改動不了。

   

    bdata 如何使用呢?

    若程序需要8個或者更多的bit變量,如果你想一次性給8個變量賦值的話就不方便了,又不可以定義bit數組,只有一個方法。

     char bdata MODE;

     sbit MODE_7 = MODE^7;

     sbit MODE_6 = MODE^6;

     sbit MODE_5 = MODE^5;

     sbit MODE_4 = MODE^4;

     sbit MODE_3 = MODE^3;

     sbit MODE_2 = MODE^2;

     sbit MODE_1 = MODE^1;

     sbit MODE_0 = MODE^0;

     8個bit變量MODE_n就定義好了。這是定義語句,Keil C的特殊數據類型。記住一定要sbit而不能用bit MODE_0 =MODE^0;賦值語句要是這麼寫C語言就視爲異或運算。

    

      keil生成的文件:

     .plg:編譯器編譯結果

     .hex和.bin:可執行文件

     .map和.lst: 鏈接文件

     .o:  目標文件

     .crf 、.Inp、.d和.axf 調試文件

     .opt:保存工程配置信息

     .bak: 工程備份文件

     M51文件,startup文件。

    

     普通51系列單片機存儲空間資源分佈情況:

    

     新型51單片機資源分佈情況:

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章