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:一些问题

Guru**** 2589280 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/612324/compiler-msp430fr5994-some-questions

器件型号:MSP430FR5994

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

我对 MSP430和 TI 编译器有一些问题。

1) 1) MSP430指令集中是否有"中断"指令?
当调试器被连接时、一个"中断"指令将作为一个断点、否则它将作为一个 NOP。

2) 2)对于 C 指令"A |= B;"和"A &=~B;"、编译器是否始终生成一条汇编器指令"BIS B、A"或"BIC B、A"?
如果情况并非总是如此,那么要尊重的限制是什么?

3)未记录的编译器选项“-vmspx”的用途是什么?

4)如何防止用常量对象的值替换其访问?
例如:
以下常量在 C 源代码中定义为0x10。
我们允许生产人员在启动固件之前更改 FRAM (或闪存)中的此值。

const unsigned char ProductionParameter = 0x10;
(笑声)

   P1OUT &=~ProductionParameter;

调试  --opt_level=0 --opt_for_speed=0 //访问 const 对象:确定
   D2C2    BIC.B   &ProductionParameter、&P1OUT
   C240     
   0202.     

释放--opt_level=4 --opt_for_speed=5    
   const 对象被值~0x10取代、而生产值被忽略!
   F2F0    和.B   #0x00ef、&P1OUT
   EF00     
   0202.     

此致、Bernd

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

    1) 1)没有单个指令、但我怀疑有一种实现这一点的方法、我不知道。  您可能需要在特定于 MSP 的论坛中提出这一问题。

    2) 2)在这种情况下、不能保证编译器始终生成 BIS 或 BIC、但很可能会生成 BIS 或 BIC、尤其是当参数是寄存器时。  很抱歉、我目前没有更好的答案。

    3)未记录。  它在16位 MSP 和20位 mspx 之间进行选择。  在编译器帮助屏幕中:

     -v、--silicon_version=msp、mspx

                 指定器件内核版本。 (未指定时、

                 编译器默认为--silicon_version=MSP)

    4) 4)声明它为易失性:

    const volatile unsigned char ProductionParameter = 0x10;

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

    1) 1)将检查该值

    2) 2)我们通常在外设寄存器上使用 BIC 和 BIS。
    在汇编级、指令 BIC 和 BIS 自然是原子指令、因此当外设寄存器被中断修改时、我们可以避免出现问题。
    我正在寻找一种在 C/C++级别具有原子 BIC 和 BIS 的高效方法。
    你有什么想法吗?

    3) 3)还可以。 我在文档中搜索了"-vmspx",但没有搜索"-v"。

    4) 4)当我使用"易失性"时、不能进行更换、这是可以的。
    但是、优化器生成的代码的大小是未进行优化的代码的两倍、周期也是其一半。
    至少、我希望优化器选择最小或最快的代码、但不能同时选择最大和最慢的代码。
    “P1xxx |= ProdParam”不会出现此问题,而是仅出现“P1xxx &=~ProdParam”。
    优化器将"BIC"替换为"and"、但保留了"BIS"。
    是否可以改进生成的代码?

    const volatile unsigned char ProductionParameter = 0x10;
    (笑声)

       P1OUT &=~ProductionParameter;

    调试  --opt_level=0 --opt_for_speed=0
       D2C2    BIC.B  &ProductionParameter,&P1OUT ;6个周期
       C240     
       0202.     

    释放--opt_level=4 --opt_for_speed=5    
       3F40    MOV.W  #0x00ff、R15                 ;2个周期
       FF00            
       5FE2    XOR.B  &ProductionParameter,R15    ;3.
       BE40            
       C2FF    和.B  R15,&P1OUT                  ;4.
       0202.    

    此致、Bernd         

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

    我无法重现此结果...

    [引用 USER="BO]版本--opt_level=4 --opt_for_speed=5    
       3F40    MOV.W  #0x00ff、R15                 ;2个周期
       FF00            
       5FE2    XOR.B  &ProductionParameter,R15    ;3.
       BE40            
       C2FF    和.B  R15,&P1OUT                  ;4.
       0202    [/报价]

    请按照文章 How to Submit a Compiler Test Case 中的说明进行操作

    谢谢、此致、

    乔治