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.

[参考译文] MSP430FR2355:布尔定义为返回-1?

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/966040/msp430fr2355-boolean-defined-as-t-or-f-coming-back--1

器件型号:MSP430FR2355

我有 private.h

typedef 枚举{F、T}布尔值;
extern volatile boolean incomingMssg;

我现在有 application.h

#include "prive.h"
#include "userconstants.h"


#ifndef application_H_
#define application_H_

struct userWakeFlags


易失性布尔 wakeUpFlag:1;//节点:标识周期性传输
volatile joinchar SwitchFlag:2;//客户端:识别交换机位置联接(1234)或数据(其他)
volatile boolean clientJoinFlag:1;//客户端:确定正在发生连接接受并锁定其他连接,直到完成
volatile boolean swlockout:1;//client:阻止代码在每次 LPM3唤醒时仅在交换机边缘运行
};

进行断点故障排除时

IncomingFlag 将显示为 T 或 F、有时还会显示一个较大的整数(即8564等)

但是,结构中的布尔标志显示为 F 或-1……

有人能不能向我解释为什么布尔值不总是只显示 T 或 F?  我想理解这两种情况...-1个案例一直没有显示 T. 大整数很少发生、而且似乎只发生在该标志上。

谢谢

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

    [引用 user="Steve Wenner">但是结构中的布尔标志显示为 F 或-1…… 结构中的布尔标志是包含一个位的位字段。 -1的解释是将单个字段视为有符号整数。

    根据   《MSP430优化 C/C++编译器 v20.12.0.STS 用户指南  》中的第5.5.1节“枚举类型大小”,我本以为布尔型的基础类型是无符号的。

    不确定显示-1是否是编译器或 CCS 调试器的问题。

    您使用的是哪个编译器和 CCS 版本?

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

    是的,我相信它也应该是无符号的...... 0 F,1 T.

    V 10.0.0.00010

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

    编译器 v20.2.0.LTS

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

    我使用 CCS 10.1.1和 TI 编译器 v20.2.0.LTS 创建了测试:

    这表明 RC 变量的值为1、这意味着编译器认为 布尔枚举的基础类型是无符号的。

    但是 、调试器会将 userWakeFlags 结构中的位字段布尔字段显示为 F /-1、而不是 F / T

    我从 Compiler/MSP432P4111:用于存储枚举类型 线程的容器中记得、TI 编译器发出的 DWARF 调试信息不会指定枚举的底层类型、因此 CCS 调试器假定所有枚举都是有符号的。 这解释了观察到的行为。

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

    我是一个硬件人员,所以我需要重新思考我“认为”你所说的…

    基本上 F = 0和 T =任何其他东西… 因此、我仍然可以使用 if (flags.wakeUpFlag)之类的内容。  是这样吗?

    令人不安的一点是、不属于结构的 incomingFlag 也是布尔值、我看到它显示为6578、等等...主要是 T 和 F、但有时它是一个大整数??  它只分配了 T 或 F、但当我停止调试器时、我有时会得到 一个"wonky"数字。

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

    顺便说一句 我已经将所有标志移动到 char、现在我得到了预期的0或1

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

    [引用用户="Steve Wenner]Basically F=0且 T=任何其他内容...... 因此、我仍然可以使用 if (flags.wakeUpFlag)之类的内容。  这是正确的吗?是

    [引用 user="Steve Wenner]有一点 令人担忧的是不属于结构的 incomingFlag 也是布尔值、我看到它显示为6578、etc如何 声明 incomingFlag、例如、它是全局变量还是函数中的局部变量?

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

    枚举常量(T、F)是有符号的。 [参考 C99 (N1256)第6.4.4.3节]。  

    看起来非常奇怪。

    [编辑:固定引文]

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

    ....顺便说一下,我可以强制枚举常量 f=0,t=1,我不能吗?  因此摆脱了-1 /签名.....

    此外、在前面、我执行以下操作、这些操作正常、充当无符号未签名????

    typedef enum e_radio{CMD_DATA = 0、RESPONSE1、ACK、Response2、DONE}无线电状态;
    typedef enum e_commands{a_set = 0、A_echo、R_RST、R_cmnd、R_query}消息;
    

    IncomingFlag 是 volatile 布尔值和全局变量...它用于支持主应用程序的库项目...此库项目将其声明为 extern volatile 布尔值,并在其中包含使用它的 UART ISR

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

    我怀疑通过将(有符号)枚举常量填充到1位字段中、您创建了1位有符号整数。 我以前从未想过这些、但我想这就是它们的样子。

    incomingFlag 的类型为"int"(16位)、因此它可以容纳更多的值、而不仅仅是 T 和 F。[参考 CC 用户指南(SLAU132S)第2.3.4节("--enum_type")。 SEC 5.6.1并不能真正回答问题。]

    [编辑固定引文。]