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

问题描述 投票:-1回答:2

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

我一步一步地进行初始化......

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

如果我的问题不可理解,我会道歉,并乐意根据需要提供进一步的信息。

c struct embedded uart memory-mapping
2个回答
3
投票

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

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

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

需要某种方式的文档来理解它的使用方式。像((*Buff).read + 1) % (*Buff).max;这样的代码看起来很模糊;我不知道他们为什么不简单地让驱动程序读/写原始数据字节。


0
投票

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

click here for more info

在这里,您将指针传递给结构而不是结构本身。 *Buff“取消引用”指针。换句话说,*Buff会给你指针指向的结构。

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


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


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


底线......

你将指针传递给函数....函数更新指针的值.... drop mic(yayyy)。

如果出现疑虑,我会很高兴澄清。但请尝试查看有关通过引用,解除引用等方式传递的一些教程(应该有帮助)

© www.soinside.com 2019 - 2024. All rights reserved.