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.

[参考译文] RTOS/AM3359:在 EtherCAT 应用中启用高速缓存

Guru**** 2608355 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/585303/rtos-am3359-cache-enable-in-ethercat-application

器件型号:AM3359

工具/软件:TI-RTOS

您好!

我的配置如下:

Sitara ARM3359
- Code Composer Studio 版本 CCS 6.1.2.00015
-SYS/BIOS 6.45.01.29实时操作系统
- XDC 工具3.32.00.06
-编译器 GNU v4.4.8 (Linaro)
NDK 2.24.3.35
SYSBIOS SDK 2.1.3.2
-带有 beckoff 补丁 v5.11的德州仪器(TI) ecat_appl应用 软件

为了改进我们的代码、我们需要使运行速度非常快。

因此、我们将研究如何使用缓存来提高执行速度。

MMU 表如下所示:

SYS_MMU_entry applMMUEntry[]=

   {(void *) 0x08000000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、  //NOR -可缓冲|可高速缓冲
   {(void *) 0x08100000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、  //NOR -bufforable| cachable
   {(void *) 0x08200000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、  //NOR -可缓冲|可高速缓冲
   {(void *) 0x48300000、0}、  //PWM -不可缓冲|不可高速缓冲
   {(void *) 0x48200000、0}、  //INTCPS、MPUSS -不可缓冲|不可高速缓冲
   {(void *) 0x48100000、0}、  //I2C2、McSPI1、UART3、UART4、UART5、GPIO2、GPIO3、MMC1 -不可缓冲|不可高速缓冲
   {(void *) 0x48000000、0}、  //UART1、UART2、I2C1、McSPI0、McASP0 CFG、McASP1 CFG、DMTIMER/GPIO1 -不可缓冲|不可高速缓冲
   {(void *) 0x44E00000、0}、  //时钟模块、PRM、GPIO0、 UART0、I2C0、-不可缓冲|不可高速缓冲
   {(void *) 0x4A300000、SYS_MMU_sharedable | SYS_MMU_BUFFERABLE}、  //PRUSS1 -Sharedable | Non cachable | Buffable
   {(void *) 0x49000000、0}、  //EDMA3 -不可缓冲|不可高速缓冲
   {(void *) 0x4A000000、0}、  //L4快速 CFG-不可缓冲|不可高速缓冲
   {(void *) 0x4A100000、0}、  // CPSW -不可缓冲|不可高速缓冲
   {(void *) 0xFFFFFFFF、0xFFFFFFFF}
};

在用于以下初始化的 utils.c 文件中:

   SDKMMUInit (applMMuEntry);  //首先需要

   cache_lock ((ptr) 0x8000000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80008000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80010000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80018000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80020000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80028000、0x8000);
   cache_wait();
   cache_lock ((ptr) 0x80030000、0x8000);
   cache_wait();

   pruIcss1Handle =(PRUICSS_Handle) malloc (sizeof (PRUICSS_Config));
   pruIcss1Handle->object =(PRUICSS_V1_Object *) malloc (sizeof (
                                PRUICSS_V1_Object));
   pruIcss1Handle->hwAttrs =(PRUICSS_HwAttrs *) malloc (sizeof (
                                 PRUICSS_HwAttrs);

.

BIOS_start();

在启动 BIOS 之前、我们尝试使用以下代码启用高速缓存:

   cache_enable (cache_Type_L2);     
    cache_enable (cache_Type_L1P);    
    cache_enable (cache_Type_L1D);   

我们已经在 Sitara 输出上连接示波器来测量速度是否有所提高、但似乎没有任何变化!

我们不知道高速缓存是否真正启用、如果不启用、 如何执行!

有人能帮我们吗?

非常感谢!

Laurence
 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Laurence、

    通常、在我们的示例中、DDR 的缓存是默认启用的。 您是否从 DDR 运行代码? 使用上述代码、您甚至可以锁定 L2高速缓存中的主要部件。 据我所知、这需要启用高速缓存。
    要检查高速缓存/MMU 状态、您可以使用 CCS 中的 ROV 工具。 UIA 还有助于记录任务计时并以图形视图显示。 通常非常有助于快速了解空闲百分比。

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

    您好 Frank!

    感谢您的回答。

    要回答您的第一个问题:是的,我们正在 DDR3中运行!

    如果我们使用 ROV 工具、我们有以下信息:

    您能不能告诉我它的标志是什么(我真的不理解...)

    这是否意味着我的缓存已启用?

    尽管如此,我还是尝试在  MMU 表中注释参数 SYS_MMU_cachable,并且范围度量中似乎没有任何变化!

    您能不能简单地解释一下它的工作原理吗?

    非常感谢!

    Laurence

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

    您的图片未显示在论坛上...

    无论如何、如果您参考以下条目:
    {(void *) 0x08000000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、//NOR -可缓冲|可高速缓冲
    =========== 不是0x8000 0000...
    {(void *) 0x08100000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、//NOR -bufforable| cachable
    {(void *) 0x08200000、SYS_MMU_cacheable | SYS_MMU_BUFFERABLE}、//NOR -可缓冲|可高速缓冲
    则这不会更改 DDR 缓存。 您在 ICE 板的 NOR 地址范围内...
    DDR 选项通常由基本目标定义配置。
    上表仅为应用程序添加其他 MMU 配置。

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

    是的,你是对的!

    MMU 表仅涉及 NOR!

    无论如何、我们的代码大于您的代码、并存储在 DDR3中、直到地址:0x800B8000。

    因此,我们必须配置所有内存高速缓存,对吧?

    我们已在 utils.c 文件中添加以下行:

      cache_lock ((ptr) 0x8000000、0x8000);

      cache_wait();

      cache_lock ((ptr) 0x80008000、0x8000);

      cache_wait();

      cache_lock ((ptr) 0x80010000、0x8000);

      cache_wait();

     。

      cache_lock ((ptr) 0x800A0000、0x8000);

      cache_wait();

      cache_lock ((ptr) 0x800A8000、0x8000);

      cache_wait();

      cache_lock ((ptr) 0x800B0000、0x8000);

      cache_wait();

      cache_lock ((ptr) 0x800B8000、0x8000);

      cache_wait();

    我认为配置 DDR 缓存还不够!

    在 ROV 窗口中、我们只能看到之前的地址:(请参阅 ROV 文件)

    因此、我们的地址不在窗口上。

    您说 DDR 配置是在基本目标定义中进行的:它在哪里?

    谢谢

     

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

    我认为您对锁定功能的理解有误... 我想知道您的程序是否正常工作。
    高速缓存意味着有存储器将从 DDR 动态加载、因此可以更快地执行。 但大小有限、器件上只有8个32KB。 当您将内存锁定到高速缓存中时、无法从高速缓存执行任何其他操作。 此外、L2 IF 用于指令和数据。 因此、您绝不应锁定全部8个块。
    请立即删除任何锁定代码、因为现在没有意义。 您可以稍后锁定关键段(如 ISR)以进行优化。 但您将无法锁定所有程序。 但您可以缓存启用所有 DDR。 请参阅 ROV 中的 MMU 部分。

    此致、
    弗兰克
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的! 我明白你说什么!
    因此、我必须取出所有的锁、因为它们并不意味着什么。
    然后将我的关键代码放在 DDR 的特定部分,只锁定此特定部分!
    我想知道另一个问题:当我在 C++中工作时,是否可以将堆段放在安全区域中?
    我将尝试做我所说的事并在之后给出反馈、对吧?
    非常感谢
    Laurence