【问题标题】:Return value of (void*) 57600 in CC 中 (void*) 57600 的返回值
【发布时间】:2019-12-17 04:25:29
【问题描述】:

我正在阅读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

【问题讨论】:

    标签: pointers embedded void uart blackfin


    【解决方案1】:

    不完全是。 (void *)57600 的“返回值”(引用是因为它实际上不是从函数返回,而是转换的结果)只是将值 57600 视为(或换句话说,转换为)a空指针。

    而且,虽然您实际上 57600 转换为 void 指针,但几乎可以肯定它不会被 用作指针。更有可能的是adi_stdio_ControlDevice 的原型有一个通用参数(一个可以用于许多事情的参数)。

    设备控制函数特别容易做到这一点,因为它们是通用的,适用于多种设备,因此您可能必须为调用提供多种类型。

    可能会发现,对于设置波特率的命令,它只是在使用之前在另一端被转换回一个整数值,例如:

    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;
            }
        }
    }
    

    其他命令(例如我添加的假命令)将能够以多种方式使用泛型参数,例如整数或其他指针类型。


    该调用的文档(VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors)实际上支持这一点,其中指出:

     ADI_STDIO_RESULT adi_stdio_ControlDevice (
    ADI_STDIO_DEVICE_HANDLE hStdioDevice,
    uint32_t nCommandID,
    void *const pValue
    );
    : : :
    pValue:执行命令所需的参数。 根据命令,需要不同类型的参数。

    【讨论】:

    • 谢谢。据我了解,我们必须使用 (void*)57600,因为 adi_stdio_ControlDevice() 的输入需要一个 void const。现在我想知道 C 中的类型转换实际上是做什么的。如果我写 (void) 57600,那么它将把 57600 的数据类型从某个东西(我不知道,因为它是常量)更改为一个 void 指针( 4 字节,32 位系统)。这是真的 ?而在C的虚拟内存分配中,会有两块内存,一块用于const 57600,一块用于指针voide* 57600? (这似乎不是真的)。​​
    • 是的,@Lundin,这不是最好的,这只是他们选择它以允许任何类型的争论的方式。根据记忆,UNIX/Linux ioctl() 非常相似。
    • @Thanh, (void*)N 并没有真正创建另一个“东西”,它只是将N 视为一个空指针。类似于(float) 1 / 3,它会进行浮点除法(得到0.33-ish),因为您将整数1 视为浮点数而不是整数(1 / 3 将截断为零,因为它是整数除法) .
    • 我已阅读文档“VisualDSP++ 5.0 设备驱动程序和 Blackfin® 处理器的系统服务手册”,有很多有用的 API 函数,但我不想使用 API 函数,因为我可以帮助我实际了解芯片的工作原理。你能推荐我一些文件或例子,网络,...等通过寄存器值对黑鳍芯片进行编程吗?
    猜你喜欢
    • 2016-08-28
    • 2017-07-13
    • 2014-08-16
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多