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.

[参考译文] AM2634:PRU C 编译器:无法访问常量表

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1602318/am2634-pru-c-compiler-unable-to-access-a-const-table

器件型号: AM2634

尊敬的 TI 支持服务:

我正在使用 PRU C 编译器来实现一个简单的 xy2 100 流生成器、我注意到定义常量表、如下所示:

__far 静态常量 uint32_t table_yx_clock_hi_const[4]=
    DEF_xy2_100_clock_hi | def_xy2_100_sync_hi | 0、
    DEF_xy2_100_clock_hi | def_xy2_100_sync_hi |(1 << def_xy2_100_x_shift)、
    DEF_xy2_100_clock_hi | def_xy2_100_sync_hi |(1 << def_xy2_100_y_shift)、
    DEF_xy2_100_clock_hi | def_xy2_100_sync_hi |(1 << def_xy2_100_y_shift)|(1 << def_xy2_100_x_shift)、
};
该表是放置 DIN IMEM(第 0 页),到目前为止很好。
 
但在尝试访问该表时、编译器会生成一条 LBBO 指令、以像在 DMEM 中一样访问该表、而该表已被放置在 IMEM 中。
似乎编译器试图访问 DMEM 中某个地址处的表、该地址的数值与 IMEM 中的表地址相同、但这是错误的、因为所述的表位于 IMEM 中。
我想知道是否:
  • 是否有方法访问 IMEM 中存储的数据
  • 是否有任何其他方法可以访问常量表?

 

此致、非常感谢您的帮助

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

    您好、

    请注意,由于假日季,回复可能会有一些延迟。  

    此致、
    Aishwarya

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

    你(们)好
    是否最好将数据放入 DMEM? IMEM 是指令存储器。

    此致

    Dhaval

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

    您好:

    可以在 IMEM 中的特定地址定义存储器段、然后使用汇编 JMP 命令跳转到该地址。 (我已经看到,当代码需要跳转到大量函数之一时,这用在时序受限的用例中以节省几个时钟周期,但如果您使用 C 语言编程,我假设您没有这么严格的约束。) 但是、据我所知、使用 IMEM 进行数据存储的方式并不理想。 如前所述、PRU 内核设计为使用 DMEM0、DMEM1 和 SMEM 进行本地数据存储。

    有关读取/写入延迟的一般概述、请参阅此常见问题解答。 AM26x 的行为与 AM62x 类似:
    【常见问题解答】PRU:如何计算读取和写入延迟?

    此致、

    Nick

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

    不, IMEM 是唯一的指令,而不是数据!!!

    是否有任何其他方法可以访问 const 表?

    是的、在 DMEM 或 SMEM 中保留 const 表。  (+) LP-AM261:以编程方式在 PRU 上加载 C 应用程序时出现的问题(卡在_TI_decompress_lzss 中)-基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 提供了在初始化期间加载.data 段的示例

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

    好的、IMOO 的问题是、使用合法的 C 结构时、会生成不正确的汇编代码。

    您能否确认、使用 const reserved 字会生成一个错误、表放置在 IMEM 中、但代码访问它时就像在 DMEM 中一样?

    谢谢

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

    你好、Michele、

    请共享您的 linker.cmd 文件、以便我们可以看到您如何指示链接器放置数据。

    此致、

    Nick

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

    你(们)好

    我无法看到附加的链接器文件。 您能否粘贴相关行或再次附加文件?

    此致

    Dhaval

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

    尊敬的 TI 支持服务:您好!

    似乎附件丢失了。

    请参阅以下 linker.cmd 文件中的:

    /*指定系统存储器映射*/
    移动数据
      PRU0_CTRL:origin=0x22000 length=1024 CREGISTER=4

      第 0 页
       /* 12KB PRU 指令 RAM */
       PRU_IMEM      :org = 0x00000000 len = 0x00003000

      第 1 页
       /*数据 RAM */
       /* 8KB PRU 数据 RAM 0 */
       PRU0_DMEM_0   :org = 0x00000000 len = 0x00002000 CREGISTER=24
       /* 8KB PRU 数据 RAM 1 */
       PRU0_DMEM_1   :org = 0x00002000 len = 0x00002000 CREGISTER=25

      第 2 页
       /* C28 需要进行编程以指向 SHAREDMEM、默认值为 0 */
       /*具有 ECC 的 32KB 共享通用存储器 RAM、在 PRU0 和 PRU1 之间共享*/
       PRU_SHAREDMEM  :org = 0x00010000 len = 0x00008000 CREGISTER=28

      //重要
      //在 AM263P_tech_ref_spruj55d.pdf 文件中找到 CREGISTER 的值 11
      //第 7.3.5.2.1 章 PRU 常量表
      // EntryNo。 指向的正确区域       值[31:0]
      // 11   PRU-ICSS PRU0 控制(本地)0002_2000h PRU0
      //
      //或者、只需查看文件:c:\ti\PRU_support_package\labs\labs\assembly\assembly_code\solution\am62x\AM62x_PRU0.cmd Getting_Started_Labs
      //其中说明了所有设置
      //
       PRU0_CTRL:origin=0x00022000 length=0x30 CREGISTER=11

    }

    /*指定段分配到存储器中*/
    Sections{

      .text:_c_int00*>  0x0、第 0 页
      .text      > PRU_IMEM、  第 0 页
      .data_RAM:align(4)
      {
       *(PRU_SYNC)
      }> PRU0_DMEM_0、第 1 页
      .bss       > PRU0_DMEM_0、第 1 页
      .stack      > PRU0_DMEM_0、第 1 页
      .shared_RAM:align(4)
      {
       *(shared_PRU)
      }>PRU_SHAREDMEM、第 2 页
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我们需要将.rodata 段放在链接器文件中的 DMEM/SMEM 中。  

    请 检查 以下链接器文件以供参考: 位于主·Texas Instruments/open-PRU·GitHub 上的 open-pru/source/linker_cmd/c_code/am263x/AM263x_PRU0.cmd

    此致

    Dhaval