打印
[国产单片机]

关于51单片机的long型的使用方法

[复制链接]
2748|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
long add(long a, long b)
{
        return (a + b);
}

int main()
{
        long a = 1, b = 2;
        long (*padd)(long, long);
        padd = add;
        (*padd)(a, b);
        return 0;
}

程序提示..\SOURCE\MAIN.C(81): error C212: indirect call: parameters do not fit within registers
编译器是keil  用的stc12c系列的单片机

相关帖子

沙发
啥是arm|  楼主 | 2013-7-26 17:02 | 只看该作者
说明一下 这个在VC++6.0的编译环境下就好使, 但是在keil下就不行, 如果不用函数指针,keil也一切正常,加上函数指针就不行了

使用特权

评论回复
板凳
ayb_ice| | 2013-7-29 09:54 | 只看该作者
xxx

未命名.JPG (77.45 KB )

未命名.JPG

使用特权

评论回复
地板
啥是arm|  楼主 | 2013-9-3 12:48 | 只看该作者
ayb_ice 发表于 2013-7-29 09:54
xxx

没看明白 麻烦讲讲怎么回事

使用特权

评论回复
5
McuPlayer| | 2013-9-3 21:32 | 只看该作者
函数指针的调用,Keil C51的实现是把调用一个库函数,把真正的函数做为参数传进去。
long是4个字节,2个lang就是8个字节,加上函数指针的2个字节(其实是3个字节,Keil用作类别区分),这样你一组寄存器才8个就不够用了。


方法:
1、不用long类型,用小的,比如int,char
2、减少参数,比如用一个long
3、牺牲效率,用固定地址传参数,ayb_ice上面有贴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

181

帖子

0

粉丝