搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2010-12-25 15:05:04 | 显示全部楼层 |阅读模式
在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;
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 08:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表