我正在读取UART
外设的源代码,并且具有以下功能:
eResult = adi_stdio_ControlDevice (hSTDIOUART,
ADI_STDIO_COMMAND_SET_UART_BAUD_RATE, (void *)57600);
此功能用于连接UART
,数字57600
为波特率。我不了解(void*)57600
的含义。
我认为这可能是指向const
的指针,并且(void*)57600
的返回值为57600
。当我们使用(void*)57600
时,是否表示我们正在创建一个指向57600
值的指针?
以及为什么我们必须使用(void*)57600
?
不完全是。 (void *)57600
的“返回值”(之所以引用,是因为它实际上不是从函数返回的,而是转换的结果),只是将值57600
视为(或换句话说,转换为)a无效指针。
并且,尽管您实际上是在将C0转换为void指针,但几乎可以肯定它不会被用作指针。 57600
的原型更有可能具有通用参数(一个可以用于很多事情的参数)。设备控制功能特别容易做到这一点,因为它们在多种设备上通用,因此您可能必须给调用提供多种类型。您将[[可能
adi_stdio_ControlDevice
其他命令(例如我添加的伪命令)将能够以多种方式使用泛型参数,例如整数或其他指针类型。
该调用的文档(VisualDSP ++ 5.0设备驱动程序和Blackfin®处理器的系统服务手册)实际上支持该调用,其中指出:
static int localSpeed;
static char *localString;
static double localPi;
static struct rational { int numerator; int denominator } localStruct;
bool adi_stdio_ControlDevice (HANDLE hndl, COMMAND cmd, void *generic) {
switch (cmd) {
case ADI_STDIO_COMMAND_SET_UART_BAUD_RATE: {
localSpeed = (int)generic;
break;
}
case ADI_COMMAND_WITH_STRING_ARG: {
if (localString) free(localString);
localString = strdup((char*)generic);
break;
}
case ADI_COMMAND_WITH_DOUBLE_PTR_ARG: {
localPi = *((double*)generic));
break;
}
case ADI_COMMAND_WITH_STRUCT_PTR: {
memcpy(localStruct, generic, sizeof(localStruct));
break;
}
}
}
ADI_STDIO_RESULT adi_stdio_ControlDevice (
ADI_STDIO_DEVICE_HANDLE hStdioDevice,
uint32_t nCommandID,
void *const pValue
);
: : :
:执行命令所需的参数。 取决于命令,需要不同类型的参数。
我已经阅读了Blackfin Processor的文档,现在看起来更清晰了。值57600是UART连接的波特率,当我们编写(void *)57600时,这意味着我们正在将值57600强制转换为void指针。在函数adi_stdio_ControlDevice()中,输入参数的值将为57600,并且它是一个空指针。那么,为什么我们不直接使用值57600?原因是需要adi_stdio_ControlDevice()函数,它需要一个void指针,它将“处理”值57600作为指针。正如@paxdiablo先生在回答中所说:“执行命令需要参数。根据命令,需要使用不同类型的参数。”出于详细原因,我们必须阅读有关函数adi_stdio_ControlDevice()和Analog Device的“ ADI_STDIO_COMMAND”的更多信息。我已经看过了,但是我似乎很难理解。我认为此API不好。