KEIL C51 和 ANSI C 的區別

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

ANSI C的標準函數庫(與之相關聯的頭文件):

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 庫函數

C51強大功能及其高效率的重要體現之一在於其豐富的可直接調用的庫函數,多使用庫函數使程序代碼簡單,結構清晰,易於調試和維護,下面介紹C51的庫函數系統。

C51提供的本徵函數是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語句來實現,這樣就大大提供了函數訪問的效率,而非本徵函數則必須由ACALL及LCALL調用。

C51的本徵庫函數只有9個,數目雖少,但都非常有用,列如下:

_crol_,_cror_:將char型變量循環向左(右)移動指定位數後返回

_iror_,_irol_:將int型變量循環向左(右)移動指定位數後返回

_lrol_,_lror_:將long型變量循環向左(右)移動指定位數後返回

_nop_: 相當於插入NOP

_testbit_: 相當於JBC bitvar測試該位變量並跳轉同時清除。

_chkfloat_: 測試並返回源點數狀態。

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

如不說明,下面談到的庫函數均指非本徵庫函數。

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

2. 絕對地址include文件absacc.h
該文件中實際只定義了幾個宏,以確定各存儲空間的絕對地址。

3. 動態內存分配函數,位於stdlib.h中

4. 緩衝區處理函數位於“string.h”中
其中包括拷貝比較移動等函數如:

memccpy memchr memcmp memcpy memmove memset

這樣很方便地對緩衝區進行處理。

 

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