日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

KEIL C51 和 ANSI C 的區(qū)別

 小菜鳥(niǎo)020 2011-03-23

  不 同系列的嵌入式系統(tǒng)的C編譯器,根據(jù)它所對(duì)應(yīng)的不同芯片系列有其各自的特點(diǎn),在這里,以KEIL公司的針對(duì)51系列的KEILC51編譯器為例,簡(jiǎn)要說(shuō)明 它與ANSI-C的主要區(qū)別,其它的編譯系統(tǒng)與ANSI-C的差別,可具體參照指定編譯系統(tǒng)手冊(cè),找出它們的不同之處。清楚嵌入式系統(tǒng)的C編譯器與標(biāo)準(zhǔn) ANSI-C的區(qū)別是用C編譯器系統(tǒng)進(jìn)行嵌入式系統(tǒng)開(kāi)發(fā)的前提條件。
    不同的嵌入式C編譯系 統(tǒng)之所以與ANSI-C有所不同,主要是由于它們所針對(duì)的硬件系統(tǒng)有其各自不同的硬件特點(diǎn),對(duì)國(guó)內(nèi)開(kāi)發(fā)人員熟悉的51系列單片機(jī),有著最為豐富的編譯系 統(tǒng),其中最為出色的當(dāng)屬KEIL(也就是大家熟知的FRANKLING,但FRANKLING只相當(dāng)于KEIL的早期產(chǎn)品,它是KEIL公司在美國(guó)銷售時(shí) 曾使用的一個(gè)品牌)。
    從頭文件來(lái)說(shuō),51系列有不同的廠家,不同的系列產(chǎn)品,如僅 ATMEL公司就有大家熟悉的89c2051、89c51、89c52以及大家不熟悉的89s8252等系列產(chǎn)品。它們都是基于51系列的芯片,唯一不同 之處在于內(nèi)部資源如定時(shí)器、中斷、I/O等數(shù)量以及功能的不同,為了實(shí)現(xiàn)這些功能,只需將相應(yīng)的功能寄存器的頭文件加載在程序中就可實(shí)現(xiàn)它們所指定的不同 功能。因此,KEILC51系列頭文件集中體現(xiàn)了各系列芯片的不同功能。
    從數(shù)據(jù)類型來(lái)說(shuō),由于8051系列器件包含位操作空間和豐富的位操作指令,直接嵌入式C與ANSI-C相比,比ANSI-C多一種位類型,使得它能如同匯編一樣,靈活的進(jìn)行位指令操作。
    從 數(shù)據(jù)存儲(chǔ)類型來(lái)說(shuō),8051系列有片內(nèi)、片外程序存儲(chǔ)器,片內(nèi)、片外數(shù)據(jù)存儲(chǔ)器,片內(nèi)程序存儲(chǔ)器還分直接尋址區(qū)和間接尋址類型,分別對(duì)應(yīng)code、 data、xdata、idata以及根據(jù)51系列特點(diǎn)而設(shè)定的pdata類型,使用不同的存儲(chǔ)器,將使程序執(zhí)行效率不同,在編寫(xiě)C51程序時(shí),最好指定 變量的存儲(chǔ)類型,這樣將有利于提高程序執(zhí)行效率(此問(wèn)題將在后面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模 式,各種不同的模式對(duì)應(yīng)不同的實(shí)際硬件系統(tǒng),也將有不同的編譯結(jié)果。
    從數(shù)據(jù)運(yùn)算操作和程序 控制語(yǔ)句以及函數(shù)的使用上來(lái)講,它們幾乎沒(méi)有什么明顯的不同,只是在函數(shù)的使用上,由于嵌入式系統(tǒng)的資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套,C語(yǔ)言 的豐富的庫(kù)函數(shù)對(duì)程序開(kāi)發(fā)提供了很大的幫助,但它的庫(kù)函數(shù)和ANSI-C也有一些不同之處,從編譯相關(guān)的不同來(lái)說(shuō),由于51系列是8位機(jī),擴(kuò)展16位字符 不被C51所支持,其次,ANSI-C所具備的遞歸特性不被C51所支持,在C51中,要使用遞歸特性,必須用REENTRANT進(jìn)行申明才能使用。
    KEILC51 與標(biāo)準(zhǔn)ANSI-C在庫(kù)函數(shù),由于部分庫(kù)函數(shù)不適合嵌入式處理系統(tǒng),因此被排除在外,如字符屏幕和圖形函數(shù),也有一些庫(kù)函數(shù)繼續(xù)使用,但這些庫(kù)函數(shù)是廠家 針對(duì)硬件特點(diǎn)相應(yīng)開(kāi)發(fā)的,它們與ANSI-C的構(gòu)成及用法都有很大不同,如printf和scanf。在ANSI-C中這兩個(gè)函數(shù)通常用于屏幕打和,接收 字符,而在KEILC51中,它們則主要用于串行數(shù)據(jù)的收發(fā)。

ANSI C的標(biāo)準(zhǔn)函數(shù)庫(kù)(與之相關(guān)聯(lián)的頭文件):

assert.h
ctype.h
errno.h
float.h
limits.h
locale.h
math.h
setjmp.h
signal.h
stdarg.h
stddef.h
stdio.h
stdlib.h
string.h
time.h

 

keil c 庫(kù)函數(shù)

本征庫(kù)函數(shù)(intrinsic routines)和非本征證庫(kù)函數(shù) Keil C51庫(kù)函數(shù)原型列表

C51強(qiáng)大功能及其高效率的重要體現(xiàn)之一在于其豐富的可直接調(diào)用的庫(kù)函數(shù),多使用庫(kù)函數(shù)使程序代碼簡(jiǎn)單,結(jié)構(gòu)清晰,易于調(diào)試和維護(hù),下面介紹C51的庫(kù)函數(shù)系統(tǒng)。

C51提供的本征函數(shù)是指編譯時(shí)直接將固定的代碼插入當(dāng)前行,而不是用ACALL和LCALL語(yǔ)句來(lái)實(shí)現(xiàn),這樣就大大提供了函數(shù)訪問(wèn)的效率,而非本征函數(shù)則必須由ACALL及LCALL調(diào)用。

C51的本征庫(kù)函數(shù)只有9個(gè),數(shù)目雖少,但都非常有用,列如下:

_crol_,_cror_:將char型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回

_iror_,_irol_:將int型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回

_lrol_,_lror_:將long型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回

_nop_: 相當(dāng)于插入NOP

_testbit_: 相當(dāng)于JBC bitvar測(cè)試該位變量并跳轉(zhuǎn)同時(shí)清除。

_chkfloat_: 測(cè)試并返回源點(diǎn)數(shù)狀態(tài)。

使用時(shí),必須包含#inclucle <intrins.h>一行。

如不說(shuō)明,下面談到的庫(kù)函數(shù)均指非本征庫(kù)函數(shù)。

第二節(jié) 幾類重要庫(kù)函數(shù)

1. 專用寄存器include文件
例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位定義,一般系統(tǒng)都必須包括本文件。

2. 絕對(duì)地址include文件absacc.h
該文件中實(shí)際只定義了幾個(gè)宏,以確定各存儲(chǔ)空間的絕對(duì)地址。

3. 動(dòng)態(tài)內(nèi)存分配函數(shù),位于stdlib.h中

4. 緩沖區(qū)處理函數(shù)位于“string.h”中
其中包括拷貝比較移動(dòng)等函數(shù)如:

memccpy memchr memcmp memcpy memmove memset

這樣很方便地對(duì)緩沖區(qū)進(jìn)行處理。

5. 輸入輸出流函數(shù),位于“stdio.h”中
流函數(shù)通8051的串口或用戶定義的I/O口讀寫(xiě)數(shù)據(jù),缺省為8051串口,如要修改,比如改為L(zhǎng)CD顯示,可修改lib目錄中的getkey.c及putchar.c源文件,然后在庫(kù)中替換它們即可。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多