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.

[参考译文] MSP430FR2311:定义为 persistent 的变量为只读

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1268872/msp430fr2311-variable-defined-as-persistent-is-read-only

器件型号:MSP430FR2311

您好!

我正在尝试使用 PERSISTENT pragma 使变量保持持久性。 该代码是 Andreas Dannenberg 所做的示例的副本(发布在 TI 论坛上某处):

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//============================================================================
// Name : #pragma PERSISTENT Test for C++
// Author : Andreas Dannenberg
// Version : 1.0
//============================================================================
#include "msp430.h"
// Declare a simple class that maintains a static counter variable. Note that
// only one copy of this variable is shared by all instances of this class.
class PersistentTest {
public:
int getCounter() {
return counter;
}
void setCounter(int newCounterValue) {
counter = newCounterValue;
}
void incrementCounter() {
counter++;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我已经创建了一个空白项目、上传了此代码、但 persistent 变量不会更改值。 它将保持为0。 调试器不能更改该值(程序在断点处停止):它可以简单地反转至0。

map 文件显示该变量位于 persistent 段中:

Fullscreen
1
2
3
4
5
6
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.TI.persistent
* 0 0000f100 00000002
0000f100 00000002 main.obj (.TI.persistent)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

问题可能是什么?

编辑:在一个电源循环(关闭电源几秒钟)后、这个示例就有效了。 但是、我有一个更复杂的程序、仍然显示相同的行为。 线索非常受欢迎

谢谢。

尤斯图斯

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

    附加信息:简单示例.map 文件会在全局符号列表中显示持久性符号:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GLOBAL SYMBOLS: SORTED BY Symbol Address
    address name
    ------- ----
    000000a0 __STACK_SIZE
    .....removed lines.....
    00002360 _stack
    00002400 __STACK_END
    0000f100 _ZN14PersistentTest7counterE
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的其他程序不是这种情况(它在.TI.persistent 段中具有变量、也位于0000f100):

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SECTION ALLOCATION MAP
    output attributes/
    section page origin length input sections
    -------- ---- ---------- ---------- ----------------
    .TI.persistent
    * 0 0000f100 00000011
    0000f100 00000010 main.obj (.TI.persistent:_ZN29_INTERNAL_8_main_cpp_183a4ba47Globals6alarmsE$0)
    0000f110 00000001 main.obj (.TI.persistent)
    ....lines removed....
    GLOBAL SYMBOLS: SORTED BY Symbol Address
    address name
    ------- ----
    000000a0 __STACK_SIZE
    ....lines removed....
    00002360 _stack
    00002400 __STACK_END
    0000f12e __TI_Handler_Table_Base
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    请注意、此程序使用 MCU 中的几乎所有 FRAM、优化级别设置为整个程序优化(4)、并且--opt_for_speed 设置为 size (0)。

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

    复位时、FRAM 受写保护。 要对其进行写入、您需要设置 SYSCFG0:PFWP=0 (然后在完成后将其设置回=1)。 [参考用户指南(SLAU445I)表1-24]

    下面的示例 msp430fr231x_framwrite.c 中说明了这一点:

    https://dev.ti.com/tirex/explore/node?node=A__AHbDS4Rv1nVVIcfPWJjnKg__msp430ware__IOGqZri__LATEST