接收描述符在存储器中的规划-docker部署python爬虫项目的方法步骤
接收描述符存放在存储器的一个数组中。数组的基址存放在RxDescriptor寄存器中,并且应该与4字节地址边界对齐。怎么操作呢?看看这个接收示例的存储器和寄存器,一步一步帮你搞定!数组中描述符的个数存放在RxDescriptorNumber寄存器中,该寄存器使用减1编码,如果数组有8个元素,则该寄存器的值应该是7。是不是很妙?还有一个与描述符平行的“状态数组”,如同一对孪生兄弟一般形影不离。对于描述符数组中的每个元素,“状态数组”中均有一个相关的状态区域。状态数组的基址存放在RxStatus寄存器中,并且该基址必须与8字节地址边界对齐。在操作过程中(当接收通道使能时),不可以对RxDescriptor、RxStatus和RxDescriptorNumber寄存器进行修改。
但这还不是全部!另有两个寄存器RxConsumeIndex和RxProduceIndex,用于定义下一个将被硬件和软件使用的描述符单元。这两个寄存器可充当计数器,从0开始计数并在计数值到达RxDescriptorNumber寄存器中的值时回到0。要了解更多细节,可以参考这篇文章:系统控制和状态寄存器。RxProduceIndex包含的是将被接收到的下一帧数据填充的描述符的索引。 RxConsumeIndex由软件来编程,它是软件接收驱动程序下一次即将处理的描述符的索引。当RxProduceIndex==RxConsumeIndex时,接收缓冲区为空。当RxProduceIndex==RxConsumeIndex-1 (考虑到它是一个封包设计)时,接收缓冲区满,新接收到的数据将产生溢出,除非软件驱动程序将一个或多个描述符释放。
每个“接收描述符”在存储器中占据两个字(8个字节)。同样,每个“状态区域”也在存储器中占据两个字(8个字节)。是不是让人眼前一亮?想了解更多?试试这个单片机的存储器寄存器介绍。每个接收描述符均由一个“数据包指针(PACKET)”和一个“控制字(CONTROL)”组成,指针(接收描述符区域中的包)指向用来存放接收数据的数据缓冲区,控制字包含的是控制信息。数据包区域的地址偏移量为0,控制区域的地址偏移量为4字节。如此细致的设计,不禁让人感叹工程师们的智慧!