Embedded 由于寄存器中的4个保留位,4个lsb位被屏蔽——OHCI USB主机实现——不可恢复错误

Embedded 由于寄存器中的4个保留位,4个lsb位被屏蔽——OHCI USB主机实现——不可恢复错误,embedded,usb,host,firmware,Embedded,Usb,Host,Firmware,我正在使用AT91SAM9G45,并正在实施OHCI以实现全速USB主机 我已经创建了端点描述符(ED)和传输描述符(TD),它们被创建为结构指针 主机控制器驱动程序(HCD)应该在HCControlHead寄存器中写入头ED的地址。这是一个保留最后4位的32位寄存器,全部为0。当我创建一个ED结构指针时,当我在HCControlled寄存器中写入这个32位地址时,我得到一个32位地址。最后4位被屏蔽,它们变成零 我如何解决这个问题 当主机控制器收到命令开始处理控件ED时,我得到一个不可恢复的错

我正在使用AT91SAM9G45,并正在实施OHCI以实现全速USB主机

我已经创建了端点描述符(ED)和传输描述符(TD),它们被创建为结构指针

主机控制器驱动程序(HCD)应该在HCControlHead寄存器中写入头ED的地址。这是一个保留最后4位的32位寄存器,全部为0。当我创建一个ED结构指针时,当我在HCControlled寄存器中写入这个32位地址时,我得到一个32位地址。最后4位被屏蔽,它们变成零

我如何解决这个问题

当主机控制器收到命令开始处理控件ED时,我得到一个不可恢复的错误(可以这样说,因为不可恢复的错误位被设置了),我猜这是因为最后4位被屏蔽,从而改变了指针地址

如何解决此问题

typedef struct {
    / FunctionAddress | EndpointNumber | Direction | Speed | sKip | Format
    // MaximumPacketSize
    volatile unsigned int Control;
    // TailP: TDQueueTailPointer

    volatile unsigned int TailP;
    // HeadP: TDQueueHeadPointer Points to the next TD to be processed for 
    volatile unsigned int HeadP;
    // NextED: If nonzero, then this entry points to the next ED on the list
    volatile unsigned int NextEd;
} __attribute__((aligned(16))) OHCIEndpointDescriptor;


OHCIEndpointDescriptor  *ed1;

AT91C_BASE_UHP->UHP_HcControlHeadED=((unsigned int)&ed1);

如果将来有人面临这个问题,我就想出来了,这是因为我使用的环境。对齐是gcc需要解决的问题

#pragma data_alignment=16 static OHCIEndpointDescriptor *ed1;

内存中ED和TD结构的地址是否应该与16字节对齐?@WeatherVane是的,我创建的结构被对齐到16字节,然后我创建指向ED结构的指针,当我打印F(“%x”,(unsigned int)和ED_1)时,我将这个指针放在控制头中……它打印一个LSB字节非零的地址。在这种情况下,地址的最后4位无论如何都将是0。应该是,但不是,这让我很困惑。在我回复后,您编辑了前面的评论。在这种情况下,结构没有对齐,“因为最后4位被屏蔽,从而改变了指针地址”。