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.

[参考译文] 编译器/TM4C129CNCZAD:使用const指针初始化的const结构获得.data而不是.const中的位置

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/604356/compiler-tm4c129cnczad-const-struct-initialized-with-const-pointer-gets-places-in-data-instead-of-const

部件号:TM4C129CNCZAD
“Thread:SysBIOS”中讨论的其它部件

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

使用编译器版本15.2 .................5 LTS,我尝试将信号处理(TI的报头将其定义为指向对象的连接指针)置于连接结构中以进入闪存。  如果初始化赋值是另一个const数据类型,编译器似乎做了错误的事情,并将整个结构置于RAM中。  该文件是C++文件。

typedef ti_SysBIOS_KNL_semaphore_Object* ti_SysBIOS_KNL_semaphore_handle;

const ti_SysBIOS_KNL_semaphore_handle my_SEM =&sum_semaphore;

struct myt {
ti_SysBIOS_KNL_structionore_handle handle;const


//放置在.sem = mystruct mystruct <={= mystruct mystruct



mystruct mystruct <= mystrut/mystrut}中


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    my_sem是常量表达式,但它不是常量表达式(没有开玩笑!) 要将结构变为.const,您需要将其更改为".handle =&some信号量"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在C中,您可以这样做,但C++确实允许const表达式赋值。  问题是SYS-BIOS将其定义为const表达式

    const ti_SysBIOS_KNL_semaphore_handle my_SEM =(ti_SysBIOS_KNL_semaphore_handle)((ti_SysBIOS_KNL_semaphore_handle)&ti_SysBIOS_KNL_semaphore_Object__table_V[2]); 

    因此,我不能按您描述的方式使用它,而是必须使用SYS-BIOS提供的句柄。

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

    作为对这个主题的回应,我在SDOWP系统中提交了两个条目。  一个是文档中的错误。  另一个则要求改进编译器。

    Entry CodeGen-2354是ARM编译器手册中的一个错误。  手册指出.const部分中有一个标记为const的变量(少数例外)。  这适用于C ,但不适用于C++。  在C++中,等号右侧的表达式可以不仅仅是简单常量或地址。  发生这种情况时,变量不会放在.const部分中。  例如...

    Kaveh Vaghofi 说:
    .handle = my_SEM

    表达式my_SEM不是地址,而是内存位置。  无法在构建时对其进行评估。  因此,y不会放在.const中。  

    条目 代码Gen-2355不报告错误,但要求改进。  在这种情况下,如果my_sem可以替换为&some信号量,那么y可以放置在.const中。

    欢迎您使用我签名中下面的SDOWP链接关注这些条目。

    谢谢,此致,

    -George

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

    太好了,感谢您清除这些信息并提交这些条目。  我对您所指的地址和内存位置之间的区别仍然很好奇。  从编译器的角度来看,我认为它将地址视为与您所说的'存储位置'有根本不同的东西。  我假设'mory loca'只是被当作一个32位整数,编译器不知道它的实际地址,所以它不把它当作是这样的。  是这样吗?

    听起来,如果实现CodeGen-2355,它将执行此处所需的操作。  从根本上说,我尝试将静态创建的SYS-BIOS对象引用存储在闪存中,而不是存储在RAM中(这在嵌入式环境中似乎是一件合理的事情)

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

    我将使用比您的示例简单的示例进行解释,但在重要方面是相同的。

    const int *global_ptr =变量(&variable; 

    ...可以在构建时进行评估。  请将其与...

    const int *global_ptr = another _ptr; 

    表达式another _ptr不是地址。  它是必须读取的内存位置。  这只能在运行时发生。  C中不支持此功能 ,但C++中支持此功能。  

    谢谢,此致,

    -George

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

    啊。  为了扩展您的示例,如果another _PTR是在编译时从某个地址声明的连接,那么为什么编译器不能以可传递的方式连接这两者?

    const int * const another _ptr =&variable;
    
    //可以在构建时进行计算
    const int *global_ptr1 =&variable;
    
    //不能在构建时进行计算?
    const int *global_ptr2 = another _ptr; 

    sys-bios声明`const ti_SysBIOS_KNL_semaphore_handle`是typedef指针。  为什么在编译时不能将const指针作为地址求值?

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

    Kaveh Vaghofi 说:
    为什么编译时不能将const指针作为地址求值?[/QUOT]

    这是编译器优化。  我提交CodeGen-2355以请求编译器实现它。

    谢谢,此致,

    -George

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

    太棒了,谢谢!