C-这些UART结构作为函数参数如何工作



我有我要理解的代码,但我被卡住了,所以也许你们中的一个好人可以将我指向正确的方向。

逐步进行初始化的这一部分...

volatile struct UART *pTXD1;
volatile struct UARTINIT *pPort1;

... strcuts ...

struct UARTINIT
{
    union SR_BYTE SR; /* Status register */
    BYTE DR; /* Data register */
    BYTE BRR1; /* Baud Rate reg 1 */
    BYTE BRR2; /* Baud Rate reg 2 */
    union CR1_BYTE CR1; /* Control register 1 */
    union CR2_BYTE CR2; /* Control register 2 */
    BYTE CR3; /* Control register 3 */
    BYTE CR4; /* Control register 4 */
};
struct UART
{
    BYTE *Buffer;
    WORD max;
    WORD read;
    WORD write;
    BYTE Baud;
    BYTE stopp;
};

...功能调用...

Transmit_Uart(pTXD1, pPort1);

...功能

void Transmit_Uart(struct UART *Buff, struct UARTINIT *USART)
{
    if ((*Buff).write != (*Buff).read)
    {
        if ((*USART).SR.bit.TC)
        {
            (*Buff).read = ((*Buff).read + 1) % (*Buff).max;
            (*USART).DR = (*Buff).Buffer[(*Buff).read];
        }
    }
    else
        (*Buff).stopp = OFF;
    return;
}

我的问题是我不理解结构中写了哪些信息。该函数用PTXD1和PPORT1作为参数调用,但这两个只是结构的指针,不是吗?

如果我的问题无法理解,我很抱歉,并乐意根据需要提供更多信息。

他们使用struct UARTINIT作为可视化内存映射硬件寄存器中UART硬件中的一种方式。结构必须与寄存器布局完全相对应才能工作,因此编写代码的人必须确保没有结构填充没有活动。(通常在8或16位MCUS上不是问题,但会在更大的核心上。(

因此,结构指针pPort1将指向芯片上可能几个UART硬件之一的第一个寄存器。寄存器已经"分配" - 它们存在是内存映射硬件的形式。

UART结构似乎只是一个用户定义的结构,用于存储各种设置和将数据输入UART硬件缓冲区。如果是这样,则必须在用户RAM中分配此结构。或者可能也是寄存器内存图,在这种情况下,您有一些非常奇怪的硬件。

需要某种方式来了解其使用方式。诸如((*Buff).read + 1) % (*Buff).max;之类的代码看起来很晦涩;我不知道为什么他们不简单地让驱动程序读/写原始数据字节。

通过参考方法将参数传递给函数的调用将参数的地址复制到形式参数中。在功能内部,地址用于访问呼叫中使用的实际参数。这意味着对参数的更改会影响传递的参数。

单击此处以获取更多信息

在这里,您将指针传递到结构而不是结构本身。 *Buff" dereferences"指针。换句话说,*Buff将为您提供指针指向的结构。

用于指定的教程(尚未看过,但似乎足够体面(


现在,您可以直接将结构作为参数发送,但是这是在函数范围中创建struct的副本。因此,您在功能中所做的任何更改都会影响该复制而不是原件。因此,您发送指针。


此外,不建议通过结构通过值来函数,因为它们通常很大,需要复制到功能的堆栈中...等等等等(我可以继续(


底线....

您将指针传递给功能....功能更新指针的值.... drops mic(yayyy(。

如果出现疑问,很高兴澄清。但是,尝试查看有关通过参考,取消给出等通过的一些教程。(应有所帮助(

相关内容

  • 没有找到相关文章

最新更新