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.

[参考译文] MSP432E401Y:软件复位时、RAM 会发生什么情况?

Guru**** 2562120 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/842657/msp432e401y-what-will-happen-to-ram-on-software-reset

器件型号:MSP432E401Y

您好!

在使用 SysCtlReset() API 进行软件复位时、MSP432E401Y 的 RAM 会发生什么情况?

谢谢  

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

    您好、迪卡尔、

    在软件复位期间、使用 SysCtlReset 不会复位 RAM。

    BR、

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

    你好、SEONG、

    您是否意味着先前分配的动态存储器未复位?

    如果是、则在器件复位时如何复位 RAM 存储器? 微控制器复位时、是否有任何其他擦除 RAM 的方法?

    谢谢、

    Dinkar

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

    迪卡尔

    是的。

    软件方面,您可以使用 memset()。

    BR、

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

    您好!

    好的,我使用 memset()重置内存。

    char * test = malloc (100);
    
    //假设在0x20007894上测试分配的内存块。 

    then ifi reset code usingSysCtlReset() API then can my code able to allocate newdynamic block on that location (0x20007894)?

    Thnaks

    dinkar

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

    您好 Dinkar、

    如果通过调用 SysCtlReset()来重置程序,则将分配给*test 的相同内存块。 这是因为一旦你从 main()运行 BIOS_start()函数,TIRTOS 将重新初始化自身并重置其整个状态,包括分配的堆内存的状态。 这与 RAM 状态是否被保留无关、因为默认情况下、您的所有代码都被放置在链接期间的闪存中。  

    鉴于编译器应仅使用 RAM 来临时存储数据、因此在代码复位时、RAM 是否处于非复位状态无关紧要。 RAM 用于为堆栈自动分配数据、当数据进入和退出范围时、程序会定期重复使用这些数据。 它还用于数据的动态分配、如上所述、这不需要 RAM 的状态完全清除、因为 RTOS 将重新初始化其堆存储器表。

    您可以通过在程序的 mainThread()中运行以下测试代码来自行测试此行为:

    //memory/reset 测试
    volatile int i =0;
    while (i=0);
    In*y;
    y =(易失性 int*)(0x20000000+0x00040000-250);
    * y = 0x3010;
    someHeap =(int*) malloc (400);
    while (i=0){
    
    }
    SysCtlReset(); 

    您需要像这样调整.cmd 文件中程序的内存映射、以确保完全安全:

    内存
    {
    闪存(RX):origin = 0x00000000,length = 0x00100000
    SRAM (rwx):origin = 0x20000000,length = 0x00040000-250
    SRAM_EX (Rwx):origin = 0x20000000+0x00040000-250,length = 250
    } 

    如果您运行该代码、则会在第一个 while (i=0)时卡住。 但是、在调试模式下、您可以将 PC 指向任何可执行指令、并且可以使用该功能跳过 while (i=0)循环。 如果您跳转到第二个部分、您将看到 RAM 被写入、并且 malloc 被调用以提供指向 someteHeap 的指针。 记录堆存储器地址以供参考后、您可以跳转至 SysCtlReset()调用。 这将使您返回到第一个 while 环路。 此时、您可以检查先前写入地址 y 的数据、以验证 RAM 是否未复位。 然后、如果你跳回到 malloc、你将观察到、尽管 RAM 被完全保留、RTOS 将为某些堆提供与第一次迭代预复位相同的内存块。

    如果您需要对上述解释进行更多的澄清,或者您对 SysCtlReset()有进一步的问题,请告诉我。

    此致、
    Michael