前面提到C語言對嵌入式開發(fā)的重要性,作為C語言程序設(shè)計的核心的函數(shù),也是我們需要了解的部分。如何學習嵌入式開發(fā)程序設(shè)計中的函數(shù)?粵嵌嵌入式培訓怎么做到的。
一個較大的C語言程序一般由一個主函數(shù)和若干個子函數(shù)組成,每個函數(shù)實現(xiàn)一個特定的功能。主函數(shù)可調(diào)用其他函數(shù),其它函數(shù)之間也可相互調(diào)用。函數(shù)庫為了減輕編程工作量,將一些常用功能的函數(shù)放在函數(shù)庫中供公共使用。好的程序盡量使用函數(shù)和函數(shù)庫。函數(shù)和函數(shù)庫是基于C語言編程的基本單元。
函數(shù)的格式
嵌入式開發(fā)C語言課程給出了函數(shù)的定義性說明和原型說明。
1)定義性說明格式
其中:
存儲類說明符有static和extern2種。
類型說明符有char、unsigned、char、int、unsigned long、float、double、long double、struct、union、void等幾種。
標識符有函數(shù)名、。函數(shù)名、(。函數(shù)名)、。(。函數(shù)名)等幾種。
修飾符有Interrupt、near、far、huge等幾種。
2)原型說明格式
Extern 類型說明符[修飾符] 標識符(參數(shù)表){函數(shù)體}
類型說明符、標識符、參數(shù)表、函數(shù)體這幾項是函數(shù)定義性說明中必不可少的部分。可在程序源文件的任意處進行函數(shù)的定義說明,并被分配內(nèi)存。
有簡單類型,符合類型。為說明函數(shù)返回的是指針,在函數(shù)名前加星號。
標識符部分用以說明函數(shù)名。但函數(shù)名前加分割符“*”時,說明返回值是指針。被圓括號起如(*函數(shù)名),則標識符是函數(shù)指針。如果括號外再加分割符“*”,如“*(*函數(shù)名)”,則標識符是函數(shù)指針,且函數(shù)的返回指針類型。
(類型說明符 變量名 [,類型說明符 變量名]…)或(void)或()
其中(void)說明無參數(shù)傳入。允許用空格代替void作為參數(shù)表,即()。
函數(shù)體部分由符合語句構(gòu)成。
存儲類說明符部分。
extern——C語言的函數(shù)否是全程需存在的,在不加任何存儲類說明的情況下,都是全程序可見的。但是,如果程序為多源文件時,非定義函數(shù)的文件要調(diào)用該函數(shù)時,須加原型說明。另外,即使在定義函數(shù)的源文件中,如果在函數(shù)定義之前超前調(diào)用,也需要加原型說明,而且原型說明中必須加存儲類說明符extern。
static——為了提高函數(shù)的安全性,在進行函數(shù)的定義性說明時,加上static存儲類說明符,表示在本文件定義前和非函數(shù)定義文件中,該函數(shù)將不能被調(diào)用。它可定義需要具有內(nèi)部鏈接的全局變量或者函數(shù),即它們應(yīng)在一個單一的編譯單元里是可見的,但在外部則不可見。使用static關(guān)鍵詞限制變量的范圍。
修飾符對函數(shù)起修飾作用。
interrupt——為重要的修飾符。它將函數(shù)修飾為中斷函數(shù)。中斷函數(shù)的特點是返回類型和參數(shù)均必須為void。函數(shù)經(jīng)過interrupt修飾后,程序員只編寫中斷服務(wù)程序的主題部分,中斷服務(wù)程序中的保護現(xiàn)場前綴段和恢復(fù)現(xiàn)場的后綴段,均由編譯程序完成。另外,編譯程序還將ret指令改為reti指令。
near、far和huge——規(guī)定函數(shù)的地址類型。它將覆蓋存儲模式規(guī)定的函數(shù)缺省地址類型。它指明函數(shù)和被調(diào)用函數(shù)之間的距離的遠近。near為近調(diào)用(16位段內(nèi)地址);far為原調(diào)用(32位段間地址);huge為規(guī)范化遠調(diào)用(32為段間地址規(guī)范地址)。
示例:本函數(shù)為LED燈亮、滅顯示的控制程序段,是帶參數(shù)的函數(shù)。
(
led_state=LedStatus; /將傳遞來的參數(shù)值賦給LED狀態(tài)全局變量*/
if((LedStatus&0x01)==0x01)
rPDATB=rPDATB&0x5FF; /LED1亮/
else
rPDATB=rPDATB|0x200; /LED1滅/
if((LedStatus&0x01)==0x02)
rPDATB=rPDATB&0x3FF; /LED2亮/
else
rPDATB=rPDATB|0x400; /LED2滅/
}
示例 本函數(shù)為鍵盤初始化程序,該函數(shù)不需要參數(shù)。
void KeyboardInt(void)
{
Int value;
rI_ISPC=BIT_EINT1 //清除中斷掛起位
rEXTINTPND=0xF; //設(shè)置EXTINTPND寄存器
value=key_read();
if(value>-1)
Digit_Led_Symbol(value);
rI_ISPC=BIT_EINT1; //清除中斷掛起位
rINTCON=0x1;
}