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