如何使用C的扩展功能-78K0(callt/callf)

本文介绍了NEC单片机中两种特殊函数:Callt与Callf。Callt函数将入口地址放置于40H-7FH区域,而Callf函数则将函数体置于800H-FFFH区域。文章详细阐述了这两种函数的优势及限制条件,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值