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.

[参考译文] CCS/LAUNCHXL-F28379D:RAM 中的3D 阵列分配、array[64][16][2]

Guru**** 2546060 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/702682/ccs-launchxl-f28379d-3d-arrays-in-ram-allocate-array-64-16-2

器件型号:LAUNCHXL-F28379D

工具/软件:Code Composer Studio

您好!
我使用 CCS V8
我已经尝试将3D 字段放入 RAM 存储器中一段时间了。 但总有问题。

提问:
1.首先将数组[64][16][2]存储在闪存中,然后存储在 RAM 中
    延迟?
2.我是这样做的

2.1 #pragma DATA_SECTION (start_up_mode_stage_1_RAM、"expdata0")
const unsigned int start_up_mode_stage_1_RAM [64][16][2]={... 0、1、2、3、...}

如果没有 const,那对我来说是不可行的。 尽管有没有 const 的示例。 常数是否可以存储在 RAM 中? 或者类似的东西仅适用于 FRAM?

2.2.
或类似的东西。 首先是 FRAM 中的值。
#pragma DATA_SECTION (start_up_mode_stage_1_flash、"expdata0")
const unsigned int start_up_mode_stage_1_flash [64][16][2]={... 0、1、2、3、...}

但是,将其从闪存移动到主() RAM?? 如此处所示。

/*extern const unsigned int start_up_mode_stage_1_64][16][2]*/
//unsigned int *** start_up_mode_stage_1_RAM;-> als global init
start_up_mode_stage_1_RAM =( unsigned int ***) malloc( 64 * sizeof ( unsigned int **));// 64 x 2D Felder

for (i = 0;i < 64;i ++){
  start_up_mode_stage_1_RAM[ i ]=( unsigned int **) malloc( 16 * sizeof ( unsigned int *));
  for (j = 0;j < 16;j ++){
    start_up_mode_stage_1_RAM[ i ][ j ]=( unsigned int *) malloc( 2 * sizeof ( unsigned int ));
  }
 }

/**/
for (val_one = 0;val_one < 64;val_one ++){
  for (val_two = 0;val_two < 16;val_two ++){
    for (val_tree = 0;val_tree < 2;val_tree ++){
      start_up_mode_stage_1_RAM[ val_one ][ val_two ][ val_tree ]=(unsigned int) start_up_mode_stage_1_flash[ val_one ][ val_tw][ val_tree ];
    }
  }


/*Hilfsvariable auf Null setzen */
I = 0;
J = 0;
VAL_ONE = 0;
Val_two = 0;
Val_tree = 0;

/*extern const unsigned int start_up_mode_stage_2[64][64] 64 x 64*/
//unsigned int ** start_up_mode_stage_2_RAM;-> als global init
start_up_mode_stage_2_RAM =( unsigned int **) malloc( 64 * sizeof ( unsigned int *));

for (i = 0;i < 64;i ++){
  start_up_mode_stage_2_RAM[ i ]=( unsigned int *) malloc( 64 * sizeof ( unsigned int ));

/**/
for (val_one = 0;val_one < 64;val_one ++){
  for (val_two = 0;val_two < 64;val_two ++){
    start_up_mode_stage_2_RAM[ val_one ][ val_two ]=(unsigned int) start_up_mode_stage_2_flash[ val_one ][ val_two ];
  }

/*Hilfsvariable auf Null setzen */
I = 0;
J = 0;
VAL_ONE = 0;
Val_two = 0;
Val_tree = 0;

我有疑问。 我可以使用 start_up_mode_stage_1_RAM 或 start_up_mode_stage_2_RAM 保存。 但不能同时使用两者。

因此、我需要一种安全的方法、因为我可以将多个阵列存储在 RAM 中。

提前感谢您!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Alex、
    您需要使用方法2.2 (存储在闪存中、然后移至 RAM)。 我将把这个移到编译器团队、该团队的某个人将在这方面为您提供帮助。

    此致、
    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您无需使用动态分配即可访问 ARM。 将初始化值放入 FRAM 是一件好事、因为这些值占用了大量空间。

    因此、只需将闪存阵列声明为:

    #pragma DATA_SECTION (start_up_mode_stage_1_flash、"expdata0")
    const unsigned int start_up_mode_stage_1_flash [64][16][2]={... 0、1、2、3、...}

    和具有相同尺寸的 RAM 阵列:

    unsigned int start_up_mode_stage_1_RAM[64][16][2];

    现在、您可以使用 memcpy 对其进行初始化:

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

    非常感谢! 问题现已解决! 遗憾的是、我不仅可以将数据保存在闪存中。 现在、对数据的访问时间对我来说非常重要、因此我应该将数据保留在 RAM 中。 但我仍可以删除一些放置的 RAM 存储器阵列一段时间。 但我稍后将进行优化。
    您能不能在此简单地写一下。 如何清除/删除放置的 RAM 存储器、以便 CPU 可以再次使用。

    空闲((unsigned int *)和数组[0]);???

    -> 不幸的是、空闲(数组);方法不起作用、内存未释放。 =(

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用 UNION。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Free 仅适用于动态分配的对象(malloc、calloc、realloc)。

    正如 Keith 所建议的、您需要使用 UNION、如下所示:

    UNION{
    unsigned int start_up_mode_stage_1_RAM[64][16][2];
    unsigned int start_up_mode_stage_2_RAM[64][64];
    } u;

    现在、这两个对象占用相同的存储器。 小心! 显然、写入其中一个成员会使另一个成员无效、因此每次只能使用其中一个成员。 此外、很显然、您必须在需要时处理加载成员的操作。

    /*第1阶段*/
    memcpy (start_up_mode_stage_1_RAM、start_up_mode_stage_1_flash、sizeof (start_up_mode_stage_1_RAM);
    do _st填 充_with (U.start_up_mode_stage_1_RAM);

    /*第2阶段*/
    memcpy (start_up_mode_stage_2_RAM、start_up_mode_stage_2_flash、sizeof (start_up_mode_stage_2_RAM);
    多种不同的东西带有(.start_up_mode_stage_2_RAM);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢!
    因此、现在我了解了这是什么意思以及应该如何实现它。 作为指向静态存储器块的指针的变量位于栈中。 但是、由于存储器块尚未设置为动态块、因此该变量在执行函数并删除所有局部变量之前始终保持栈中的局部变量/指针。 嗯、但是使用 UNION、用户仍然可以使用不同的变量/指针访问静态定义的存储器块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "但是、使用 UNION、用户仍然可以使用不同的变量/指针访问静态定义的存储器块。"

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

    您不限于对 UNION 使用堆栈存储器。  您可以将 union 设为全局变量、在这种情况下、.bss 段将会大很多、但您不需要那么多的堆栈内存。  另一方面、如果您需要空间、您确实可以使 union 成为您所描述的局部变量。  还可以使用 malloc 为 union 动态分配空间。  选择取决于许多因素、其中大多数取决于您的应用的性质。