如何使用C的擴充套件功能-78K0(callt/callf)
阿新 • • 發佈:2018-12-14
在NEC的微控制器裡面,有兩塊比較特殊的區域,一個是從40H-7FH;另一塊是800H-FFFH。前一塊區域叫做CALLT區域,後一塊區域叫做CALLF區域。
我們先不管這兩塊名字的由來,因為就個人來看,名字完全是當年起名人的一時興致使然。
說一下這兩兩個函式的特點:
CALLT函式:
定義一個函式的時候,如果前面加上關鍵字callt/__callt,那麼這個函式就是callt函數了。callt函式會把函式的入口地址放在40H-7FH,每個函式佔用兩個位元組,這個很好理解。當我們呼叫函式時,系統會自動地找到函式入口地址並且跳向呼叫的函式。那麼,這個函式有什麼好處呢?一、呼叫的指令之產生一個位元組,因為40H-7FH區域定址只要6位就可以了(其實真正用到的是5位,因為最後一位是0,以保證偶地址對起),還有兩位做指令碼。二、速度更快。
CALLF函式:
定義方式同callt。callf函式會把函式體放在800H-FFFH。該函式呼叫的時候是兩位元組指令,所以同樣可以節省程式碼空間,再者速度快。
速度:callt 〉callf 〉call
程式碼:callt 〈callf〈 call
既然callt和callf函式這麼好,我們把所有的函式都定義成這兩種函式不就得了嗎。
想法是好的,可現實往往是殘酷的。
因為上述兩個區域的大小都是有限制的,所以這兩種函式的個數也是有限制的。
callt不能超過32個。callf函式總的大小不能超過2K。
所以,我們應該將那些經常呼叫的函式定義成callt和callf函式。
__callt int tsub(void);
__callf int tadd(void);
void main()
{
ret_num = tadd();
ret_val = tsub();
ret_data = tmul();
while(1);
}
__callt int tsub(void)
{
int val;
return val;
}
__callf int tadd(void)
{
int num;
return num;
}
int tmul(void)
{
int data;
return data;
}