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:DEBUGG->静态 const unsigned char oil level[2048];ovitten with zero

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1206091/msp430fr2355-debugg--static-const-unsigned-char-oil-level-2048-overwitten-with-zero

器件型号:MSP430FR2355
主题中讨论的其他器件: MSP-EXP430FR2355

您好!

数组静态 const unsigned char oil level[2048];

(当前地址0x802A 处的阵列起始)

为 NULL 覆盖了 MSP430FR2355

(CCSV10)时开启。

有人知道如何关闭此功能?

不需要初始化。

感谢您的回答。

向弗里德里希致以最诚挚的问候

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

    请看一下编译器用户指南(SLAU132Y)第5.11.22节"NOINIT 和 PERSISTENT pragma "。 默认情况下、NOINIT 变量将放置在 RAM 中。

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

    您好!

    它是关于 MSP430FR2355的。

    信息不足以解决我的问题。

    我需要地址范围介于0x8000至0x8800之间的 FRAM 区域、我可以对该区域进行写入和读取、比如0x1800至0x1A00的地址范围、在使用 CCSV10加载我的 C 程序时不会覆盖/初始化地址范围0x8000至0x8800。

    加载我的 C 程序时、从0x1800至0x1A00的地址范围被"不"覆盖。

    即使进行复位、也不得覆盖/初始化从0x8000到0x8800的地址空间。

    我还在寻找 linker.CMD 文件的文档,因为这里出现了一个定义,例如.info : type = NOINIT{}> info ,这显然可以确保从0x1800到0x1A00的地址范围不会被初始化。

    在文档 ASM_slau131y.pdf Compiler_slau132y.pdf 中找不到表达式.info。

    可能有一个__linker.CMD-File__的示例程序处理了该问题。 在 TI 的示例程序中、只处理了一个 FRAM 单元、缺少相关的 linker.CMD 文件。

    我遇到问题的原因是地址范围0x1800至0x1A00对于我的用途而言不够用。 我需要另一个2K 字节。 数据将被写入此区域、之后的程序更改中不能将其销毁。

    向弗里德里希致以最诚挚的问候

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

    您提到了描述如何执行此操作的文档、但没有看到 SLAU131Y 中描述"链接器命令文件"的第8.5节

    如果您不需要数组恰好位于0x8000、但在程序 FRAM 中的某个位置介于0x8000和0xFFFF 之间、那么最简单的方法是修改 链接器文件中的一行。 在 FR2355的 CCSV12 (在 CCSV10中可能与之相同)中、"lnk_msp430fr2355.cmd"中有一行包含:

    .TI.noinit  : {} > RAM                  /* For #pragma noinit                */

    更改为:

    .TI.noinit  : {} > FRAM                  /* For #pragma noinit                */

    然后使用 NOINIT pragma 指令:

    #pragma NOINIT(OIL_Level)
    volatile static const unsigned char OIL_Level[2048];

    如果必须将其恰好放置在0x8000至0x8800之间、则需要修改链接器文件或将 LOCATION pragma 与 NOINIT 结合使用。

    不是对您的问题的直接回答、但您打算如何修改数组的内容?  使用"const"关键字声明意味着您会更改 C 运行时之外的值。 在这种情况下、您还需要包含"volatile"关键字、否则即使优化已关闭、它也会被优化而不会分配到存储器中。

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

    持久性数据在程序下载(实际上是程序文本的一部分)时初始化、但不会在复位时初始化。

    Noinit 数据不会被程序下载(或复位)覆盖。  您需要自行确定内容是否有效。

    但是,noinit 可以在下载过程中擦除。 您需要将"Project->Properties->Debug->MSP430 Flash->Erase Options"设置为(或者)"Erase..needed segments Only"或"Replace writed memory locations"(我已经忘记了哪个)。  

    FR2355没有 MPU、因此需要通过设置 SYSCFG0:PFWP=0来显式启用写入。 根据您的使用、您可能会从 SYSCFG0:FRWPOA 中获益良多。

    将 TI.noinit 放入 FRAM [此处引用 Seth ]:

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1104880/msp430fr5994-testing-use-of-pragma-persistent-writing-to-fram-across-power-cycles-with-the-debugger/4093541

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

    您好!

    很抱歉、不起作用。

    加载时、来自0x8000 (编译器放置数组的位置)的数据被0xff 覆盖。

    内存浏览器会显示此信息。

    我将 lnk_msp430fr2355.cmd 中的第139行从.TI.noinit :{}> RAM 更改为.TI.noinit :{}> FRAM。

    "Project->Properties->Debug->MSP430 Flash->Erase Options"中

    我已选择"按地址范围(下面的规格)"、并指定了要用0x9000到0xa000进行擦除的区域。

    我还注意到什么:我可以通过存储器浏览器更改0x8000处的内容。

    如果我现在将程序从 PC 加载回 MSP-EXP430FR2355、

    使用0xff 覆盖数据。

    这里是测试程序

    #include

    void write_oil_level_UC8 (unsigned char、unsigned char *);

    volatile unsigned char * oil_level_WRITE_ptr=0;
    无符号 int ui_counter1;
    unsigned int UI_break=0;
    无符号字符 uC_data;
    unsigned char uC_zw1;

    #pragma NOINIT (OIL_LEVEL)
    Volatile unsigned char oil_level[2048];


    int main (空)

       WDTCTL = WDTPW | WDTHOLD;

       uc_zw1=oil_level[0];
       oil_level_WRITE_ptr =&oil_level[0];
       P1OUT &=~BIT0;
       P1DIR |= BIT0;

       PM5CTL0 &=~μ A LOCKLPM5;
       //uC_data ='a';

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       while (1)
       {
           UI_counter1=0;
          操作
          {
              SYSCFG0 = FRWPPW | FRWPOA0 | DFWP;
              *oil_level_WRITE_ptr ='a';
              SYSCFG0 = FRWPPW | FRWPOA0 | PFWP | DFWP;
           oil_level_WRITE_PTR++;
           UI_counter1++;
          {while (ui_counter1<2048 );

          UI_break=0;

          for (;;)
          {
            P1OUT |= BIT0;
            __delay_cycles (400000);
            P1OUT &=~BIT0;
              __delay_cycles (400000);
             }
        }
    }

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

    如果加载为0xFF、则表示调试器正在擦除程序加载时的存储器段。

    我在 FR6043上尝试了测试代码、所有设置都是相同的、并且在运行至 UI_break=0后所有字节都设置为"A"。 我停止了调试器、重新加载了程序、并检查了存储器、同时位于写入 WDTCTL 寄存器的默认第一个断点处。 所有存储器仍读取为"A"。 由于我没有 FR2355、因此我无法准确复制您的设置;主要区别在于我的器件配有 MPU、而您的器件配有 SYSCFG0寄存器 Bruce 指出。

    另外 需要注意的是、"Project->Properties->Debug->MSP430 Flash->Erase Options"中的起始地址和结束地址不符合 Note2的要求。 0x9000和0xA000都是偶数地址;也许您可以尝试0x8800和0xFFFF。

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

    我没有成功使用您的地址范围、因为其他段是在0x8800-0x9000中分配的。  

    我成功使用了"Replace writed..retain unwrited"。

    我认为 FRWPOA 的设计思想是、如果您(一次)设置它、您就不必通过 PFWP 来愚弄它。 在您的情况下、您可能需要 FRWPOA1 (我没有看到 FRWPOA_2的定义、这将是一个更好的名称)。

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

    您好!

    现在它开始工作了。

    解决方案:

    在 C 程序#pragma NOINIT (OLOE_LEVEL)中

    Volatile unsigned char oil_level[2048];

    Linker.cmd 第139行中插入

    .TI.noinit :{}>.TI.noinit 中的 RAM :{}> FRAM

    变化

    在"Project->Properties->Debug->MSP430 Flash->Erase Options"中,将"Replace writed.."切换为 等。

    非常感谢您的帮助。

    我将 FRWPOA0更改为 FRWPOA1。

    此致

    弗里德里希