1. 程式人生 > >如何使用C的擴充套件功能-78K0(callt/callf)

如何使用C的擴充套件功能-78K0(callt/callf)

在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;  }