我有这个代码,我试图理解,但我被卡住了,所以也许你们中的一个好人可以指出我正确的方向。
我一步一步地进行初始化......
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的问题,但会在更大的内核上。)
因此,结构指针pPort1
将指向芯片上可能有几个UART硬件之一的第一个寄存器。寄存器已经“分配” - 它们存在于内存映射硬件的形式。
UART
结构似乎只是一个用户定义的结构,用于存储各种设置以及将数据存入和传出UART硬件缓冲区。如果是这样,则必须在用户RAM中的某处分配此结构。或者它也可能是寄存器存储器映射,在这种情况下,您有一些非常奇怪的硬件。
需要某种方式的文档来理解它的使用方式。像((*Buff).read + 1) % (*Buff).max;
这样的代码看起来很模糊;我不知道他们为什么不简单地让驱动程序读/写原始数据字节。
将参数传递给函数的引用调用方法将参数的地址复制到形式参数中。在函数内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响传递的参数。
在这里,您将指针传递给结构而不是结构本身。 *Buff
“取消引用”指针。换句话说,*Buff
会给你指针指向的结构。
for tutorial on dereferencing(haven't watched it but seems decent enough)
现在您可以直接将结构作为参数发送,但这样做会在函数范围内创建结构的副本。因此,您在函数内所做的任何更改都会影响该副本而不是原始副本。所以你发送一个指针。
另外,不建议将结构传递给值,因为它们通常非常大并且需要被复制到函数的堆栈中...等等等等(我可以继续)
底线......
你将指针传递给函数....函数更新指针的值.... drop mic(yayyy)。
如果出现疑虑,我会很高兴澄清。但请尝试查看有关通过引用,解除引用等方式传递的一些教程(应该有帮助)