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.

[参考译文] 编译器/TMS320F28375D:有关编译器的问题

Guru**** 2422630 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/795359/compiler-tms320f28375d-questions-about-compiler

器件型号:TMS320F28375D

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

e2e.ti.com/.../4137.section_5F00_test-base.zip

首先、我将向您介绍这里的环境
 Code Composer Studio 版本:6.1.0.00104
 编译器版本:TI v6.2.8 (和 v6.4.8)
 测试目标:F2837x controlCARD R1.3

我使用 Debug Build Configuration (Not Release)进行了一些实验。
我附加了一组基本工程文件。

[实验1]简单的 main.c
从基本工程中注释掉下面的 SET_DATA_SECTION。
===
//#pragma SET_DATA_SECTION ("my_section")

const int sone_const = 10;

//#pragma SET_DATA_SECTION ()
===

构建后、我检查了映射文件。
"some _const"符号映射到 ROM 中。
===
0    000901c0 _some _const
===

如果通过 CCS Debug 运行、LED 将正常工作。
如果是独立启动、则 LED 工作正常。

[实验2]使用 DATA_SECTION
按原样使用基本工程。

构建后、我检查了映射文件。
"some _const"符号映射到 RAM 中。
===
1    0000b800 _so_const
===

如果通过 CCS Debug 运行、LED 将正常工作。
如果是独立启动、则 LED 不工作、因为 some _const 可能为0。

[实验3]使用 DATA_SECTION (排列)

从基本工程中添加新变量定义。
===
#pragma SET_DATA_SECTION ("my_section")

int some 变量;
const int sone_const = 10;

#pragma SET_DATA_SECTION ()
===

构建后、我检查了映射文件。
"some _const"符号映射到 ROM 中。
===
0    000901c0 _some _const                           
1    0000b800 _some 变量
=

如果通过 CCS Debug 运行、LED 将正常工作。
如果是独立启动、则 LED 工作正常。


[问题1]

spru514p 6.12.2中有以下一句话。
"您可以使用 DATA_SECTION pragma 将变量放置在.econst 以外的段中。"

因此、[实验2]似乎是正确的。
为了在此映射中独立使用、需要在启动时创建并加载具有初始值的 ROM 数据。
我该怎么做?


[问题2]

我预期[实验2]和[实验3]是相同的。
为什么不呢?

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

    我可以解释发生了什么。 我不能告诉你最好的前进道路。  这需要了解系统知识和系统启动方面的专业知识、我对此缺乏了解。

    有关一些有用的背景信息、请在 C28x 汇编工具手册中搜索 标题为汇编器如何处理段的子章节。 阅读该文档、充分了解术语"未初始化"段"已初始化"段

    在实验1中、变量 sone_const 位于已初始化的段.econst 中。 链接器命令文件使用此行…分配此段

    .econst :>> FLASHF | FLASHG | FLASHH PAGE = 0、ALIGN (4) 

    当您不显示该段时,我假设该已初始化段已编程到闪存中。 因此、当系统开始运行时、.econst 段已经存在。

    在实验2中、变量 sone_const 位于已初始化的 my_section 中。 链接器命令文件使用此行…分配此段

    my_section:> RAMD1,page = 1 

    CCS 使用内置加载程序将已初始化的段从可执行.out 文件复制到 RAM。 在没有 CCS 的情况下引导系统时、这种复制是如何发生的? 我假设无法访问可执行的.out 文件。

    为了进一步说明将已初始化段从.out 文件复制到 RAM 的问题、请考虑如何针对代码完成此操作。 链接器命令文件包含这些行…

    ramfuncs :LOAD = FLASHD,
    RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4) 

    这表明已初始化的代码段 ramfuncs 在存储器范围 FLASHD 中有一个加载地址、在其中一个 RAM 存储器范围中有一个运行地址。 load_start 运算符与其他类似运算符一起创建符号、这些符号在系统启动期间用于将 ramfuncs 段从闪存复制到 RAM。 需要使用类似的解决方案将初始化的数据段 my_section 编程到闪存中、然后在系统启动期间复制到 RAM 中。 据我所知,没有人这样做。 我不知道为什么。

    在实验3中、当我构建代码时、我获得该诊断…

    警告#849-D:my_section 段包含不兼容的对象"so_variable"(data)和"se_const"(const)、"se_const"不会包含在 my_section 中 

    变量 sone_const 位于已初始化段.econst 中、变量 sone_variable 位于未初始化段 my_section 中。 这就是它的作用类似于实验1的原因。

    谢谢、此致、

    乔治

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

    您好、George

     感谢您的回答。
     我几乎理解。 但还有一些其他问题。

    [问题1"]

    您写道:
    需要使用类似的解决方案将初始化的数据段 my_section 编程到闪存中、然后在系统启动期间复制到 RAM 中。 据我所知,没有人这样做。 我不知道为什么。

    我知道 TI 编译器不支持 const 的 DATA_SECTION。
    正确吗?

    [问题3]

    ln my [实验3]、我了解为何未在 my_section 中放置 const 作为您的答案。
    然而,这些决定是在档案中作出的。
    如果指定了多个文件 SET_DATA_SECTION ("my_section")、对于只有 const 的 c 源文件、某些 const 变量将放置在.econst 中、对于非 const 和 const 混合的 c 源文件、则其他 const 变量将放置在 my_section 中。
    我要做的是将所有非常量变量(RAM)放置在 my_section 中。
    是否有任何方法可以指定此类信息?

    谢谢、此致、
    Kento

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

    您面临两个主要限制。

    第一、在同一文件(C 或汇编)中、一个段只能被初始化或未初始化。  不要同时使用这两者。  一旦一个段被建立为一个段、它就不能更改为另一个段。

    第二、几乎不支持将初始化的数据段放入 RAM 中。  这并不是不可能的。  但您必须自己完成所有操作。

    [引用 user5931564]I 了解 TI 编译器不支持 const 的 DATA_SECTION。
    它是否正确?

    您可以在您命名的段中放置常量变量。  但不能将非常量变量放在同一段中。

    [引用 USER="user5931564">我要做的是将所有非常量变量(RAM)放入 my_section 中。
    是否有任何方法可以指定此类内容?

    对常量变量和非常量变量使用不同的段名。  切勿将它们混用。

    谢谢、此致、

    乔治

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

    我对常量变量和非常量变量使用不同的段 Nemes。

    感谢您的宝贵建议、
    Kento