这些作为函数参数的 uart 结构如何工作?

How do these uart structs as function parameters work?

我有这段代码,我试图理解它,但我被卡住了,所以也许你们中的一位好人可以为我指明正确的方向。

一步一步来,我有这部分初始化...

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

...结构...

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 作为参数调用,但这两个只是指向结构的指针,不是吗?

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

他们使用结构 UARTINIT 作为一种可视化 UART 硬件中 memory-mapped 硬件寄存器的方法。该结构必须与寄存器布局完全对应才能工作,因此编写代码的人必须确保没有结构填充处于活动状态。 (通常在 8 位或 16 位 MCU 上不是问题,但会在更大的内核上出现。)

因此结构指针 pPort1 将指向芯片上可能存在的多个 UART 硬件之一的第一个寄存器。寄存器已经 "allocated" - 它们以 memory-mapped 硬件的形式存在。

UART 结构似乎只是一个 user-defined 结构,用于存储各种设置以及将数据铲入和铲出 UART 硬件缓冲区。如果是这样,这个结构必须分配在用户 RAM 中的某处。或者它可能也是一个寄存器内存映射,在这种情况下你有一些非常奇怪的硬件。

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

The call by reference method of passing arguments to a function copies the address of an argument into the formal parameter. Inside the function, the address is used to access the actual argument used in the call. It means the changes made to the parameter affect the passed argument.

click here for more info

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

for tutorial on dereferencing(haven't watched it but seems decent enough)


现在您可以直接将结构作为参数发送,但这样做是在函数范围内创建结构的副本。因此,您在函数内部所做的任何更改都会影响该副本而不是原始文件。所以你发送一个指针。


此外,不建议按值将结构传递给函数,因为它们通常非常大,需要将函数复制到堆栈中...等等(我可以继续)


底线....

您将指针传递给函数....函数更新指针处的值....丢弃麦克风(yayyy)。

如果有疑问,我们很乐意澄清。但是试着看看一些关于通过引用传递、取消引用等的教程(应该有帮助)