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

C 这些uart结构作为函数参数是如何工作的?,c,struct,embedded,uart,memory-mapping,C,Struct,Embedded,Uart,Memory Mapping,我有这个代码,我正试图理解,但我被卡住了,所以也许你们中的一个好人可以给我指出正确的方向 一步一步地,我有一个初始化的这一部分 volatile struct UART *pTXD1; volatile struct UARTINIT *pPort1; …结构 struct UARTINIT { union SR_BYTE SR; /* Status register */ BYTE DR; /* Data register */ BYTE BRR1; /* Baud

我有这个代码,我正试图理解,但我被卡住了,所以也许你们中的一个好人可以给我指出正确的方向

一步一步地,我有一个初始化的这一部分

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


如果我的问题不可理解,我深表歉意,并将根据需要提供更多信息。

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

因此,结构指针将指向芯片上几个UART硬件之一的第一个寄存器。寄存器已经“分配”——它们以内存映射硬件的形式存在

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

需要某种形式的文档来了解其使用方式。代码,例如(*Buff).read+1)%(*Buff).max看起来很模糊;我不知道他们为什么不让驱动程序读/写原始数据字节

向函数传递参数的引用调用方法将参数的地址复制到形式参数中。在函数内部,地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响传递的参数

这里将指针传递给结构,而不是结构本身<代码>*Buff
取消引用指针。换句话说,
*Buff
将为您提供指针指向的结构


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


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


底线

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


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

你应该找到一本好的初学者书,解释指针和解引用操作符
*
,了解它的功能。搜索并阅读“内存映射”硬件/寄存器/结构。例如,像.我明白了,这很有意义,谢谢,感谢你的解释。