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.

[参考译文] 编译器/TMS320F28379D:使用 volatile 关键字访问 C2000 SDRAM

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/687204/compiler-tms320f28379d-c2000-sdram-access-with-volatile-keyword

器件型号:TMS320F28379D

工具/软件:TI C/C++编译器

你(们)好。

从编译器的角度来看、我发现使用"volatile"关键字访问 SDRAM、即"far"部分的要求不是必需的。

如文档中所示、要访问 SDRAM、请执行以下操作:

  • 数据/数组应具有"far"属性、因此编译器将使用32位地址模式来访问 SDRAM 中的数据/数组、因为假定符号在22位地址内:

但是、  

  • 任何具有 far 属性的数据都需要使用 volatile 关键字来使编译器满意

SPRU514H 的更新应该足以将"volatile"与"far"属性解除关联。

易失性关键字在 C 语言中有其自身的含义、因此向其添加任何特定于处理器的用法并不是一个好主意。

请随时向我提供有关 C2000编译器对此问题所做更改的最新信息。

谢谢!

年轻

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

    这种情况在应用手册 《使用 C/C++访问 TMS320F2837x/2807x 微控制器上的外部 SDRAM》中进行了讨论。   

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我理解应用手册。 这将解决 C2000编译器 v6.4.0的用例(截至今天、我们的版本为 v18.1.0)。 我认为32位寻址不再需要 volatile 关键字、因为自 SPRU514H 以来、所有指针访问都被视为32位。 唯一的例外是符号访问、默认情况下仍为22位。 因此、我要说、不再需要使用易失性。

    考虑以下情况:

    int far_data[10]__attribute__((far)); SDRAM 中的//数据数组

    要访问数据数组:

    1.直接使用符号:
    far_data[0]= 10; // far 属性应确保编译器使用32位寻址

    2.间接使用指针:
    int * far_data_p = far_data;
    *far_data_p = 10; //根据发行说明、从 SPRU514H 开始、far_data_p 应该始终为32位寻址

    因此、在任何情况下、我都看不到"volatile"关键字的坏处。

    首先、使用易失性基本上会在访问 SDRAM 时阻止优化。

    其次,volatile 关键字是强限定符,不能与常规类型(例如 volaile int!= int)混合。 在访问外部 SDRAM 和内部 SRAM 的情况下、作为一个简单的示例、需要两组 API:

    void update_data_in_SDRAM (volatile int * addr、int value); //用于 SDRAM 中的数据
    void update_data_in_sram (int * addr、int value); //表示 SRAM 中的数据

    如果我理解正确、可以避免上述情况、因为 SPRU514H 所有指针都被视为32位寻址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    需要使用 volatile 关键字来阻止编译器使用通过程序总线访问数据的指令。 示例指令为 PREAD 和 PWRITE。 6.4之前、编译器已经避免了针对易失性类型的这些指令、因为这些指令无法从存储器映射的外设寄存器中读取。  

    George 指向您的应用手册中提到了这一点。

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

    您好、Cody、

    自 SPRU514H 以来、指针类型的大小已更改为32位。 我看不到编译器为什么仍然使用22位程序总线来访问32位指针指向的内存。

    唯一的例外是直接使用符号访问存储器、因为出于性能原因、它仍然被假定为22位;但是、符号上的__attribute__((far))应该足够显式、以确保编译器不使用22位地址来使用此类符号访问此特定存储器。

    或者、我是否对编译器行为有一些误解?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    far 属性适用于符号、而不是类型。 这意味着、一旦您获取符号的地址并将其存储在指针中、就无法知道它是否指向 far 地址。 由于各种原因、支持 far 类型属性很困难、并在语言中带来许多挑战。 但是、该语言支持易失性类型、而对于 C2000、易失性可防止通过程序总线进行访问。 因此、我们决定要求所有远距离物体都是易失的。 我们无法解决这个细节问题。 所有远距离物体都必须是易失的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > far 属性适用于符号、而不是类型

    完全正确。 若要直接访问 far 符号、编译器知道使用32位地址。

    >这意味着、一旦您获取符号的地址并将其存储在指针中、就无法知道它是否指向 far 地址。

    如果指针指向 far 地址或近地址无关紧要、只要编译器跟踪更新、这是因为 SPRU514H:" C28x 上指针类型的大小现在为32位而不是22位"。 为什么编译器使用22位程序总线来访问32位指针指向的存储器?

    据我了解、我引用的 SPRU514H 中的更新的整个目的是采用统一的存储器访问方案、唯一的例外是出于性能原因进行符号访问、该访问通过__attribute__((far))正确寻址。