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

时间:2018-02-28 09:53:37

标签: c struct embedded uart memory-mapping

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

  

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

click here for more info

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

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

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

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

底线....

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

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