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.

[参考译文] 编译器/MSP430FR5994:什么使用UNION?

Guru**** 2606725 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/632168/compiler-msp430fr5994-what-use-union

部件号:MSP430FR5994

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

什么使用联合?

编译器v 17.6 .0.STS / CCS 6.2 .0.0.005万

在代码中:

Union Long_a_array {
	unsigned long l;
	unsigned char a[4];};


Union Long_a_array IEEE754;
unsigned char buy[255];
unsigned char pos=12;

IEX4=*(unsigned 754. l Long*)&buy[pos];

加载到长零件0x102.0304万

在数组部分集中,只有一个[1]的其他字节-不长

为什么?

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

    更新

    如果联合写入为

    UNION LONG_A_array {
    	unsigned char a[4];
    	unsigned long l;
    };
    
    

    并加载到l=0x102.0304万
    在数组[0x00,0x04,0x00,0x00]中

    奇怪……

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从技术上讲,这不是合法的,但通常是有效的。 您能否提供一个显示问题的简短测试案例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持/

    我写入测试清除代码

    备选案文1.

    #include <MSP40.0.h>
    
    union Long_a_array {
    	unsigned char a[4];
    	unsigned long l;
    };
    
    unsigned char pos;
    unsigned char buyer[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19};
    unsigned int exp;
    unsigned char neg;
    
    void IEEE2Long (unsigned char* buff,unsigned char pos){
    	UNION LONG_AS-ARRAY IEEE754;
    	IELONG=*(ITELong*)&754[pos] 754. l ;
    	neg=IEEE754.a[0]& BIT7?1:0;exp=(IEEEEint.A[0]<1=<IEEIE1;<void
    	
    
    
    1
    WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器
    IEEE2Long (buff,12);
    	while (1);
    } 

    奇怪的结果

    我将联盟变量转移到全球

    #include <MSP40.0.h>
    
    union Long_a_array {
    	unsigned char a[4];
    	unsigned long l;
    };
    
    unsigned char pos;
    unsigned char buyer[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19};
    unsigned int exp;
    unsigned char neg;
    union long_a_array IEEE754;
    
    void IEEE2Long (unsigned char* buff,unsigned char pos){
    	IEL贵754. l =*(unsigned Long*)&754[pos];
    	neg=IEEE754.a[0]& BIT7?1:0;
    	exp=(IEEEint.a[1]<IE1)<IEE1+<ITE1;<ITE1;<ITE1=1?0
    
    
    
    WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器
    IEEE2Long (buff,12);
    	while (1);
    } 

    而且它很有效!

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

    您正在尝试实施类型打孔。  在互联网上搜索该术语将为您提供良好的背景。

    根据您的意见和代码,我认为您有兴趣对浮点类型执行位操作。  结果,编译器提供了一些内部函数来实现这一目的。  手册中未记录这些内容,因此它们是:

    浮动 __u32_bits_a_F32 (unsigned long);
    unsigned long __F32_bits_a_u32 (浮点);
    双精度型 __u64_bits_a_f64 (unsigned long long);
    unsigned long __F64_bits_a_u64 (double); 

    在来源中使用它们,就像使用C函数一样。  但是,它们不会生成任何代码。  基础位字符串被解释为新类型。  要查看一些用法示例,请在编译器RTS源代码中搜索它们。  它位于一个类似于...的位置

    C:16.9 \ti\ccsv7\tools\compiler\ti-CGT-MSP430_MSP430_MSP.3.LTS\lib\src. 

    谢谢,此致,

    -George

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

    谢谢,在中找到了

    _defs.h

    math_intr_access.h

    math_private.h

    但我不需要整个浮动范围的全力支持。 I操作从传感器发送ME浮子中的每个字节

    我的传感器输出数据 以百分比表示,温度范围为-100至100

    如果load standart float lib—丢失许多内存并运行非常缓慢。

    我 发明了一个诀窍:)在128到-128的浮动范围 内,精度10E-5 (实际使用10E-4)

    只能在端部使用位移和1个分禾器进行计算,并将浮子转换为长型,以便进行操作

    例如

    98.765.4321万 = 987.6543万

    0.0.1234万 = 123

    长时进一步操作

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

    好的,那么您可能需要考虑使用定点算术(例如 问题16)。 这使您可以使用积分操作,但仍具有分数值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
    编译器v 17.6 .0.STS支持此功能? 从哪里了解它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    定点数学不是编译器的内置功能。  这是一个你可以从 这里得到的图书馆。  请理解,编译器开发团队不提供此库。  如果您对此有任何疑问,请在 MSP430器件论坛中发布。

    谢谢,此致,

    -George

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

    谢谢

    我明白了

    仅在全球范围内开展工会工作!