gpt4 book ai didi

c++ - SPI_IOC_MESSAGE(N) 宏让我适应

转载 作者:IT王子 更新时间:2023-10-29 00:34:17 25 4
gpt4 key购买 nike

我无法让我正在处理的 SPI 程序正常运行,这似乎是 SPI_IOC_MESSAGE(N) 宏的一些问题。

这是不起作用的示例代码(ioctl 返回 EINVAL (22) ):

std::vector<spi_ioc_transfer> tr;
<code that fills tr with 1+ transfers>
// Hand the transmission(s) off to the SPI driver
if (tr.size() > 0)
{
int ret = ioctl(fd, SPI_IOC_MESSAGE(tr.size()), tr.data());
if (ret < 1)
{
int err = errno;
}
}

我现在的测试代码正在创建一个长度为 1 的 vector 。如果我明确地将代码更改为:

int ret = ioctl(fd, SPI_IOC_MESSAGE( 1 ), tr.data());

...然后 ioctl(...) 成功,我的位进入管道。查看 Eclipse 中 SPI_IOC_MESSAGE 宏的扩展,我不明白为什么这不开心。

建议?

我正在从 64 位 Linux VM 为 Linux/ARM (Beaglebone Black) 进行交叉编译,但我看不到这会影响宏。

编辑:这是 C 预处理器的两个宏扩展

int ret = ioctl(fd, (((1U) << (((0 +8)+8)+14)) | ((('k')) << (0 +8)) | (((0)) << 0) | ((((sizeof(char[((((tr.size())*(sizeof (struct spi_ioc_transfer))) < (1 << 14)) ? ((tr.size())*(sizeof (struct spi_ioc_transfer))) : 0)])))) << ((0 +8)+8))), tr.data());

和文字:

int ret = ioctl(fd, (((1U) << (((0 +8)+8)+14)) | ((('k')) << (0 +8)) | (((0)) << 0) | ((((sizeof(char[((((1)*(sizeof (struct spi_ioc_transfer))) < (1 << 14)) ? ((1)*(sizeof (struct spi_ioc_transfer))) : 0)])))) << ((0 +8)+8))), tr.data());

绝对可怕,但我看不到 tr.size() 在那里的使用方式有什么令人惊讶的地方。

编辑以包含似乎是答案的内容

#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif
#include <linux/spi/spidev.h>
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
}
#endif

将 linux SPI 包含文件包装在“外部 C”中指示系统将该部分视为普通的旧 C,这似乎让我调用 SPI_IOC_MESSAGE( tr.size() )SPI_IOC_MESSAGE( an_int ) 并让正确的事情发生(通过 GDB stepthrough 和信号分析器验证)。

最佳答案

我怀疑问题可能在于埋在宏汤中的这个特殊金 block :

...sizeof(char[...tr.size()...])...

注意到 Linux 代码完全是 C 语言,C 标准(我这里有 C99 草案 n1256)为 sizeof 运算符规定表达式操作数未计算,并且结果是一个常量,除非操作数的类型是一个可变长度数组,在这种情况下,它被评估并且结果是一个整数。

然而,C++ 标准(C++11 草案 n3242)似乎没有给出计算操作数的任何条件,而只声明结果是一个常量。

因此看起来这可能是 C 和 C++ 不同的角落之一,将一个编译为另一个会导致未定义的行为。在那种情况下,我认为选择要么只是破解您自己的宏版本,要么有一个单独的外部 C 函数来包装它。

关于c++ - SPI_IOC_MESSAGE(N) 宏让我适应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com