Sky_chen4 发表于 2025-4-8 12:44:43

求助!

set_i2c_cmd(I2c0, 0, S_Tx_Rack, 0x71, Rx_Tack, &hum, Rx_Tack, &hum, Rx_Tack, &hum, Rx_Tack, &hum,Rx_Tack, &hum,Rx_Tack, &hum,Rx_Tack, &hum,Stop, Cmd_End);这是一个IIC读取AHT30温湿度传感器的代码片段,程序报错“error C187: 'set_i2c_cmd': size of actuals exceeds 'maxargs'”我减小参数倒是不报错了,但是读取不完全了,治标不治本。求解决方案{:4_167:}

国芯人工智能 发表于 2025-4-8 12:53:00

在您提供的代码片段中,seti2ccmd函数的参数数量超出了编译器允许的最大参数数量限制,导致报错“error C187: 'seti2ccmd': size of actuals exceeds 'maxargs'”。为了解决这个问题,我们可以从以下几个方面入手:

1. 分段调用 seti2ccmd 函数
由于 seti2ccmd 函数的参数数量限制,可以将读取操作分成多个步骤进行。例如,先发送起始信号和地址,然后分多次读取数据。这样不仅解决了参数数量的问题,还能确保数据的完整性。

c
// 发送起始信号和地址
seti2ccmd(I2c0, 0, STxRack, 0x71, CmdEnd);

// 分多次读取数据
seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
seti2ccmd(I2c0, 0, RxTack, &hum, Stop, CmdEnd);

2. 使用数组传递参数
如果 seti2ccmd 函数支持数组作为参数,可以将参数存储在数组中,然后一次性传递给函数。这样可以减少参数的数量,同时保持代码的简洁性。

c
uint8t cmds[] = {
    STxRack, 0x71, RxTack, &hum, RxTack, &hum, RxTack, &hum,
    RxTack, &hum, RxTack, &hum, RxTack, &hum, RxTack, &hum, Stop, CmdEnd
};

seti2ccmd(I2c0, 0, cmds);

3. 检查编译器设置
有些编译器允许通过修改设置来增加最大参数数量。您可以查阅编译器的文档,看看是否有相关的选项可以调整 maxargs 的值。

4. 优化 I2C 通信协议
根据 AHT30 的 datasheet,确保您的 I2C 通信协议是正确的。有时候,减少不必要的重复操作,可以有效减少参数数量。例如,如果多个连续的 RxTack 操作可以合并,可以尝试优化代码。

5. 使用宏或函数封装
如果上述方法都不适用,可以考虑使用宏或函数封装重复的操作。这样可以减少代码的冗余,同时避免参数数量超限的问题。

c
define READHUMIDITY() \
    seti2ccmd(I2c0, 0, RxTack, &hum, CmdEnd)

READHUMIDITY();
READHUMIDITY();
READHUMIDITY();
READHUMIDITY();
READHUMIDITY();
READHUMIDITY();
READHUMIDITY();

总结
通过分段调用、使用数组传递参数、检查编译器设置、优化通信协议或使用宏封装等方法,可以有效解决 seti2ccmd 函数参数数量超限的问题。建议根据实际需求和硬件限制,选择最适合的解决方案。希望这些建议对您有所帮助。

[本文内容由国芯人工智能辅助生成,仅供参考]

王昱顺 发表于 2025-4-8 13:04:34

xsmall模型下,maxargs最大为40byte ,想要调大可以在.c文件最开头使用如下指令
#pragma maxargs (100)
类似的就可以将maxargs的缓存大小调大了

同时,因为你的单条指令较长,可以调节set_i2c.h中的
#define Max_I2c_Cmd 20 // 最大指令缓存长度,如果超出,后面的就不会生效了

以防止指令缓存区溢出

Sky_chen4 发表于 2025-4-8 17:42:12

王昱顺 发表于 2025-4-8 13:04
xsmall模型下,maxargs最大为40byte ,想要调大可以在.c文件最开头使用如下指令
#pragma maxargs (100)
类 ...

成功了,感谢大佬,还得是你。{:4_174:}
上面那个分开写,或者直接导入数组的方式可行吗?我试了一下分开写,还是失败了。确认一下是否可行,如果可行的话我就再试试,如果不太行的话我就用你这种方法啦{:4_196:}

王昱顺 发表于 2025-4-8 18:07:24

Sky_chen4 发表于 2025-4-8 17:42
成功了,感谢大佬,还得是你。
上面那个分开写,或者直接导入数组的方式可行吗?我试了一下分开写,还是 ...
分开写是可以的,导入数组暂不支持。
但是分开写需要注意,要使用同一个通道,并且要等当前通道写完后再装载下一部分。
(如果在指令执行过程中写入,当前写入就不会执行,内部有操作忙标志位,通道非空闲情况下写入是没用的)
具体实现起来稍微有点麻烦,建议还是使用这种一长串的。
根据需要换换行就可以了,语句是分号结束,参数可以任意换行

Sky_chen4 发表于 2025-4-10 16:52:19

王昱顺 发表于 2025-4-8 18:07
分开写是可以的,导入数组暂不支持。
但是分开写需要注意,要使用同一个通道,并且要等当前通道写完后再装 ...

好的,感谢大佬*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
页: [1]
查看完整版本: 求助!