找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3816|回复: 6
打印 上一主题 下一主题
收起左侧

MCU回调函数3个参数的坑

[复制链接]
跳转到指定楼层
楼主
ID:90212 发表于 2020-6-14 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
玩stc15的4串口通信,down了个单串口通信的案例,改成4串口。里面有个串口发送处理的回调函数,参数是字符串指针和字符串长度。

typedef uchar(*MB_SendDatas)(uchar *,uchar) ;

现在4串口需增加个串口号参数:
typedef uchar(*MB_SendDatas)(uchar *,uchar,uchar) ;

编译报错:error C212: indirect call: parameters do not fit within registers

定义增加了重入 reentrant 编译能通过,运行发送完正常数据后总会跟一串的0x00,调试发现字符串长度在调用 MB_SendDatas 之前是正常的,但调用之后就改变了。

不得已改回原本的两个参数,把串口号改成全局变量测试正常。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:108573 发表于 2020-6-15 08:38 | 只看该作者
感觉用51的话,太高级的C语言特性估计支持不太好,有没有大神看看是什么问题
回复

使用道具 举报

板凳
ID:67085 发表于 2020-6-16 13:12 | 只看该作者
本帖最后由 shushikuan 于 2020-6-16 13:41 编辑

使用reentrant 关键字,需要在startup.a51中指定参数堆栈首地址。比如STC15W408AS 的XRAM是 256字节,在"Large variables in XDATA" 模式时,要写成  [  XBPSTACKTOP   EQU    0FFH+1; 将堆栈顶设置为最高地址+1. ]
            
回复

使用道具 举报

地板
ID:781054 发表于 2020-6-16 15:12 | 只看该作者
是的,我也经常遇到这种问题
回复

使用道具 举报

5#
ID:781054 发表于 2020-6-16 15:12 | 只看该作者
是的,我也经常遇到这种问题
回复

使用道具 举报

6#
ID:477524 发表于 2020-8-20 14:19 | 只看该作者
一样的问题
回复

使用道具 举报

7#
ID:86450 发表于 2020-8-21 13:09 | 只看该作者
是的,我也经常遇到这种问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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