OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5794|回复: 8

关于USMART中执行函数的一个疑问

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-17
在线时间
0 小时
发表于 2014-2-17 15:47:21 | 显示全部楼层 |阅读模式
在usmart中,执行函数是用这样的方式:

void usmart_exe(void)
{
    u32 temp[MAX_PARM];
    
    ......

    switch(uamart_dev.pnum)
    {
            case 0://无参数(void类型)   
res=(*(u32(*)())usmart_dev.funs[id].func)();
break;
   case 1://有1个参数
res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
break;
   case 2://有2个参数
res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);
break;
            ......
    }
}

但是我在avr单片机(编译器为avr-gcc)中用这样的调用方式,当函数参数类型不是u32(4个字节)时,比如调用fun(char a, int b)这样的函数,参数就出错了。我调试后觉得应该是参数入栈时的问题,调用函数时每个参数入栈的字节数跟参数类型有关,比如char型入栈1个字节,u16型入栈2个字节,结果传递了实参的高8位或高16位,导致形参得到的值不对。但是为什么stm32的处理器没这个问题呢,手上没有stm32,所以想请教一下大家。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-17 16:01:12 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-17
在线时间
0 小时
 楼主| 发表于 2014-2-17 20:18:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
多谢回答,这估计就是两个不同的处理器位数不同造成的。avr是8bit的,stm32是32bit的,所以avr-gcc不会将char类型提升至32bit,应该是提升到16bit吧。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-17 21:10:29 | 显示全部楼层
回复【3楼】sarify:
---------------------------------
你定义位32位参数吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-17
在线时间
0 小时
 楼主| 发表于 2014-2-18 11:11:57 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
是啊,原来是用了uint32类型的变量作为参数传进去的,估计要修改成uint16。不过这样支持的最大参数就只能到65535了,是不是有点小啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-18 14:50:19 | 显示全部楼层
回复【5楼】sarify:
---------------------------------
用u32吧,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-17
在线时间
0 小时
 楼主| 发表于 2014-2-18 17:12:12 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
你是指函数原型中的参数都定义为u32类型的吗,比如void fun(u32 num1, u32 num2) 这样? 这样的话通用性好像就要差一些
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-18 20:13:39 | 显示全部楼层
回复【7楼】sarify:
---------------------------------
是的,通用性差一些?
何解?

或者你就针对要通过usmart调用 的几个函数,做多一层封装.
在这个函数里面再调用你的函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-17
在线时间
0 小时
 楼主| 发表于 2014-2-18 22:26:00 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我是指想让usmart跟原来一样,支持各种参数类型:u32、u16、u8等,这样的话可以很轻松在函数列表中加入任何需要调试的函数,这样就很灵活啊。一律统一成u32类型的参数的话,不就限制了只能加入参数类型为u32的函数嘛。

多做一层封装执行起来不会出什么错,但是跟我想要的效果还是不一样,就是随意加入想调试的函数,不需要中间这么麻烦的转换步骤。
感觉好像很难做到,因为函数指针原则上只能指向同一类的函数,即参数类型都是一样的才行。
想想windows编程里面的消息响应函数也是这么处理的,参数都统一成(WPARAM wParam, LPARAM lParam),两个参数都是固定长度的,都是32bit。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 07:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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