初级会员

- 积分
- 129
- 金钱
- 129
- 注册时间
- 2019-1-29
- 在线时间
- 67 小时
|

楼主 |
发表于 2019-3-12 14:43:46
|
显示全部楼层
本帖最后由 ZHDX 于 2019-3-12 15:27 编辑
今天终于搞通了DCache , 写下一些经验.
这两个指令是设置数组, 数组占用的内存不多, 但是都是必须是可以DMA访问的, 这段内存必须使用 MPU_ACCESS_NOT_CACHEABLE
heth.Init.TxDesc = DMATxDscrTab;
heth.Init.RxDesc = DMARxDscrTab;
之前就是忽略了这个, 总以为只有buffer才需要DMA读写, 没考虑过这两个数组也是被DMA读写修改掉.
而自动生成里的 ethernetif.c 里的 SCB_CleanInvalidateDCache() 的使用是默认有的了. 就不细说了.
因为我用的是gnu编译器, 所以__attribute__是这种模式
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */
需要自己做一个sct文件, 把这两个放进SRAM3内, (目的是分区方便MPU操作)
SRAM3 0x30040000 32768 {
* (.RxDecripSection)
* (.TxDecripSection)
}
MPU代码为
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = 0x30040000;
MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
MPU_InitStruct.SubRegionDisable = 0x0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
----
经过这些步骤, DCache成功开启并兼容ETH了, CPU使用率大幅度下降,
这100Mbps的网络每秒竟然可以收或发11200个包.
(测试TCP连接收或发100次就关闭重连, 如不关闭重连, 则达到了每秒17000次)
下一步是优化 SCB_CleanInvalidateDCache() , 改为 SCB_CleanInvalidateDCache_by_Addr
|
|