kumosheng 发表于 2010-12-25 15:05:04

(转载)如何使用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)
{
    intval;
    return val;
}
__callf int tadd(void)
{
int num;
return num;
}
int tmul(void)
{
int data;
return data;
}
页: [1]
查看完整版本: (转载)如何使用C的扩展功能-78K0(callt/callf)