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.

[参考译文] MSP430F5172:在调试期间、寄存器改变值

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1038184/msp430f5172-during-debugging-registers-change-value

器件型号:MSP430F5172

你好

我的 msp430f5172微控制器有一些问题、我正在开发一个遥测应用、在该应用中、我将一些温度值发送​​到服务器(作为连接方式、我使用 wiznetw5100模块)、 但我已经尝试解决了几天的通信问题、但我仍然无法理解。

要存储服务器的响应、请求和我使用 char 类型向量的数据、例如:

char recibido [250];
volatile char token [160];
char petfinal [450];
const char peticion[17]=" HTTP/1.1\r\n 主机:";
const char agent [33]="User-Agent:gigawatt_firmwareV1.0";
const char authorization[14]="授权:";
const char content[30]="内容类型:application/json";
const char accept [11]="accept:*/*";
const char length[16]="内容长度:";

与 W5100通信的函数运行良好,因为我已经在其它应用程序中使用了它们,所以我遇到的问题是:

1) 1)​​一些变量的值会偶尔变化、我认为它与 RAM 存储器相关、因为在监视变量"peticion"时、它的值与我稍后使用的一些其他字符串相结合、例如、 我暂停了程序一段时间、在"Expressions"窗口中看到"peticion"的值位于" HTTP/1.1\asig IP "中、我想这是由将其与我用于器件配置菜单的文本组合而引起的。

2) 2)当我加载程序时、调试无法正确启动、将出现以下窗口:

就像程序在我没有给出"Run"按钮的情况下开始运行一样、为了正常工作、我必须选择"TI MSP430 USB1/MSP430 (Running)"并在离开屏幕的情况下按下"SUSPEND (暂停)"按钮、如下所示:

我在这里停留了一段时间、因为我不知道该怎么做、直到我发现通过将变量"count"的值更改为1、程序让我退出并继续执行代码。 为什么会发生这种情况? 这可能与我执行的测试相关、在循环中(while)、我在没有定义大小的情况下写入 char 类型矢量、直到超过2K 的 RAM 存储器?

现在、每当我加载程序时、我必须执行此操作才能运行、当我在没有调试连接的情况下打开器件时、它不会打开。

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

    1) 1) 此症状表明缓冲区溢出、超过一个数组的末尾、进入下一个数组。 有许多方法可以实现此目的;一些常见的方法是(a)使用 sprintf 而不是 snprintf (b)使用 strcpy/strcat、而不是使用 strncpy/strncat (c) memcpy 使用源长度而不是目标长度。 或者、您可能会有一个走得太远的环路。 错误放置的字节的值可能会提供线索。  

    您在帖子末尾描述的测试听起来可能具有破坏性。 您能进一步解释一下吗?

    2) 2)此症状表示您有足够的初始化数据、启动代码在完成初始化之前遇到看门狗超时。 尝试添加如下内容:

    int _system_pre_init(void) {
        WDTCTL = WDTPW | WDTHOLD; // Stop Watchdog
        return(1);                // Finish C initialization
    }

    这将在数据初始化之前停止看门狗计时器[参考 CC 用户指南(SLAU132X)第6.9.1]节。

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

    大家好、Bruce McKenney

     这种可能造成破坏的情况 类似于:

    char recibido[];
    unsigned int contador;
    unsigned int get_size;
    
    int main()
    {
        xxxxx...... more code
        
        for (contador=0;contador <get_size;contador++)
        {
           recibido[contador]=leer(contador);
        }
        
        xxxxx...... more code
    }

    我不记得确切的代码、因为我更改了它、但没有保存它。

    问题是计数器变量的值增加得太多(超过2500)、MSP430f5172的 RAM 为2K。 之后、我描述了无法启动程序的问题。

    我还想了解如何使编译器不以任何方式使用分配给某些变量的存储器空间、因为我无法避免某些数组被常量数据覆盖、 我稍后使用的字符串或其他数组。

    感谢您的合作。

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

    正如我所理解的(?)、您只运行了一次此程序(曾经)。 我不知道使用杂散写入造成永久损坏的方法;我希望您的程序使用 VMA 复位、可能会重复复位。 我认为这是巧合。

    您在(2)中显示的症状似乎足够清楚。 我的建议是否有帮助?

    我不确定您希望编译器提供哪种保护。 如果您希望一个(全局)变量为只读变量、通常通过将其放入闪存来将其声明为"const"来执行此操作。