四、RAM管理
必须配置每条消息的字节数,以确定每条消息所需的内存大小。 CAN-FD上有效负载的增加可以更有效的将内存都利用起来,并允许更多消息要存储在分配的存储空间中。
总的专用RAM大小是2560个32bit数据。
(1)过滤区(11bit过滤和29bit过滤)
(2)接收区(Rx FIFO 0,Rx FIFO 1和Rx Buffer)
(3)发送区(Tx event FIFO,Tx Buffers)
(4)触发空间(Trigger memory)
FDCAN外设的所有部分都可以由用户配置。 所有部分的所有元素之和必须不能超过CAN消息RAM的总大小。 该RAM通过以下方式提高了灵活性和性能:从而有可能消除未使用的部分,并为其他部分扩展足够的内存。在CAN消息中以动态且连续的方式分配每个部分(按照上图顺序); 但是为了避免超出RAM的风险并且出于可靠性的原因,没有将特定的开始和结束地址分配给每个部分。
FDCAN外设可以配置三种传输机制:Tx buffer ,Tx queue 和 Tx FIFO并可以通过Rx buffer 和 Rx FIFO 接收。 它们配置有起始地址偏移量和要存储的存储元素。 起始地址是在配置中预定义的(0到2560),用户必须确保每个内存空间中的元素数量不会导致它们重叠。
注:消息的接收和发送意味着在RAM级别存储“元素”。 这个“元素”仅包含标识符,DLC,控制位(ESI,XTD,RTR,BRS,FDF),数据字段和特定的发送/接收位字段进行控制。 CAN消息的其余位会自动由硬件处理而不保存在RAM中 。
用于控制接收的特定位字段是滤波器索引,可接受的不匹配帧和Rx时间戳。用于传输的特定位字段是消息标记(message marker)和event FIFO控制位。无论Tx buffer, Tx FIFO, Tx queue 或 Rx buffer 中的每个元素分配的32bit的数量是多少,要计算保留:
(1)标头信息(两个保留的32bit),用于分配标识符,DLC字段,控制位和特定的发送/接收位字段。
(2)数据(足够的32bit数据个数)以包含每个数据字段的字节数。
下面的公式确定为每个元素分配的32bit的数量:
元素大小(以字为单位)=标头信息(2个字)+数据(数据字段/ 4)
其中数据字段是每条消息的数据字节数
如果数据字段的范围是0到8,则每个元素为数据分配2个字。下表详细介绍了必要的“元素”大小,具体取决于数据字段范围
有效使用CAN消息RAM的示例。 这个例子假设配置了FDCAN外设的应用程序:
(1)发送带有专用Tx buffer的32条消息(每个消息在数据字段中包含8个字节)。
(2)具有128个11位过滤器,用于接收消息。
(3)接收64条消息,其中每个消息在专用Rx buffers的数据字段中包含64个字节。
(4)接收64条消息,其中每个消息在Rx FIFO 0的数据字段中包含64个字节。
在此示例中,RAM中的分配按以下顺序进行:
(1)在ID-11位部分分配128个字。
(2)保留1152个字用于接收Rx FIFO 0部分中的元素。
(3)保留1152个字,用于接收Rx缓冲区中的元素。
(4)为发送缓冲区中发送的元素保留128个字。
由于采用了动态分配,并且不对未使用的段进行任何分配,因此整个内存大小有效利用了RAM:在此应用程序中分配了所有2560个字。
注意:配置后,分配的地址范围初始化为零
大多数STM32设备支持一个以上的FDCAN外设来满足所有应用程序要求。在这种情况下,重要的是要说RAM是在不同外设之间共享的。 用户可以划分各种外设上的RAM(每个外设的大小通过指示其起始偏移地址来选择)。下图显示了使用多个FDCAN实例的CAN消息RAM的示例。 这该示例假定用户将CAN消息RAM分为两个外设:第一个外设的大小为第二个外设的两倍。
|