This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRa750:高速缓存 A15问题

Guru**** 2931100 points

Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/664064/dra750-cache-a15-problems

器件型号:DRA750
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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Pawel、

    我不确定这是否与您的问题有关、但以下是 A15缓存无效的一个特性-它在使缓存无效之前执行回写操作:
    e2e.ti.com/.../508262
    downloads.ti.com/.../Cache.html

    您能否说明您使用的 SDK 版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Pawel、

    我没有听到您的反馈、我假设您能够解决您的问题。
    如果不是、只需在下面发布回复(如果该线程由于超时而锁定、则创建新线程)。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    问题是高速缓存验证。 由于失效和回写操作相同、因此需要在将缓冲区写入 DMA 接收传输之前对其进行回写、而不是在接收后使其失效。
    如果不这样做、它将覆盖接收到的数据上的缓存数据。

    谢谢、
    Pawel