新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Keil C51中變量的使用

        Keil C51中變量的使用

        作者: 時間:2011-06-23 來源:網絡 收藏


        3 存儲模式的必要性
        中,的存儲模式是一個可選項,如果不這個選項,則 在編譯時自動進行優選分配。但這種處理方法有以下缺點:
        ①系統不知道各種頻度,有可能對使用頻度高的變量使用了訪問速度慢的片外存儲方式,而對使用頻高的變量使用了片內存儲方式,使得程序的運行效率降低;
        ②在使用指針尋址時,由于不知道尋址對象的存儲方式,只好使用一般指針,在Keil C51中一般指針要多占用1~2個字節,并且使用時還要對存儲方式進行判斷,增加了尋址操作時間。
        如果能夠在定義變量的同時定義其存儲類型,可以高效地使用51內核單片機的存儲空間,獲得高質量的目標代碼。

        4 Keil C51變量的使用方法
        4.1 全局變量和靜態局部變量
        全局變量一般會在多個函數中被使用,并在整個程序運行期間內有效,靜態局部變量雖然只在一個函數中使用,但也是在整個程序運行期間有效。對于這些變量,應盡量選擇data型,這樣在目標代碼中就可以用直接尋址指令訪問,獲得最高的訪問速度,提高程序的工作效率。例如一個保存人數的全局變量n_g,在多個函數中都被經常用到,可以這樣定義:
        unsigned int data n_g;//對n_g賦值時使用“MOV XXH,……”指令
        4.2 數組(包括全局和局部)
        定義數組一般用idata存儲類型,在目標代碼中使用“MOV@Ri”指令進行間接尋址。如果因數組元素過多而在編譯時報錯,可以改用pdata和xdata存儲類型。
        數組定義為data存儲類型意義不大,因為既然使用數組,就是希望能夠根據某一自變量訪問數組元素。如定義X[100],一般都是為了能夠使用X[i](i是一個變量)來訪問,這樣在目標代碼中就必須使用問接尋址,所以數組沒有必要使用data存儲類型,即便使用了data存儲類型,在目標代碼中也仍然要用間接尋址指令。數組定義成idata存儲類型,在使用52內核且片內數據存儲器不夠時,會使用只能間接尋址的片內數據存儲空間。這樣,既不能降低處理速度,又擴大了可使用的存儲空間。
        4.3 供查表用的數據
        這類數據的特點是需要始終保持不變,且使用時只讀,因此應定義為code型。例如一個字形表:
        c.JPG
        全局或局部code型變量在存儲時無區別。
        4.4 非靜態局部變量
        非靜態局部變量僅在某一函數內使用,退出該函數時變量也被釋放。
        若系統使用small存儲模式,對于這些變量可以不加存儲說明,由編譯軟件自行按最優原則決定,因為僅在函數內使用的非靜態局部變量,有可能使用工作寄存器R0~R7,這樣會更快速和更節省存儲空間。例如:
        unsigned char i,j; //系統盡可能會用R0~R7存儲i和j
        若系統使用了compact或large存儲模式,則應將這些變量定義為data存儲模式,以防系統自行決定時被定義為pdagta或xdata模式而降低工作效率。
        4.5 指針
        如前所述,定義指針變量時有2個存儲類型:數據存儲類型,說明被尋址對象的存儲類型;指針存儲類型,說明指針自身的存儲類型。當數據存儲類型為xdata時,指針自身占用2個字節;當數據存儲類型為pdata以及idata等片內存儲類型時,指針自身占用1個字節;若不說明數據存儲類型,指針自身就要占用3個字節。因此,在KeilC51中使用指針時,應盡量定義數據存儲類型,但要特別注意指針中的數據存儲類型與被尋址對象的存儲類型必須一致。指針都是頻繁使用的,它要不斷被設置、修改和使用,因此它自身的存儲類型應選擇data型。例如定義一個數組時就同時定義其存儲類型,以后用指針對其尋址時就將數組的存儲類型添加到指針的數據類型中。方法如下:
        d.JPG

        存儲器相關文章:存儲器原理




        關鍵詞: 使用 變量 C51 Keil

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 博白县| 来凤县| 昌邑市| 榆树市| 台东县| 剑川县| 宁津县| 门头沟区| 仁化县| 灵武市| 明光市| 兴山县| 安顺市| 翁源县| 宜昌市| 南漳县| 鄂伦春自治旗| 噶尔县| 佛山市| 界首市| 崇明县| 沙湾县| 获嘉县| 镇江市| 左权县| 麻城市| 于田县| 榕江县| 青浦区| 阿坝县| 平山县| 龙州县| 九江县| 旺苍县| 德钦县| 延边| 湾仔区| 灵石县| 若羌县| 如皋市| 绥棱县|