Other Parts Discussed in Thread: SYSBIOS
Thread 中讨论的其他器件:SYSBIOS
你(们)好
我正在 DR750器件上开发 EMAC 驱动程序。 我在 M4和 A15内核上运行驱动程序。 它在 M4上工作正常、但在 A15上工作正常。
在 A15上、我有时会得到不正确的数据包。 我已经指出该错误与 cache_inv ()函数调用有关。 它在 M4芯片上工作正常、但在 A15上有时会失败。
A15高速缓存上是否有任何已知的错误,或者是否应该有任何除 cache_inv ()以外的额外函数调用?
数据缓冲器与128字节对齐。
如果我有错误的数据包,我会看到 cache_inv ()不更新超速缓存内存。 除之外、这两个项目都相同
包括图书管理员。 项目在 SYSBIOS 下运行。
M4
函数调用:
#include
cache_inv ((ptr) addr、(SizeT) size、(Bits16) cache_Type_All、(bool) true)
高速缓存配置:
/*========================= 高速缓存和 MMU 配置=================== *
/*启用高速缓存*/
VAR Cache = xdc.useModule('ti.sysbios.hal.unicache.Cache');
cache.enableCache = true;
cache.maxLineModeBufSize = 64;
/*使用 Ammu 模块*/
VAR Ammu = xdc.useModule('ti.sysbios.hal.ammu.AMMU');
/*大页*/
Ammu.largePages [0].pageEnabled = Ammu.Enable_Yes;
Ammu.largePages [0].logicalAddress = 0x40000000;
Ammu.largePages [0]。translatedAddress = 0x40000000;
Ammu.largePages [0].平 方已启用= Ammu.Enable_Yes;
Ammu.largePages [0].size = Ammu.large_512M;
Ammu.largePages [0].l1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [0].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [0].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [0].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [1].pageEnabled = Ammu.Enable_Yes;
Ammu.largePages [1].logicalAddress = 0x8000000;
Ammu.largePages [1].translatedAddress = 0x8000000;
Ammu.largePages [1].平 方已启用= Ammu.Enable_Yes;
Ammu.largePages [1].size = Ammu.large_512M;
Ammu.largePages [1].L1_writepolicy = Ammu.writepolicy_write_back;
Ammu.largePages [1].L1_Allocate = Ammu.AllocatePolicy_Allocate;
Ammu.largePages [1].l1_cacheable = Ammu.cachepolicy_cacheable;
Ammu.largePages [1].L1_posted= Ammu.PostedPolicy_posted;
Ammu.largePages [1].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [1].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [2].pageEnabled = Ammu.Enable_Yes;
Ammu.largePages [2].logicalAddress = 0xA0000000;
Ammu.largePages [2]。translatedAddress = 0xA0000000;
Ammu.largePages [2].inationEnabled = Ammu.Enable_Yes;
Ammu.largePages [2].size = Ammu.large_512M;
Ammu.largePages [2].l1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [2].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [2].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [2].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [3].pageEnabled = Ammu.Enable_Yes;
Ammu.largePages [3].logicalAddress = 0x60000000;
Ammu.largePages [3].translatedAddress = 0x40000000;
Ammu.largePages [3].平 方已启用= Ammu.Enable_Yes;
Ammu.largePages [3].size = Ammu.large_512M;
Ammu.largePages [3].l1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [3].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.largePages [3].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.largePages [3].L2_posted= Ammu.PostedPolicy_non_posted;
/*中页*/
Ammu.mediumPages [0].pageEnabled = Ammu.Enable_Yes;
Ammu.mediumPages [0].logicalAddress = 0x00300000;
Ammu.mediumPages [0]。translatedAddress = 0x40300000;
Ammu.mediumPaages[0].平 方已启用= Ammu.Enable_Yes;
Ammu.mediumPages [0].size = Ammu.Medium_256K;
Ammu.mediumPages [1].pageEnabled = Ammu.Enable_Yes;
Ammu.mediumPages [1].logicalAddress = 0x00400000;
Ammu.mediumPages [1].translatedAddress = 0x40400000;
Ammu.mediumPages [1].平 方已启用= Ammu.Enable_Yes;
Ammu.mediumPages [1].size = Ammu.Medium_256K;
Ammu.mediumPages [1].L1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.mediumPages [1].L1_posted= Ammu.PostedPolicy_posted;
Ammu.mediumPages [1].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.mediumPages [1].L2_posted= Ammu.PostedPolicy_non_posted;
/*小页*/
Ammu.smallPages [0].pageEnabled = Ammu.Enable_Yes;
Ammu.smallPages [0].logicalAddress = 0x00000000;
Ammu.smallPages [0].translatedAddress = 0x55020000;
Ammu.smallPages [0].平 方已启用= Ammu.Enable_Yes;
Ammu.smallPages [0].size = Ammu.small_16K;
Ammu.smallPages [0].volatileQualifier = Ammu.volatile_follow;
Ammu.smallPages [0].L1_cacheable = Ammu.cachepolicy_cacheable;
Ammu.smallPages [0].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [0].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [0].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [1].pageEnabled = Ammu.Enable_Yes;
Ammu.smallPages [1].logicalAddress = 0x40000000;
Ammu.smallPages [1].translatedAddress = 0x55080000;
Ammu.smallPages [1].平 方已启用= Ammu.Enable_Yes;
Ammu.smallPages [1].size = Ammu.small_16K;
Ammu.smallPages [1].volatileQualifier = Ammu.volatile_follow;
Ammu.smallPages [1].L1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [1].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [1].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [1].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [2].pageEnabled = Ammu.Enable_Yes;
Ammu.smallPages [2].logicalAddress = 0x00004000;
Ammu.smallPages [2].translatedAddress = 0x55024000;
Ammu.smallPages [2].inationEnabled = Ammu.Enable_Yes;
Ammu.smallPages [2].size = Ammu.small_16K;
Ammu.smallPages [2].L1_cacheable = Ammu.cachepolicy_cacheable;
Ammu.smallPages [2].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [2].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [2].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [3].pageEnabled = Ammu.Enable_Yes;
Ammu.smallPages [3].logicalAddress = 0x00008000;
Ammu.smallPages [3].translatedAddress = 0x55028000;
Ammu.smallPages [3].平 方已启用= Ammu.Enable_Yes;
Ammu.smallPages [3].size = Ammu.small_16K;
Ammu.smallPages [3].L1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [3].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [3].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [3].L2_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [4].pageEnabled = Ammu.Enable_Yes;
Ammu.smallPages [4].logicalAddress = 0x20000000;
Ammu.smallPages [4].translatedAddress = 0x55020000;
Ammu.smallPages [4].urationEnabled = Ammu.Enable_Yes;
Ammu.smallPages [4].size = Ammu.small_16K;
Ammu.smallPages [4].L1_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [4].L1_posted= Ammu.PostedPolicy_non_posted;
Ammu.smallPages [4].L2_cacheable = Ammu.cachepolicy_non_cacheable;
Ammu.smallPages [4].L2_posted= Ammu.PostedPolicy_non_posted;
解答15.
函数调用:
#include
cache_inv ((ptr) addr、(SizeT) size_for_packet、(Bits16) cache_Type_All、(bool) true)
高速缓存配置:
/*========================= 高速缓存和 MMU 配置=================== *
VAR Cache1 = xdc.useModule('ti.sysbios.family.arm.a15.Cache');
Cache1.enableCache = true;
Cache1.errata798870 =真;
/* MMU 配置*/
VAR MMU = xdc.useModule('ti.sysbios.family.arm.a15.Mmu');
MM4.enableMMU = true;
/*
* SYS/BIOS 为 MAIR0 ATTR0、ATTR1和 ATTR2分配以下默认值:
*
* ATTR0 -> 0x44 (将存储器区域标记为不可高速缓存的常规存储器)
* ATTR1 -> 0x04 (将存储器区域标记为器件存储器、即强烈
*有序和不可高速缓存)
* ATTR2 -> 0xFF (将存储器区域标记为正常存储器、RW 可高速缓存和
* RW 分配)
*
/*描述符属性结构*/
var attats0 =新 MMU。DescriptionAttrs();
Mmu.initDescAttrsMeta(attrs0);
attrs0.type = MMU。DescriptorType_block;//块描述符*/
attrs0.sharedable = 2;/*可共享*
attrs0.attrIndx=1;//非高速缓存,设备内存*/
attrs0.noExecute = true;/*不可执行*/
/*为地址范围中的每个条目的设置描述符*/
对于(var i=0x40600000;i < 0x60000000;i = i + 0x00200000){
/*每个"块"描述符条目跨越2MB 地址范围*/
Mmu.setSecondLevelDescMeta(i、i、attrs0);
}
/*描述符属性结构*/
var attats1 = new MMU。DescriptionAttrs();
Mmu.initDescAttrsMeta(attrs1);
attrs1.type = MMU。DescriptorType_block;//块描述符*/
attats1.sharedable = 2;/*可共享*
attrs1.Indattrx = 2;//缓存,正常内存*/
/*为地址范围中的每个条目的设置描述符*/
对于(var i=0x80000000;i < 0xA0000000;i = i + 0x00200000){
/*每个"块"描述符条目跨越2MB 地址范围*/
Mmu.setSecondLevelDescMeta(i、i、attrs1);
}
感谢你的帮助
Pawel