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.

[参考译文] RM57L843:声明外部存储器中的数组和变量- EMIF

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/995463/rm57l843-declaring-arrays-and-variables-in-external-memory---emif

器件型号:RM57L843

你好!

我已经通过 EMIF 模块连接了一个外部存储器接口。 基本而言、它是一个 DPRAM (4K x 16位)。 遗憾的是、我错过了控制器的引脚 BA0、Ba1和 A0、并将控制器的 A1直接连接到 DPRAM 的 A0。  

现在无法纠正此硬件错误、我计划现在继续执行此实现。

现在、当我必须在 DPRAM 空间中声明变量时、我使用:

#pragma 位置(ui_dummy_variable、0x64000000)

uint16 ui_dummy_variable;

要将地址0x64000000分配给变量"ui_dummy_variable"、对吧?

由于上述硬件错误、如果我必须在 DPRAM 存储器空间中增加下一个地址、那么我必须将地址乘以8才能生成下一个顺序地址。

pragma 位置(ui_next _dummy_variable、((0x64000000 + 1)* 8))

uint16 ui_next 虚拟变量;

因此、在 DPRAM 空间中、变量"ui_dummy_variable"和"ui_next _summy_variable"会一个接一个地分配。

问题是、如果我需要特定大小的数组、该怎么办?

例如、如果我声明如下:

pragma 位置(ui_dummy_array、((0x64000000 + 2)* 8))

uint16 ui_dummy_array[4];

这是否按照以下方式在 DPRAM 中分配内存:

UI_dummy_array[0]=((0x64000000 + 2)* 8))<- ui_dummy_array[0]的地址

UI_dummy_array[0]=((0x64000000 + 3)* 8)

UI_dummy_array[0]=((0x64000000 + 4)* 8)

UI_dummy_array[0]=((0x64000000 + 5)* 8)

如果不是、那么存储器以什么方式分配给 DPRAM 中的"ui_dummy_array[4]?

请提供一些帮助。

谢谢!

此致、

Chetan。

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

    抱歉、出现拼写错误:

    UI_dummy_array[0]=((0x64000000 + 2)* 8))<- ui_dummy_array[0]的地址

    UI_dummy_array[1]=((0x64000000 + 3)* 8)

    UI_dummy_array[2]=((0x64000000 + 4)* 8)

    UI_dummy_array[3]=((0x64000000 + 5)* 8)

    *指数已更正....

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

    EMIF 地址引脚 EMIF_A[0]始终提供一个32位字地址的最低有效位。 这就是为什么 EMIF_A[0]被映射至 SRAM_A[1](16位存储器)、而 EMIF_A[1]被映射至 SRAM_A[2]。

    如果将 EMIF_A[1]连接到 SRAM_A[0]、则地址0x00 (偏移量)映射到 SRAM 的前半部分、0x08映射到 SRAM 的第二半字。

    EMIF (偏移)       SRAM (半字的位置)

    0                 0

    8.                 1

    16.                2.

    24                3.

    32                4.

    因此,如果要写入第 n 个半字,则代码中的地址应更改为0x64000000 + n*8

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

    你好,王!

    我得到了您的观点、我想我在问题中键入了这一点。 是的、我必须将第 n 个地址添加到基址0x64000000、然后将其与8相乘。

    我要问的是我在这样的外部存储器空间中声明阵列! 让我们忘记、无论是 SRAM 还是 DPRAM 等  

    当我使用#pragma location()并声明特定大小的数组时,我想知道地址在外部存储器中的分配顺序? 如果我的数组大小很大(例如1K)、那么我无法继续为数组的每个元素使用#pragma 位置、对吧?  

    此外、如果我在第一次发布中建议的错误、是否有任何其他方法可以在外部存储器中同步声明阵列。

    此致、

    Chetan。

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

    您好、Chetan、

    我不知道如何在#pragma location()中使用变量。  

    您可以声明一个长变量、但只使用较低的2字节、并将此变量直接分配给该存储器地址。

    #pragma LOCATION (x、0x64000000)

    uint64_t x[200];

    main(){

      X[0]= 0x00000000000000005a5b;-->或 x[0]= 0x5a5b

      X[1]= 0x00000000000000006a6b;-->或 x[1]=0x6a6b

    因此、0x5a5b 将放置在0x64000000、0x6a6b 放置在0x64000008

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

    你好,王!

    对我来说,这似乎是唯一的办法! 我只会这样尝试。

    谢谢、

    Chetan。

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

    尊敬的王先生:

    通常,如果不使用#pragma location(),如何在外部存储器空间中声明变量。 只是想知道。 您是否直接在该存储器空间中使用指针?

    此致、

    Chetan。

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

    您好、Chetan、

    您可以将变量放置在分配给外部存储器的数据段中:

    #pragma SET_DATA_SECTION (".myRAM")

    uint8 buffer[128]={0};  

    uint32 x、y、z;

    #pragma SET_DATA_SECTION ()

    然后在链接器 cmd 文件中、将.myRAM 段映射到外部存储器

    存储器

      …

      EXT_MEM:  (RW):origin=0x064000000 length=0x00001000

    部分

      …

      myRAM :{}> EXT_MEM

    缓冲区[]、x、y 和 z 将被放置到外部存储器中。