1.在 NETC 驱动程序中,"MCAL_INSTRUCTION_SYNC_BARRIER() "不应该是必须的。它会降低性能,可以将其删除。根据我的理解,如果不动态更改指令序列,就不需要刷新指令 FIFO (isync)。如果我说错了,请帮忙仔细检查。
例如,在 Netc_Eth_Ip_SendFrame() 中,关于下面的代码,对于存储指令,投机不会执行,为什么我们需要这个障碍?
/* 启用开发错误时,我们需要先添加一个障碍,以避免在前一个 else if 条件完成之前发生投机性检测。 在前一个 else if 条件完成之前,我们需要先添加一个障碍。*/
mcal_instruction_sync_barrier();
mcal_data_sync_barrier();
2. 需要对 "MCAL_DATA_SYNC_BARRIER() "中的某些内容进行审查。其中部分似乎不一定(如上),部分需要调整。例如,在 Netc_Eth_Ip_SendFrame()中,关于下面的代码,"MCAL_DATA_SYNC_BARRIER() "应移到缓存操作之后,TBPIR 寄存器之前。
/* BD 在内存中的写入已被优化,因此在开始传输前需要进行同步处理。 以确保在内存中正确写入传输 BD。*/
mcal_data_sync_barrier();
关于"变量 LockTxBufferDes 已更改" ,正如我在问题中所述,任何投机执行都不会导致内存存储动作损坏,因为内存存储动作不会被撤销。请仔细检查投机概念。
您好,
我知道在更改全局变量之前会添加障碍命令,以避免对其他变量造成影响。例如:在函数 SendFrame 中使用以下代码:
如果没有屏障命令,在"之前,如果" 条件完全解决,就会执行推测执行。如果出现 NextProducerIndex = LastTxdata 的情况,说明队列已空或已满,但 CPU 预测错误,因此设置变量 LockTxBufferDes = TRUE。在"if" 条件结束后,CPU 发现错误并返回,但变量 LockTxBufferDes 发生了变化。该变量的序列为:发送前,LockTxBufferDes = LOCKED;在 ReportTransmission 中处理后,LockTxBufferDes = UNLOCKED。这导致一个缓冲区被忽略使用。
对于此命令:
这与 RM 中的说明有关:
添加障碍是为了确保 TxBD 在以下命令开始之前同步到内存:
顺祝商祺!
Nhi
您好,
我的回答如下:
我对此没有更多了解,因此我创建了票据 ARTDCC1-640,您可以通过该票据从 SW 团队获得解释。
顺祝商祺!
Nhi
是的,我通过人工智能工具找到了这个。是科迪。
您好,
我刚刚找到它,虽然不是官方文档,但我认为这可能是 SW 添加该命令的原因。我不知道,也许我的想法是错的,他们有其他原因。SW 团队将在上述票据中给予答复。
顺祝商祺!
Nhi