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.

[参考译文] 编译器/MSP430FR5969:UINT16_t指向uint8_t值的指针

Guru**** 2611705 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/642793/compiler-msp430fr5969-uint16_t-pointer-to-uint8_t-value

部件号:MSP430FR5969

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

我的结构设置如下:

结构foo{

uint8_t low;

uint8_t high;

} foo; 

当我这样做时:

void foo(){

uint16_t volatile *bar;

bar =(uint16_t volatile *)&foo.low

} 

指针栏 不能获取foo.low字节的地址。 相反 ,这是完全不同的。 在此特定编译版本中,foo.low的地址是0x0000B2E6,但指针条指向 0x0.0003万C2,这是完全错误的。  

 调试器表达式 认为它应该工作出色,即*(uint16_t volatile *)&foo.low解析为16位值,foo.high为首字节。  

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

    您似乎显示的是问题代码的缩减形式,而不是真实的内容。  对于包含与此行等效的实际函数...

    [报价用户="Olli Mannisto"]栏=(uint16_t volatile *)&foo.low

    ...请按照如何 提交编译器测试用例一文中的说明提交测试用例

    谢谢,此致,

    -George

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

    好的,你有一个下午。 在实际代码中,操作发生在以下位置:

    void PWM_Decode_Init(){
    //计算100 % 电流的DAC值
    USHORT *挥发性电流;
    UCHAR易失性低电流;
    Current =(USHORT *)&myconfig_rw.current_l;
    low_current = myconfig_rw.low_current;
    pwm_status.current_constituate=Calculate_Current_Constant (*电流,FALSE); 

    有趣的是*current包含了合并current_l和current_h的预期值(0x0140) 但是Calculate_Current_Constant函数接收0xFFFF。  

    另请参阅stackexchange:  

    stackoverflow.com/.../c-word-pointer-to-a-byte-structure-member

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我将地址存储为Ulong,并将其传递到Calculate_Current_Constant,然后将其转换为函数内的USHORT指针,则可以正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUOTE USER="Olli Mannisto",好的,您得到了下午。[/QUOT]

    谢谢你。  现在我有源代码了。  但我不知道您使用的是哪个版本的编译器,也不知道构建选项。  请按照编译器看到的内容准确显示生成选项。

    谢谢,此致,

    -George

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

    这将是用于调试的TI 17.9 .0.STS和16.9 用于发布的16.9 .2.LTS [LTS.4.LTS]。 我可能会让两者使用相同的版本。  

    编译器标志:

    -vmfx --code_model=large --data_model=restricted --neil_data=globals -o0 --opt_for speed=3 --use_hw_bumped=F5 --include_path="C:\ti/MSPccsv7/csv7/Ccs_basel_sts/include=-ccupdiminsp_sp_sp_conv=-sp_msp_sp_spdiminsp_sp_sp_sp_spdiminsp_sp_sp_sp_cw_cw_cw_guidf=-msp_sp_sp_sp_sp_csp_csp_csp_csp_rema_rema_cspurby=cv7=-mspx:/ccupdiminsp_cv7=cv7_mspdimperf:/spdimper_sp_sp_sp_sp_sp_sp_sp_sp_sp_sp_sp_cv7_sp_convf:/spsbulinsp_sp_spsb 17.9

    链接器标志:

    -vmspx --code_model=large --data_model=restricted --neil_data=globals -o0 --opt_for _speed=3 --use_hw_bump=F5 --advice:hw_config="all"--definite_debug_debug__--definit_spit_spit_spit_spirm=7_ccup_ccup_ccup_sp_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_sp_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup=-ccup_ccup_ccupd=-ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_ccup_g=-ccup_ccup_ccup_gc 17.9 17.9

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

    我将C代码构建到组件并进行了检查。  我找不到任何关于说明的问题。  但我确实发现了Dwarf信息的问题。  我在 SDOWP系统中提交了CodeGen-3987,以对此进行调查。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    请记住,我无法运行代码。  但据我所能说,它应该正常运行。  由于Dwarf问题,调试器显示的值不正确。  这是否与您的体验相符?

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我将指针转换为USHORT * volatile current时,调试器开始显示正确的值。 但如果我取消将其作为函数的参数引用,则会将错误的值传递给该函数。 是的,这确实打破了代码,所以这是真的。

    我可以试着为您削减代码,但根据我的经验,这也会使错误消失。 问题在于init例程,因此此时不需要外部硬件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信我已经弄清楚了。
    uint8_t myconfig_rw.current_l位于内存地址0x0.4563万中,该地址不是字对齐的。 。
    Current =(USHORT *)&myconfig_rw.current_l;行生成以下内容:
    MOVX.A #0x0.4563万,0x0000a (SP)

    当我将其引用到一个单词变量时,将生成这些行
    Mova 0x000a (SP),R15
    MOV.W @R15,0x000e (SP)

    0x000e接收0xffff而不是地址0x0.4563万中的任何内容,因为这不是有效的字词对齐地址。

    现在,*debuger*不会出现显示奇数地址中的字值的问题,并且会高兴地在指针地址中显示预期值(0x140)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Olli Mannisto 说:
    Current =(USHORT *)&myconfig_rw.current_l;

    ...导致违反严格别名规则。  在Web上搜索该术语会生成大量有关该术语的背景信息。  无论何时取消引用指针电流,都将发生实际违规。  编译器假定您从未违反此规则。  尽管如此,有些用户还是会非常谨慎地违反它。  在所有字节结构上使用DATA_ALIGN pragma就是一个示例。   

    谢谢,此致,

    -George

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

    这对登记处的外部访问有一些影响。 似乎每当SPI主程序访问某个字时,我都需要解构字写入/读取到字节访问。  

    ..并且,是的,尝试对字节/单词读取执行类似的操作。