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.

[参考译文] TMS320F28384D:DRAM 中 uint16 指针地址计算出现问题、导致 0x80000000 不正确

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1635091/tms320f28384d-issue-with-uint16-pointer-address-calculation-in-dram-resulting-in-incorrect-0x80000000

器件型号: TMS320F28384D

您好 TI 支持部门、

将 uint16_t 指针从 volatile union 转换为时、我遇到地址解析问题 uint32_t。 计算出的地址意外 0x00000000 而不是预期的物理 RAM 偏移。

环境:

  • 编译器:  TI v22.6.2.LTS
  • 优化:  迷惑不解

相关代码:

c.
 

//定义
typedef 联合体{
  uint16_t DramData[DRAM_size];
  结构
  {
    uint16_t Debug_CNT;
  };

}dram_var_def;

volatile dram_var_def  dram_var;
易失性_uint32_t 地址;


//代码
  DELAY_US (1);
  //展开测试
  地址=(uint32_t)&dram_var.dramData[0];
  ReadWriteMemoryTest (address、DRAM_Size);

装配体转储(从) ReadWriteMemoryTest

 
  0x082B4A  7640C122    LCR          F28x_usDelay
  0x082B4C  761F0260    MOVW         DP、 #0x260
  0x082B4E  8F000000    MOVL         XAR4、 #0x000000
  0x082B50  A800        MOVL         @0x0、 XAR4
  0x082B51  FF2F0200    MOV          ACC、 #0x200 << 15
  0x082B53  1E42        MOVL         *- SP[2]、 符合
  0x082B54  0600        MOVL         ACC、 @0x0
  0x082B55  76482D75    LCR          ReadWriteMemoryTest

观察到的观察结果:

  • address 可变内容:  0
  • &Dram_var.DramData[0] 地址:  0x80000000

问题:

为什么地址被解析为 0? 我应该采取哪些步骤来解决此问题?  

谢谢你。

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

    问题已解决!

    解决方案:  我将 __attribute__((far)) 属性添加到变量声明中。 这会明确告知编译器该变量驻留在“far"存储“存储器(例如外部 DRAM)中、以确保其生成完整的 32 位地址计算指令。

    修改后的代码:

    c.
    volatile Dram_var_Def Dram_var __attribute__((far));

    组装转储比较(解决方案后):  请注意生成的汇编代码中的变化、尤其是在 MOV 用于设置地址的指令(行 0x082B4C - 0x082B4E)中:

    组件
    0x082B47 76482A51    LCR          emif1_dram_config
    0x082B49 0226        MOVB         ACC, #38
    0x082B4A 7640C122    LCR          F28x_usDelay
    0x082B4C 28A90000    MOV          @AL, #0x0000   <-- Generates 32-bit address handling 0x082B4E
    0x082B4E 28A88000    MOV          @AH, #0x8000   <-- Generates 32-bit address handling 0x082B50
    0x082B50 761F0260    MOVW         DP, #0x260
    0x082B52 1E00        MOVL         @0x0, ACC
    0x082B53 FF2F0200    MOV          ACC, #0x200 << 15
    0x082B55 1E42        MOVL         *-SP[2], ACC
    0x082B56 0600        MOVL         ACC, @0x0
    0x082B57 76482D77    LCR          ReadWriteMemoryTest

    感谢大家的帮助和指导!